diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 882acf789d..fc3f2852fc 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -6,15 +6,15 @@ #deathride58 /modular_citadel/ @deathride58 -/code/citadel/ @deathride58 #LetterJay /modular_citadel/code/modules/client/loadout/__donator.dm @LetterJay #Poojawa -/code/modules/vore @Poojawa -/code/citadel/dogborgstuff.dmm @Poojawa +/modular_citadel/code/modules/vore @Poojawa +/code/game/objects/items/devices/dogborg_sleeper.dm @Poojawa +/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @Poojawa /tgui/ @Poojawa /modular_citadel/code/modules/clothing/spacesuits/flightsuit.dm @Poojawa /modular_citadel/code/game/objects/ids.dm @Poojawa diff --git a/.gitignore b/.gitignore index 3b85a6ec30..b1cb02811c 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ *.lk *.int *.backup -*.int ### https://raw.github.com/github/gitignore/cc542de017c606138a87ee4880e5f06b3a306def/Global/Linux.gitignore *~ @@ -127,6 +126,9 @@ celerybeat-schedule venv/ ENV/ +# IntelliJ IDEA / PyCharm (with plugin) +.idea + # Spyder project settings .spyderproject diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt index 9f0f2c50c0..6e6bd7f7ca 100644 --- a/SQL/database_changelog.txt +++ b/SQL/database_changelog.txt @@ -1,16 +1,50 @@ Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255. -The latest database version is 4.0; The query to update the schema revision table is: +The latest database version is 4.1; The query to update the schema revision table is: -INSERT INTO `schema_revision` (`major`, `minor`) VALUES (4, 0); +INSERT INTO `schema_revision` (`major`, `minor`) VALUES (4, 1); or -INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (4, 0); +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (4, 1); In any query remember to add a prefix to the table names if you use one. ---------------------------------------------------- -12 November 2017, by Jordie0608 +Version 4.1, 3 February 2018, by Jordie0608 +Modified tables 'admin', 'admin_log' and 'admin_rank', removing unnecessary columns and adding support for excluding rights flags from admin ranks. +This change was made to enable use of sql-based admin loading. +To import your existing admins and ranks run the included script 'admin_import_2018-02-03.py', see the file for use instructions. +Legacy file-based admin loading is still supported, if you want to continue using it the script doesn't need to be run. + +ALTER TABLE `admin` + CHANGE COLUMN `rank` `rank` VARCHAR(32) NOT NULL AFTER `ckey`, + DROP COLUMN `id`, + DROP COLUMN `level`, + DROP COLUMN `flags`, + DROP COLUMN `email`, + DROP PRIMARY KEY, + ADD PRIMARY KEY (`ckey`); + +ALTER TABLE `admin_log` + CHANGE COLUMN `datetime` `datetime` DATETIME NOT NULL AFTER `id`, + CHANGE COLUMN `adminckey` `adminckey` VARCHAR(32) NOT NULL AFTER `datetime`, + CHANGE COLUMN `adminip` `adminip` INT(10) UNSIGNED NOT NULL AFTER `adminckey`, + ADD COLUMN `operation` ENUM('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL AFTER `adminip`, + CHANGE COLUMN `log` `log` VARCHAR(1000) NOT NULL AFTER `operation`; + +ALTER TABLE `admin_ranks` + CHANGE COLUMN `rank` `rank` VARCHAR(32) NOT NULL FIRST, + CHANGE COLUMN `flags` `flags` SMALLINT UNSIGNED NOT NULL AFTER `rank`, + ADD COLUMN `exclude_flags` SMALLINT UNSIGNED NOT NULL AFTER `flags`, + ADD COLUMN `can_edit_flags` SMALLINT(5) UNSIGNED NOT NULL AFTER `exclude_flags`, + DROP COLUMN `id`, + DROP PRIMARY KEY, + ADD PRIMARY KEY (`rank`); + + +---------------------------------------------------- + +Version 4.0, 12 November 2017, by Jordie0608 Modified feedback table to use json, a python script is used to migrate data to this new format. See the file 'feedback_conversion_2017-11-12.py' for instructions on how to use the script. @@ -29,7 +63,7 @@ CREATE TABLE `feedback` ( ---------------------------------------------------- -28 August 2017, by MrStonedOne +Version 3.4, 28 August 2017, by MrStonedOne Modified table 'messages', adding a deleted column and editing all indexes to include it ALTER TABLE `messages` @@ -43,7 +77,7 @@ ADD INDEX `idx_msg_type_ckey_time_odr` (`type`,`targetckey`,`timestamp`, `delete ---------------------------------------------------- -25 August 2017, by Jordie0608 +Version 3.3, 25 August 2017, by Jordie0608 Modified tables 'connection_log', 'legacy_population', 'library', 'messages' and 'player' to add additional 'round_id' tracking in various forms and 'server_ip' and 'server_port' to the table 'messages'. @@ -55,7 +89,7 @@ ALTER TABLE `player` ADD COLUMN `firstseen_round_id` INT(11) UNSIGNED NOT NULL A ---------------------------------------------------- -18 August 2017, by Cyberboss and nfreader +Version 3.2, 18 August 2017, by Cyberboss and nfreader Modified table 'death', adding the columns `last_words` and 'suicide'. @@ -67,7 +101,7 @@ Remember to add a prefix to the table name if you use them. ---------------------------------------------------- -20th July 2017, by Shadowlight213 +Version 3.1, 20th July 2017, by Shadowlight213 Added role_time table to track time spent playing departments. Also, added flags column to the player table. @@ -79,7 +113,7 @@ Remember to add a prefix to the table name if you use them. ---------------------------------------------------- -28 June 2017, by oranges +Version 3.0, 28 June 2017, by oranges Added schema_revision to store the current db revision, why start at 3.0? because: @@ -319,7 +353,7 @@ Remember to add prefix to the table name if you use them. Modified table 'memo', removing 'id' column and making 'ckey' primary. -ALTER TABLE `memo` DROP COLUMN `id`, DROP PRIMARY KEY, ADD PRIMARY KEY (`ckey`) +ALTER TABLE `memo` DROP COLUMN `id`, DROP PRIMARY KEY, ADD PRIMARY KEY (`ckey`) Remember to add prefix to the table name if you use them. diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index 8ec2fcfc41..ddd31a7e80 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -17,13 +17,9 @@ DROP TABLE IF EXISTS `admin`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `admin` ( - `id` int(11) NOT NULL AUTO_INCREMENT, `ckey` varchar(32) NOT NULL, - `rank` varchar(32) NOT NULL DEFAULT 'Administrator', - `level` int(2) NOT NULL DEFAULT '0', - `flags` int(16) NOT NULL DEFAULT '0', - `email` varchar(45) DEFAULT NULL, - PRIMARY KEY (`id`) + `rank` varchar(32) NOT NULL, + PRIMARY KEY (`ckey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; @@ -38,8 +34,9 @@ CREATE TABLE `admin_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `datetime` datetime NOT NULL, `adminckey` varchar(32) NOT NULL, - `adminip` varchar(18) NOT NULL, - `log` text NOT NULL, + `adminip` int(10) unsigned NOT NULL, + `operation` enum('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL, + `log` varchar(1000) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; @@ -52,11 +49,12 @@ DROP TABLE IF EXISTS `admin_ranks`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `admin_ranks` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `rank` varchar(40) NOT NULL, - `flags` int(16) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1; + `rank` varchar(32) NOT NULL, + `flags` smallint(5) unsigned NOT NULL, + `exclude_flags` smallint(5) unsigned NOT NULL, + `can_edit_flags` smallint(5) unsigned NOT NULL, + PRIMARY KEY (`rank`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -271,11 +269,11 @@ DROP TABLE IF EXISTS `role_time`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `role_time` +CREATE TABLE `role_time` ( `ckey` VARCHAR(32) NOT NULL , `job` VARCHAR(32) NOT NULL , `minutes` INT UNSIGNED NOT NULL, - PRIMARY KEY (`ckey`, `job`) + PRIMARY KEY (`ckey`, `job`) ) ENGINE = InnoDB; -- diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index 8bc768967d..01e0ed150b 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -17,13 +17,9 @@ DROP TABLE IF EXISTS `SS13_admin`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `SS13_admin` ( - `id` int(11) NOT NULL AUTO_INCREMENT, `ckey` varchar(32) NOT NULL, - `rank` varchar(32) NOT NULL DEFAULT 'Administrator', - `level` int(2) NOT NULL DEFAULT '0', - `flags` int(16) NOT NULL DEFAULT '0', - `email` varchar(45) DEFAULT NULL, - PRIMARY KEY (`id`) + `rank` varchar(32) NOT NULL, + PRIMARY KEY (`ckey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; @@ -38,8 +34,9 @@ CREATE TABLE `SS13_admin_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `datetime` datetime NOT NULL, `adminckey` varchar(32) NOT NULL, - `adminip` varchar(18) NOT NULL, - `log` text NOT NULL, + `adminip` int(10) unsigned NOT NULL, + `operation` enum('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL, + `log` varchar(1000) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; @@ -52,11 +49,12 @@ DROP TABLE IF EXISTS `SS13_admin_ranks`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `SS13_admin_ranks` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `rank` varchar(40) NOT NULL, - `flags` int(16) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1; + `rank` varchar(32) NOT NULL, + `flags` smallint(5) unsigned NOT NULL, + `exclude_flags` smallint(5) unsigned NOT NULL, + `can_edit_flags` smallint(5) unsigned NOT NULL, + PRIMARY KEY (`rank`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -271,11 +269,11 @@ DROP TABLE IF EXISTS `SS13_role_time`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `SS13_role_time` +CREATE TABLE `SS13_role_time` ( `ckey` VARCHAR(32) NOT NULL , `job` VARCHAR(32) NOT NULL , `minutes` INT UNSIGNED NOT NULL, - PRIMARY KEY (`ckey`, `job`) + PRIMARY KEY (`ckey`, `job`) ) ENGINE = InnoDB; -- diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm index 62485f8581..df9620cb67 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm @@ -24,7 +24,7 @@ /area/ruin/unpowered) "f" = ( /obj/structure/mirror{ - desc = "Oh no, seven years of bad luck!"; + desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!"; icon_state = "mirror_broke"; pixel_x = 28; broken = 1 @@ -56,6 +56,7 @@ /area/ruin/unpowered) "k" = ( /obj/structure/mirror{ + desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!"; icon_state = "mirror_broke"; pixel_y = 28; broken = 1 @@ -65,7 +66,7 @@ /area/ruin/unpowered) "l" = ( /obj/structure/mirror{ - desc = "Oh no, seven years of bad luck!"; + desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!"; icon_state = "mirror_broke"; pixel_x = 28; broken = 1 diff --git a/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm b/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm index 47e22f74ff..c8e9d3bb87 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm @@ -77,7 +77,7 @@ /area/ruin/space/abandoned_tele) "r" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plating/airless, /area/ruin/space/abandoned_tele) "s" = ( diff --git a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm new file mode 100644 index 0000000000..87f890e0d5 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm @@ -0,0 +1,503 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"c" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"d" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"e" = ( +/obj/machinery/defibrillator_mount/loaded, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"f" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"g" = ( +/obj/structure/table, +/obj/item/device/flashlight/lamp, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"h" = ( +/obj/structure/table, +/obj/item/pen, +/obj/item/paper/fluff/ruins/exp_cloning/log, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"i" = ( +/obj/machinery/dna_scannernew, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"j" = ( +/obj/machinery/computer/prototype_cloning, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/paper/fluff/ruins/exp_cloning/manual, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"k" = ( +/obj/machinery/clonepod/experimental, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"l" = ( +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"m" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"n" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"o" = ( +/obj/machinery/vending/snack/teal, +/turf/open/floor/plasteel/airless/floorgrime, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"p" = ( +/turf/open/floor/plasteel/airless/floorgrime, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"q" = ( +/obj/structure/sign/directions/science{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"r" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"s" = ( +/obj/machinery/iv_drip, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"t" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"u" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"v" = ( +/turf/open/floor/plasteel/whiteblue/corner{ + dir = 4 + }, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"w" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/plasteel/whiteblue/side{ + dir = 1 + }, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"x" = ( +/turf/open/floor/plasteel/whiteblue/side{ + dir = 1 + }, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"y" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/plasteel/whiteblue, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"z" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/whiteblue/corner{ + dir = 1 + }, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"A" = ( +/obj/structure/sign/departments/science, +/turf/closed/wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"B" = ( +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"C" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) +"D" = ( +/obj/structure/chair/comfy{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"E" = ( +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"F" = ( +/obj/machinery/door/airlock/research/glass, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"G" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"H" = ( +/obj/machinery/door/airlock/research/glass, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"I" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"J" = ( +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"K" = ( +/obj/machinery/door/airlock/research/glass, +/turf/open/floor/plasteel/airless, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"L" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg1" + }, +/area/space/nearstation) +"M" = ( +/obj/structure/fluff/broken_flooring{ + name = "broken plating"; + icon_state = "plating"; + dir = 8 + }, +/turf/template_noop, +/area/space/nearstation) +"N" = ( +/obj/item/book/random/triple, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"O" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/bookcase/random/fiction, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"P" = ( +/obj/structure/table/glass, +/obj/machinery/light, +/obj/structure/bedsheetbin, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"Q" = ( +/obj/structure/table/glass, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"R" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/regular, +/obj/item/device/healthanalyzer{ + desc = "A prototype hand-held body scanner able to distinguish vital signs of the subject."; + name = "prototype health analyzer" + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"S" = ( +/obj/structure/table/glass, +/obj/item/storage/box/syringes, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"T" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/powered/ancient_shuttle) +"U" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg2" + }, +/area/space/nearstation) +"V" = ( +/turf/closed/wall/r_wall/rust, +/area/space/nearstation) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +c +c +c +c +c +a +a +"} +(4,1,1) = {" +a +a +c +r +D +N +c +a +a +"} +(5,1,1) = {" +a +a +c +s +E +E +c +a +a +"} +(6,1,1) = {" +a +a +d +t +E +O +d +a +a +"} +(7,1,1) = {" +a +a +d +b +F +d +d +a +a +"} +(8,1,1) = {" +a +a +a +b +G +b +a +a +a +"} +(9,1,1) = {" +a +a +d +d +H +b +b +a +a +"} +(10,1,1) = {" +a +b +b +u +I +I +c +a +a +"} +(11,1,1) = {" +a +c +g +v +J +J +c +a +a +"} +(12,1,1) = {" +a +c +h +w +J +J +d +a +a +"} +(13,1,1) = {" +a +d +i +x +J +P +b +a +a +"} +(14,1,1) = {" +a +b +j +y +J +Q +c +a +a +"} +(15,1,1) = {" +a +b +k +x +J +R +c +a +a +"} +(16,1,1) = {" +a +e +l +x +J +S +d +a +a +"} +(17,1,1) = {" +a +d +m +z +J +J +d +a +a +"} +(18,1,1) = {" +a +d +n +A +K +T +b +a +a +"} +(19,1,1) = {" +a +f +o +B +p +C +V +a +a +"} +(20,1,1) = {" +a +f +p +p +C +U +M +a +a +"} +(21,1,1) = {" +a +d +q +C +L +M +a +a +a +"} +(22,1,1) = {" +a +a +b +f +M +a +a +a +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 9385abeda0..64664486dc 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -1840,12 +1840,12 @@ /turf/open/floor/plasteel/floorgrime, /area/ruin/space/has_grav/ancientstation/deltacorridor) "fu" = ( -/obj/machinery/rnd/protolathe, +/obj/machinery/rnd/production/protolathe, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/ancientstation/rnd) "fv" = ( -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /obj/effect/decal/cleanable/dirt, /obj/item/reagent_containers/dropper, /turf/open/floor/plasteel/white, diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index dd1a5a95dd..cd711dd7aa 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -2375,7 +2375,7 @@ /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/hotel/workroom) "hr" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/hotel/dock) "hs" = ( diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 1fe86123e9..0e451edcfb 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -4078,10 +4078,8 @@ pixel_x = 11 }, /obj/structure/mirror{ - desc = "Oh no, seven years of bad luck!"; icon_state = "mirror_broke"; - pixel_x = 28; - broken = 1 + pixel_x = 28 }, /turf/open/floor/plasteel/freezer{ heat_capacity = 1e+006 @@ -6091,7 +6089,7 @@ "mJ" = ( /obj/structure/sign/warning/vacuum{ desc = "A beacon used by a teleporter."; - icon = 'icons/obj/radio.dmi'; + icon = 'icons/obj/device.dmi'; icon_state = "beacon"; name = "tracking beacon" }, diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index 42c442d6f8..fb23a2c0b1 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -158,7 +158,7 @@ "az" = ( /obj/structure/sign/warning/vacuum{ desc = "A beacon used by a teleporter."; - icon = 'icons/obj/radio.dmi'; + icon = 'icons/obj/device.dmi'; icon_state = "beacon"; name = "tracking beacon" }, @@ -3397,7 +3397,7 @@ }, /area/awaymission/undergroundoutpost45/research) "hD" = ( -/obj/machinery/rnd/protolathe, +/obj/machinery/rnd/production/protolathe, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -3670,7 +3670,7 @@ }, /area/awaymission/undergroundoutpost45/research) "ii" = ( -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, diff --git a/_maps/cit_map_files/BoxStation/BoxStation.dmm b/_maps/cit_map_files/BoxStation/BoxStation.dmm index 11646eaa1a..92f72fd46a 100644 --- a/_maps/cit_map_files/BoxStation/BoxStation.dmm +++ b/_maps/cit_map_files/BoxStation/BoxStation.dmm @@ -78,7 +78,7 @@ /obj/item/device/plant_analyzer, /obj/machinery/camera{ c_tag = "Prison Common Room"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/green/side{ dir = 5 @@ -243,7 +243,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/open/space, -/area/space/nearstation) +/area/space) "aaU" = ( /obj/machinery/computer/arcade, /turf/open/floor/plasteel/floorgrime, @@ -758,8 +758,7 @@ }, /obj/machinery/camera{ c_tag = "Head of Security's Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/recharger{ pixel_y = 4 @@ -817,7 +816,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 3"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /obj/item/device/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; @@ -848,7 +847,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 2"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /obj/item/device/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; @@ -870,7 +869,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 1"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /obj/item/device/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; @@ -933,7 +932,6 @@ pixel_x = 3; pixel_y = -3 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/bot{ dir = 2 }, @@ -1605,7 +1603,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -1644,7 +1642,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -1652,7 +1650,7 @@ }, /obj/machinery/camera{ c_tag = "Prison Hallway"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/red/side{ dir = 1 @@ -1801,8 +1799,7 @@ "aeC" = ( /obj/machinery/camera{ c_tag = "Security Escape Pod"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/security/main) @@ -2441,10 +2438,6 @@ }, /turf/open/floor/plating, /area/security/main) -"agd" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) "agf" = ( /obj/structure/table, /obj/item/stack/sheet/metal, @@ -3441,8 +3434,7 @@ "aiq" = ( /obj/machinery/camera{ c_tag = "Security Office"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/computer/secure_data{ dir = 1 @@ -3865,7 +3857,7 @@ }, /obj/machinery/computer/security{ name = "Labor Camp Monitoring"; - network = list("Labor") + network = list("labor") }, /turf/open/floor/plasteel, /area/security/processing) @@ -4580,15 +4572,13 @@ /area/engine/atmos) "aln" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; name = "Labor Camp Shuttle Airlock"; - req_access_txt = "2"; - shuttledocked = 1 + req_access_txt = "2" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/security/processing) "alp" = ( /turf/open/floor/plating, @@ -5356,7 +5346,7 @@ /area/maintenance/fore/secondary) "anE" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; req_access_txt = "13" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -5395,17 +5385,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/fore) -"anN" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; - name = "Labor Camp Shuttle Airlock"; - shuttledocked = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/processing) "anO" = ( /obj/docking_port/stationary{ dir = 8; @@ -7388,7 +7367,7 @@ /obj/machinery/camera{ c_tag = "Auxillary Mining Base"; dir = 8; - network = list("SS13","AuxBase") + network = list("ss13","auxbase") }, /turf/open/floor/plating, /area/shuttle/auxillary_base) @@ -7673,8 +7652,7 @@ /obj/structure/table/wood, /obj/machinery/camera{ c_tag = "Law Office"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/item/paper_bin{ pixel_x = -3; @@ -7685,7 +7663,7 @@ desc = "Used for watching Prison Wing holding areas."; dir = 1; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = -27 }, /turf/open/floor/wood, @@ -8915,7 +8893,7 @@ desc = "Used for the Auxillary Mining Base."; dir = 8; name = "Auxillary Base Monitor"; - network = list("AuxBase"); + network = list("auxbase"); pixel_x = 28 }, /turf/open/floor/plasteel/yellow/side{ @@ -10504,8 +10482,7 @@ "aBh" = ( /obj/machinery/camera{ c_tag = "EVA Maintenance"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light/small{ dir = 4 @@ -10973,8 +10950,7 @@ "aCp" = ( /obj/machinery/camera{ c_tag = "Arrivals North"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/cable{ icon_state = "1-2" @@ -11963,8 +11939,7 @@ "aER" = ( /obj/machinery/camera{ c_tag = "Gateway"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/table, /obj/structure/sign/warning/biohazard{ @@ -12319,8 +12294,7 @@ "aFO" = ( /obj/machinery/camera{ c_tag = "Garden"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/airalarm{ dir = 8; @@ -12435,7 +12409,7 @@ /obj/machinery/camera/motion{ c_tag = "Vault"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/light, /turf/open/floor/plasteel/vault/corner{ @@ -12933,8 +12907,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/grimy, /area/chapel/office) @@ -13432,8 +13405,7 @@ /obj/structure/chair/office/dark, /obj/machinery/camera{ c_tag = "Library North"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -15079,8 +15051,7 @@ "aMM" = ( /obj/machinery/camera{ c_tag = "Chapel North"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/dark, /area/chapel/main) @@ -16856,8 +16827,7 @@ "aRP" = ( /obj/machinery/camera{ c_tag = "Library South"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/wood, /area/library) @@ -16972,8 +16942,7 @@ "aSf" = ( /obj/machinery/camera{ c_tag = "Arrivals Hallway"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -17276,8 +17245,7 @@ }, /obj/machinery/camera{ c_tag = "Bar"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/table, /obj/machinery/chem_dispenser/drinks, @@ -17465,8 +17433,7 @@ }, /obj/machinery/camera{ c_tag = "Locker Room East"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light{ dir = 4 @@ -17607,7 +17574,7 @@ /area/bridge) "aUd" = ( /obj/machinery/computer/security/mining{ - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /turf/open/floor/plasteel/brown{ dir = 6 @@ -17626,8 +17593,7 @@ }, /obj/machinery/camera{ c_tag = "Bar West"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) @@ -17756,8 +17722,7 @@ "aUy" = ( /obj/machinery/camera{ c_tag = "Vacant Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/wood, /area/security/vacantoffice) @@ -17843,8 +17808,7 @@ "aUM" = ( /obj/machinery/camera{ c_tag = "Arrivals Bay 2"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -18006,8 +17970,7 @@ }, /obj/machinery/camera{ c_tag = "Fore Primary Hallway"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/red/corner{ @@ -18336,8 +18299,7 @@ "aVV" = ( /obj/machinery/camera{ c_tag = "Chapel South"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/dark, /area/chapel/main) @@ -19613,8 +19575,7 @@ "aYT" = ( /obj/machinery/camera{ c_tag = "Hydroponics South"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel, @@ -19739,8 +19700,7 @@ "aZm" = ( /obj/machinery/camera{ c_tag = "Escape Arm Airlocks"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -20486,8 +20446,7 @@ "bbr" = ( /obj/machinery/camera{ c_tag = "Locker Room South"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -20554,8 +20513,7 @@ "bbA" = ( /obj/machinery/camera{ c_tag = "Starboard Primary Hallway 2"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/white/corner{ dir = 1 @@ -20846,8 +20804,7 @@ "bcr" = ( /obj/machinery/camera{ c_tag = "Starboard Primary Hallway"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) @@ -20884,8 +20841,7 @@ "bcx" = ( /obj/machinery/camera{ c_tag = "Starboard Primary Hallway 5"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) @@ -21155,8 +21111,7 @@ "bdn" = ( /obj/machinery/camera{ c_tag = "Central Hallway East"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/disposalpipe/segment, /obj/machinery/status_display{ @@ -22443,8 +22398,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo Delivery Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/requests_console{ department = "Cargo Bay"; @@ -22628,8 +22582,7 @@ "bhc" = ( /obj/machinery/camera{ c_tag = "Chemistry"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/firealarm{ dir = 2; @@ -22668,8 +22621,7 @@ "bhj" = ( /obj/machinery/camera{ c_tag = "Security Post - Medbay"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/requests_console{ department = "Security"; @@ -23335,7 +23287,7 @@ /obj/machinery/camera{ c_tag = "Robotics Lab"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/button/door{ dir = 2; @@ -23377,8 +23329,7 @@ "biS" = ( /obj/machinery/camera{ c_tag = "Research Division Access"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/sink{ dir = 4; @@ -23417,7 +23368,7 @@ /obj/machinery/camera{ c_tag = "Research and Development"; dir = 2; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_x = 22 }, /obj/machinery/button/door{ @@ -23657,8 +23608,7 @@ "bjy" = ( /obj/machinery/camera{ c_tag = "Gravity Generator Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -23858,8 +23808,7 @@ "bkb" = ( /obj/machinery/camera{ c_tag = "Medbay Morgue"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/airalarm{ dir = 8; @@ -24384,8 +24333,7 @@ /obj/structure/table/reinforced, /obj/machinery/camera{ c_tag = "Medbay Foyer"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/cell_charger, /turf/open/floor/plasteel/white, @@ -25488,7 +25436,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/machinery/disposal/bin, @@ -26785,8 +26733,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay West"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -27065,7 +27012,7 @@ /obj/machinery/camera{ c_tag = "Experimentor Lab"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/item/hand_labeler, /obj/item/stack/packageWrap, @@ -27194,8 +27141,7 @@ /obj/item/device/multitool, /obj/machinery/camera{ c_tag = "Cargo Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/office) @@ -27473,7 +27419,6 @@ /obj/machinery/camera{ c_tag = "Medbay East"; dir = 8; - network = list("SS13"); pixel_y = -22 }, /turf/open/floor/plasteel/white, @@ -27654,7 +27599,7 @@ /obj/machinery/camera{ c_tag = "Robotics Lab - South"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/robotics/lab) @@ -27935,8 +27880,7 @@ "btA" = ( /obj/machinery/camera{ c_tag = "Research Division West"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -28796,7 +28740,7 @@ /obj/machinery/camera{ c_tag = "Genetics Research"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/firealarm{ dir = 1; @@ -28831,7 +28775,6 @@ /obj/machinery/camera{ c_tag = "Genetics Access"; dir = 8; - network = list("SS13"); pixel_y = -22 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -29065,8 +29008,7 @@ "bwf" = ( /obj/machinery/camera{ c_tag = "Cargo Bay Entrance"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/brown/corner{ @@ -29288,8 +29230,7 @@ /obj/structure/table/glass, /obj/machinery/camera{ c_tag = "Medbay Cryogenics"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/item/reagent_containers/glass/beaker/cryoxadone, /obj/item/reagent_containers/glass/beaker/cryoxadone, @@ -29307,8 +29248,7 @@ "bwL" = ( /obj/machinery/camera{ c_tag = "Genetics Cloning"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/table, /obj/machinery/firealarm{ @@ -29563,7 +29503,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; name = "Research Monitor"; - network = list("RD","MiniSat"); + network = list("rd","minisat"); pixel_y = 2 }, /obj/structure/table, @@ -30206,7 +30146,7 @@ }, /obj/machinery/computer/security/mining{ dir = 8; - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -30503,7 +30443,7 @@ /obj/machinery/camera{ c_tag = "Server Room"; dir = 2; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_x = 22 }, /obj/machinery/power/apc{ @@ -30558,7 +30498,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of your own office."; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -30879,8 +30819,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Treatment Center"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel, /area/medical/sleeper) @@ -30983,7 +30922,7 @@ /obj/machinery/camera{ c_tag = "Security Post - Science"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/newscaster{ pixel_x = -30 @@ -31100,7 +31039,7 @@ "bAS" = ( /obj/machinery/computer/security/mining{ dir = 4; - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /obj/machinery/camera{ c_tag = "Quartermaster's Office"; @@ -31671,7 +31610,7 @@ /obj/machinery/camera{ c_tag = "Research Director's Office"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/item/device/radio/intercom{ name = "Station Intercom (General)"; @@ -31708,7 +31647,7 @@ /obj/machinery/camera{ c_tag = "Experimentor Lab Chamber"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light, /obj/structure/sign/warning/nosmoking{ @@ -31915,8 +31854,7 @@ /obj/structure/closet/secure_closet/medical3, /obj/machinery/camera{ c_tag = "Medbay Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/white, /area/medical/sleeper) @@ -31998,8 +31936,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay South"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -32291,8 +32228,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/iv_drip, /turf/open/floor/plasteel/white, @@ -32538,7 +32474,6 @@ /obj/machinery/camera{ c_tag = "Chief Medical Office"; dir = 8; - network = list("SS13"); pixel_y = -22 }, /turf/open/floor/plasteel/barber, @@ -32550,7 +32485,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Test Chamber"; dir = 2; - network = list("Xeno","RD") + network = list("xeno","rd") }, /obj/machinery/light{ dir = 1 @@ -32641,7 +32576,7 @@ /obj/machinery/camera{ c_tag = "Toxins Lab West"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -32751,12 +32686,11 @@ /area/maintenance/port/fore) "bEK" = ( /obj/machinery/computer/security/mining{ - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /obj/machinery/camera{ c_tag = "Mining Dock"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) @@ -33293,7 +33227,7 @@ /turf/open/floor/plating, /area/science/mixing) "bGd" = ( -/obj/machinery/doppler_array{ +/obj/machinery/doppler_array/research/science{ dir = 4 }, /obj/effect/turf_decal/bot{ @@ -33737,7 +33671,7 @@ /obj/machinery/camera{ c_tag = "Toxins Storage"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/floorgrime, /area/science/storage) @@ -33872,7 +33806,7 @@ dir = 8; layer = 4; name = "Test Chamber Telescreen"; - network = list("Toxins"); + network = list("toxins"); pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ @@ -33991,8 +33925,7 @@ "bHL" = ( /obj/machinery/camera{ c_tag = "Research Division South"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/plasteel/white/side{ @@ -34036,8 +33969,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/camera{ c_tag = "Aft Primary Hallway 2"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/caution/corner{ @@ -34134,7 +34066,6 @@ /obj/machinery/camera{ c_tag = "Surgery Operating"; dir = 1; - network = list("SS13"); pixel_x = 22 }, /obj/machinery/light, @@ -34512,13 +34443,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"bIP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair/comfy/black, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bIQ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -35522,7 +35446,7 @@ "bKY" = ( /obj/machinery/computer/security/telescreen{ name = "Test Chamber Monitor"; - network = list("Xeno"); + network = list("xeno"); pixel_y = 2 }, /obj/structure/table/reinforced, @@ -35686,7 +35610,7 @@ invuln = 1; light = null; name = "Hardened Bomb-Test Camera"; - network = list("Toxins"); + network = list("toxins"); use_power = 0 }, /obj/item/target/alien/anchored, @@ -36533,7 +36457,7 @@ /obj/machinery/camera{ c_tag = "Toxins Lab East"; dir = 8; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_y = -22 }, /obj/effect/turf_decal/stripes/line{ @@ -36663,8 +36587,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics Monitoring"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/light{ dir = 4 @@ -36683,8 +36606,7 @@ "bNT" = ( /obj/machinery/camera{ c_tag = "Atmospherics North West"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -36833,8 +36755,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Virology Airlock"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -37750,8 +37671,7 @@ "bQq" = ( /obj/machinery/camera{ c_tag = "Security Post - Engineering"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/item/device/radio/intercom{ dir = 4; @@ -37924,7 +37844,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology North"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -37961,7 +37881,7 @@ /obj/machinery/camera{ c_tag = "Testing Lab North"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel, /area/science/misc_lab) @@ -38009,7 +37929,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 2; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = 28 }, /obj/item/device/integrated_circuit_printer, @@ -38134,7 +38054,7 @@ dir = 8; layer = 4; name = "Engine Monitor"; - network = list("Engine"); + network = list("singularity"); pixel_x = 30 }, /turf/open/floor/plasteel/red/side{ @@ -38560,8 +38480,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Telecomms Monitoring"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -38903,7 +38822,7 @@ /obj/item/crowbar, /obj/machinery/computer/security/telescreen{ name = "Test Chamber Monitor"; - network = list("Test"); + network = list("test"); pixel_y = -30 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, @@ -39941,8 +39860,7 @@ "bVN" = ( /obj/machinery/camera{ c_tag = "Atmospherics Access"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -40367,8 +40285,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics West"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/cable{ icon_state = "1-2" @@ -40397,9 +40314,6 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bWV" = ( @@ -40640,11 +40554,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/circuit) -"bXu" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "bXv" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -40828,8 +40737,7 @@ "bXV" = ( /obj/machinery/camera{ c_tag = "Atmospherics East"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -41237,7 +41145,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology South"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/xenobiology) @@ -41881,8 +41789,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics Central"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/components/binary/pump{ dir = 0; @@ -42184,8 +42091,7 @@ "cbl" = ( /obj/machinery/camera{ c_tag = "Telecomms Server Room"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) @@ -42267,7 +42173,6 @@ /obj/machinery/camera{ c_tag = "Aft Primary Hallway 1"; dir = 8; - network = list("SS13"); pixel_y = -22 }, /turf/open/floor/plasteel/yellow/corner{ @@ -42499,7 +42404,7 @@ /obj/machinery/camera{ c_tag = "Testing Chamber"; dir = 1; - network = list("Test","RD") + network = list("test","rd") }, /obj/machinery/light, /turf/open/floor/engine, @@ -42537,7 +42442,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 1; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = -28 }, /obj/item/device/integrated_circuit_printer, @@ -42870,14 +42775,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"ccP" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"ccQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/xenobiology) "ccR" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/bot{ @@ -43473,8 +43370,7 @@ "cex" = ( /obj/machinery/camera{ c_tag = "Atmospherics South West"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -43784,20 +43680,6 @@ /obj/item/caution, /turf/open/floor/plating, /area/maintenance/aft) -"cfr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 2; - external_pressure_bound = 140; - pressure_checks = 0; - name = "killroom vent" - }, -/obj/machinery/camera{ - c_tag = "Xenobiology Kill Room"; - dir = 4; - network = list("SS13","RD") - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cfs" = ( /obj/machinery/door/airlock/maintenance/abandoned{ name = "Air Supply Maintenance"; @@ -43835,15 +43717,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/maintenance/solars/port/aft) -"cfy" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cfz" = ( /obj/structure/cable{ icon_state = "4-8" @@ -43895,16 +43768,6 @@ dir = 5 }, /area/crew_quarters/heads/chief) -"cfI" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/yellow/side{ - dir = 4 - }, -/area/engine/engineering) "cfJ" = ( /obj/machinery/light/small{ dir = 1 @@ -44089,9 +43952,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"cgi" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cgj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/barricade/wooden, @@ -44100,11 +43960,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cgk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/biohazard, -/turf/open/floor/plating, -/area/science/xenobiology) "cgl" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ dir = 2; @@ -44122,17 +43977,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cgn" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - target_temperature = 80; - dir = 2; - on = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cgo" = ( /obj/structure/cable{ icon_state = "4-8" @@ -44207,13 +44051,13 @@ /area/engine/engineering) "cgw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cgx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/closed/wall/r_wall, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cgy" = ( /obj/machinery/light/small{ @@ -44283,32 +44127,22 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cgI" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "cgJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cgK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"cgL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cgO" = ( /obj/structure/rack, @@ -44322,17 +44156,6 @@ dir = 5 }, /area/crew_quarters/heads/chief) -"cgQ" = ( -/obj/machinery/camera{ - c_tag = "Engineering East"; - dir = 8; - network = list("SS13") - }, -/obj/structure/closet/wardrobe/engineering_yellow, -/turf/open/floor/plasteel/yellow/corner{ - dir = 4 - }, -/area/engine/engineering) "cgR" = ( /turf/open/floor/plasteel, /area/engine/engineering) @@ -44531,13 +44354,6 @@ }, /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) -"cho" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "chp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44547,44 +44363,11 @@ }, /turf/closed/wall, /area/maintenance/starboard/aft) -"chq" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"chr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Kill Chamber"; - req_access_txt = "55" - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/xenobiology) "chs" = ( /obj/machinery/light, /obj/machinery/atmospherics/pipe/manifold/general/visible, /turf/open/floor/circuit/killroom, /area/science/xenobiology) -"cht" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"chu" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "chv" = ( /obj/structure/cable{ icon_state = "1-4" @@ -44693,25 +44476,24 @@ /turf/open/floor/plasteel, /area/engine/engineering) "chF" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/office/dark{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "chG" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "chH" = ( /obj/structure/closet/firecloset, @@ -44809,35 +44591,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"chV" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5 - }, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/glasses/meson/engine, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "chX" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/turf/open/floor/engine, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "chY" = ( /obj/machinery/shieldgen, @@ -44921,24 +44683,6 @@ "cig" = ( /turf/closed/wall, /area/engine/engineering) -"cii" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/device/geiger_counter, -/obj/item/device/geiger_counter, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cij" = ( /obj/machinery/modular_computer/console/preset/engineering, /obj/structure/cable{ @@ -44976,15 +44720,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) -"cip" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) "ciq" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -44994,13 +44729,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/chief) -"cir" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "cis" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, @@ -45128,7 +44856,7 @@ /obj/machinery/camera{ c_tag = "Turbine Chamber"; dir = 4; - network = list("Turbine") + network = list("turbine") }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) @@ -45141,14 +44869,18 @@ /turf/open/floor/plasteel, /area/engine/engineering) "ciO" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/engineering_singularity_safety{ + pixel_x = 3; + pixel_y = 3 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/engineering_particle_accelerator{ + pixel_x = -3; + pixel_y = -3 }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/turf/open/floor/plasteel, /area/engine/engineering) "ciP" = ( /obj/structure/cable{ @@ -45286,17 +45018,10 @@ }, /obj/machinery/camera{ c_tag = "Chief Engineer's Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/vault, /area/crew_quarters/heads/chief) -"cjh" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cji" = ( /obj/structure/cable{ icon_state = "1-2" @@ -45335,8 +45060,7 @@ "cjl" = ( /obj/machinery/camera{ c_tag = "Engineering MiniSat Access"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -45432,18 +45156,6 @@ /obj/item/cigbutt/roach, /turf/open/floor/plating, /area/maintenance/aft) -"cjB" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/structure/table, -/obj/item/folder/white, -/obj/item/pen, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cjC" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -45515,8 +45227,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Secure Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/engine/engineering) @@ -45531,7 +45242,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 6 + }, /area/engine/engineering) "cjP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -45552,7 +45265,7 @@ req_access = null; req_access_txt = "10;13" }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/engine/engineering) "cjS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -45574,7 +45287,7 @@ desc = "Used for watching the RD's goons from the safety of your own office."; dir = 4; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_x = -24 }, /turf/open/floor/plasteel/vault, @@ -45719,11 +45432,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/aft) -"ckn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/science/xenobiology) "cko" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -46197,8 +45905,7 @@ /obj/structure/chair/stool, /obj/machinery/camera{ c_tag = "Aft Starboard Solar Control"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) @@ -46759,8 +46466,7 @@ }, /obj/machinery/camera{ c_tag = "SMES Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, @@ -46788,8 +46494,7 @@ "cnt" = ( /obj/machinery/camera{ c_tag = "Engineering West"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/cable{ icon_state = "1-2" @@ -46805,16 +46510,11 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cnx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/chair/sofa/left{ + icon_state = "sofaend_left"; dir = 4 }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cny" = ( /obj/effect/landmark/start/station_engineer, @@ -46999,8 +46699,7 @@ }, /obj/machinery/camera{ c_tag = "SMES Access"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -47049,15 +46748,12 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cnZ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/airalarm{ - pixel_y = 23 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "coa" = ( @@ -47071,25 +46767,32 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cob" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" }, /turf/open/floor/plasteel, /area/engine/engineering) "coc" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" +/obj/structure/table, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/electronics/apc, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/engine, +/obj/item/stack/cable_coil, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cop" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ @@ -47258,38 +46961,27 @@ /turf/open/floor/plasteel, /area/engine/engineering) "coK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"coL" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"coM" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, +/obj/structure/chair/office/dark, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, +/area/engine/engineering) +"coL" = ( +/obj/structure/chair/office/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "coS" = ( /obj/structure/rack, @@ -47455,50 +47147,37 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cpt" = ( -/obj/structure/table, +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, +/area/engine/engineering) +"cpu" = ( +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_construction, /obj/item/clothing/gloves/color/yellow, -/obj/item/storage/toolbox/electrical{ - pixel_y = 5 +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table/glass, +/obj/item/device/flashlight, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cpx" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/engineering) -"cpu" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpv" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpx" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) "cpy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, +/obj/structure/sign/warning/radiation/rad_area, +/turf/closed/wall/r_wall, /area/engine/engineering) "cpA" = ( /obj/structure/chair/office/dark{ @@ -47513,19 +47192,17 @@ /turf/open/floor/plasteel, /area/bridge) "cpD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/closet/secure_closet/engineering_welding, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cpE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cpG" = ( /obj/structure/table/optable, @@ -47660,8 +47337,7 @@ "cpV" = ( /obj/machinery/camera{ c_tag = "Engineering Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/rnd/protolathe/department/engineering, /turf/open/floor/plasteel, @@ -47683,133 +47359,72 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cpZ" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 5 - }, -/obj/item/device/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/device/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cqa" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cqb" = ( +/obj/structure/table, +/obj/machinery/cell_charger, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) -"cqc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"cqb" = ( +/obj/structure/chair/sofa/right{ + icon_state = "sofaend_right"; + dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cqd" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/green/visible{ +/obj/structure/closet/radiation, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqe" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 6 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cqf" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "cqg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Filter"; - on = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, /obj/machinery/camera{ - c_tag = "Engineering Supermatter Fore"; - dir = 1; - network = list("SS13","Engine"); + c_tag = "Engineering Center"; + dir = 2; + network = list("ss13","engine"); pixel_x = 23 }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ +/obj/machinery/light{ dir = 1 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqi" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqj" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_y = -24; - req_access_txt = "10" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cql" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, +"cqh" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cqm" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +"cqi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/machinery/meter, -/turf/open/floor/plasteel, +/turf/open/floor/plating, +/area/engine/engineering) +"cqj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, /area/engine/engineering) "cqn" = ( /obj/structure/grille, @@ -47827,8 +47442,7 @@ "cqp" = ( /obj/machinery/camera{ c_tag = "Engineering Escape Pod"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/engine/engineering) @@ -47906,54 +47520,39 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cqA" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_access = null; - req_access_txt = "10;13" +"cqC" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cqD" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plating, /area/engine/engineering) -"cqB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cqE" = ( +/obj/structure/particle_accelerator/end_cap, +/turf/open/floor/plating, +/area/engine/engineering) +"cqF" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, /area/engine/engineering) -"cqC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqD" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cqE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/engine, -/area/engine/supermatter) -"cqF" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "cqG" = ( /obj/structure/rack, /obj/item/storage/box/rubbershot{ @@ -48041,70 +47640,49 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cqS" = ( -/obj/machinery/light/small{ - dir = 8 +/turf/open/floor/plasteel/yellow/side{ + dir = 10 }, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/plating, /area/engine/engineering) "cqT" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cqU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = 25; + req_access_txt = "11" }, -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cqY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/engineering) "cqZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"cra" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Filter" - }, -/obj/machinery/airalarm/engine{ - dir = 4; - pixel_x = -23 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"crb" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - icon_state = "pump_map"; - name = "Gas to Chamber" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"crc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, +/obj/structure/particle_accelerator/fuel_chamber, +/turf/open/floor/plating, /area/engine/engineering) -"crd" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" +"cra" = ( +/obj/machinery/particle_accelerator/control_box, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/engine/engineering) +"crb" = ( +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plating, +/area/engine/engineering) +"crc" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Starboard Fore"; + dir = 2; + network = list("engine") }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "crh" = ( /obj/effect/turf_decal/stripes/line{ @@ -48167,40 +47745,38 @@ /turf/open/floor/plating, /area/engine/engineering) "crs" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/crowbar, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "crt" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/structure/particle_accelerator/power_box, +/turf/open/floor/plating, +/area/engine/engineering) "cru" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crv" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/item/screwdriver, +/turf/open/floor/plating, +/area/engine/engineering) "crw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, /area/engine/engineering) "cry" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -48288,43 +47864,34 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/aft) -"crH" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) "crI" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crK" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/turf/closed/wall/r_wall, +/obj/structure/chair/stool, +/turf/open/floor/plating, /area/engine/engineering) -"crL" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 +"crJ" = ( +/obj/machinery/light/small{ + dir = 8; + light_color = "#fff4bc" }, -/turf/open/floor/plasteel/dark, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"crK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, /area/engine/engineering) "crM" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 +/obj/machinery/light/small{ + dir = 4; + light_color = "#fff4bc" }, -/turf/open/floor/plasteel/dark, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, /area/engine/engineering) "crP" = ( /obj/machinery/light, @@ -48337,25 +47904,12 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"crT" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crU" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) "crV" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "crW" = ( /obj/machinery/light/small{ @@ -48375,38 +47929,29 @@ /obj/structure/transit_tube, /turf/open/floor/plating, /area/engine/engineering) -"crZ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "csa" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "csb" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "csc" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/space, /area/maintenance/aft) "csd" = ( -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cse" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "csg" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -48425,13 +47970,6 @@ }, /turf/open/space, /area/space/nearstation) -"csj" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering) "csk" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating/airless, @@ -48462,7 +48000,7 @@ desc = "Used for watching the turbine vent."; dir = 1; name = "turbine vent monitor"; - network = list("Turbine"); + network = list("turbine"); pixel_y = -29 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -48492,26 +48030,22 @@ /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) "css" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) -"csu" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"csv" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "csx" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) "csy" = ( /obj/structure/table, /obj/item/weldingtool, @@ -48520,19 +48054,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"csA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "csD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -48544,24 +48065,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/aft) -"csH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"csI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "csM" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible, @@ -48579,27 +48082,9 @@ /area/ai_monitored/turret_protected/aisat_interior) "csP" = ( /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 1 }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"csR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "csT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -48696,7 +48181,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Pod Access"; dir = 1; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, @@ -48978,7 +48463,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Teleporter"; dir = 1; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -49033,7 +48518,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Foyer"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) @@ -49213,7 +48698,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Atmospherics"; dir = 4; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/airalarm{ @@ -49253,7 +48738,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Antechamber"; dir = 4; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/turretid{ @@ -49342,7 +48827,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Service Bay"; dir = 8; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/airalarm{ @@ -49772,7 +49257,7 @@ /obj/machinery/camera{ c_tag = "MiniSat External NorthWest"; dir = 8; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /turf/open/space, @@ -49819,7 +49304,7 @@ /obj/machinery/camera{ c_tag = "MiniSat External NorthEast"; dir = 4; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /turf/open/space, @@ -49835,7 +49320,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Core Hallway"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/firealarm{ dir = 8; @@ -50213,7 +49698,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber North"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) @@ -50336,7 +49821,7 @@ /area/shuttle/pod_1) "cxG" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; name = "Escape Pod Three"; req_access_txt = "0" }, @@ -50346,15 +49831,21 @@ /turf/open/floor/plating, /area/security/main) "cxJ" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 8; +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ name = "Labor Camp Shuttle Airlock"; req_access_txt = "2" }, +/obj/machinery/button/door{ + id = "prison release"; + name = "Labor Camp Shuttle Lockdown"; + pixel_y = -25; + req_access_txt = "2" + }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/security/processing) "cxN" = ( /obj/structure/cable{ @@ -50370,16 +49861,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) -"cxP" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 8; - name = "Labor Camp Shuttle Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/processing) "cxR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, @@ -50507,6 +49988,15 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"cyA" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "cyC" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -50629,18 +50119,14 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"czE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "czF" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/meter, -/turf/open/floor/plasteel/dark, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plating, /area/engine/engineering) "czG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -50722,11 +50208,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) -"czQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "czR" = ( /obj/structure/cable{ icon_state = "1-2" @@ -50874,97 +50355,40 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cAl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cAm" = ( +/obj/item/wirecutters, /obj/structure/cable/yellow{ - icon_state = "1-4" + icon_state = "2-8" }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) +"cAo" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cAm" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) -"cAo" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAp" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Cooling Loop to Gas"; - on = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAr" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Gas to Mix"; - on = 0 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAu" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 - }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAy" = ( /obj/structure/closet/secure_closet/freezer/kitchen/maintenance, @@ -51079,9 +50503,17 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "cAP" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = 25; + req_access_txt = "11" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "cAQ" = ( /obj/structure/chair, /turf/open/floor/plating, @@ -51147,7 +50579,7 @@ /obj/machinery/camera{ c_tag = "MiniSat External SouthWest"; dir = 8; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /turf/open/space, @@ -51182,7 +50614,7 @@ /obj/machinery/camera{ c_tag = "MiniSat External SouthEast"; dir = 4; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /turf/open/space, @@ -51212,7 +50644,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber South"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) @@ -51244,7 +50676,7 @@ /obj/machinery/camera{ c_tag = "MiniSat External South"; dir = 2; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /turf/open/space, @@ -51290,8 +50722,7 @@ "cBn" = ( /obj/machinery/camera{ c_tag = "Locker Room Toilets"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/freezer, @@ -51496,10 +50927,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cBS" = ( /obj/structure/cable{ @@ -51675,89 +51103,6 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) -"cCB" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCC" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCD" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine"; - on = 0 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCE" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCF" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"cCG" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"cCH" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCI" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCP" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"cCQ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"cCS" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "cCT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -51777,77 +51122,33 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cDe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/closet/radiation, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) -"cDg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cDh" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/device/flashlight, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/pipe_dispenser, -/turf/open/floor/engine, -/area/engine/engineering) -"cDi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDj" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "cDk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cDl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -51864,90 +51165,39 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cDo" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/pen, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, +/obj/item/paper_bin{ + layer = 2.9 + }, +/obj/structure/table/glass, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cDt" = ( +/obj/structure/table, +/obj/item/twohanded/rcl/pre_loaded, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cDw" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plasteel, /area/engine/engineering) -"cDp" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDs" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDv" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cDx" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/chair/sofa{ + icon_state = "sofamiddle"; + dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Atmos to Loop"; - on = 0 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cDy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDz" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, /turf/open/floor/plasteel, /area/engine/engineering) "cDB" = ( @@ -51957,102 +51207,23 @@ /obj/effect/landmark/start/station_engineer, /turf/open/floor/plasteel, /area/engine/engineering) -"cDC" = ( -/obj/item/wrench, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDD" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDE" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "cDF" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cDH" = ( -/obj/structure/rack, -/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 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDI" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "cDK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ +/turf/open/floor/plasteel/yellow/side{ dir = 4 }, -/turf/open/floor/plasteel, /area/engine/engineering) -"cDL" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cDN" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/closed/wall, -/area/engine/engineering) -"cDY" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ +"cDO" = ( +/obj/effect/turf_decal/stripes/line{ dir = 9 }, -/turf/open/space, +/turf/open/floor/plating/airless, /area/space/nearstation) "cDZ" = ( /obj/structure/cable{ @@ -52062,824 +51233,139 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cEa" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cEd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Port"; - dir = 4; - network = list("SS13","Engine") - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) -"cEe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEf" = ( -/obj/machinery/ai_status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cEg" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cEh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Starboard"; - dir = 8; - network = list("SS13","Engine") - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEk" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cEl" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "cEm" = ( /obj/machinery/vending/autodrobe, /turf/open/floor/wood, /area/maintenance/bar) -"cEr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cEs" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Cooling Loop"; - on = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEt" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEu" = ( -/obj/machinery/camera{ - c_tag = "Supermatter Chamber"; - dir = 2; - network = list("Engine"); - pixel_x = 23 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEv" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEy" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEz" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEC" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Gas"; - on = 0 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cED" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEE" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"cEK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cEL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEM" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/engine/supermatter) -"cET" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEW" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/turf/open/floor/engine, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cFc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cEv" = ( /obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - icon_state = "pump_map"; - name = "Cooling Loop Bypass" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cFh" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cFj" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" + icon_state = "1-2" }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plating, -/area/engine/supermatter) -"cFk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix Bypass" - }, -/turf/open/floor/engine, /area/engine/engineering) -"cFm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cFn" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +"cEw" = ( +/obj/structure/particle_accelerator/particle_emitter/left, +/turf/open/floor/plating, +/area/engine/engineering) +"cEx" = ( +/obj/structure/particle_accelerator/particle_emitter/right, +/turf/open/floor/plating, +/area/engine/engineering) +"cEy" = ( +/obj/effect/turf_decal/stripes/line{ dir = 6 }, -/turf/open/space, -/area/space/nearstation) -"cFo" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cFu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cFw" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cFy" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +"cEK" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/floor/engine, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access = null; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, /area/engine/engineering) -"cFz" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +"cFb" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Port Fore"; + dir = 2; + network = list("engine") }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cFA" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel/dark, +"cFn" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "cFI" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cFK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/field/generator{ + anchored = 1; + state = 2 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Aft"; - dir = 2; - network = list("SS13","Engine"); - pixel_x = 23 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFT" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "cFU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGd" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGe" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGf" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8; - filter_type = "n2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGg" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGh" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine, -/area/engine/engineering) -"cGi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/engine, -/area/engine/engineering) -"cGj" = ( -/obj/structure/table, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGk" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGl" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGt" = ( -/obj/structure/closet/wardrobe/engineering_yellow, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, -/obj/machinery/meter, -/turf/open/floor/engine, -/area/engine/engineering) -"cGC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "Output Release"; - open = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGE" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGH" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGI" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGK" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cGR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGS" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGT" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGU" = ( -/obj/structure/reflector/double/anchored{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGV" = ( -/obj/structure/reflector/box/anchored{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGZ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1; - volume_rate = 200 - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cHa" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHb" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHc" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHd" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHe" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHg" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHj" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/power/emitter/anchored{ dir = 8; state = 2 }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHn" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-4" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cHo" = ( -/obj/structure/reflector/single/anchored{ - dir = 9 +"cGh" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHp" = ( -/obj/structure/reflector/single/anchored{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHr" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "1-8" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGr" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGE" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cGV" = ( +/obj/machinery/the_singularitygen/tesla, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cGZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, /area/engine/engineering) "cHD" = ( /obj/structure/cable{ @@ -53218,8 +51704,13 @@ /turf/open/floor/plating, /area/security/brig) "cMm" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cMC" = ( /obj/machinery/computer/security/telescreen{ @@ -53227,7 +51718,7 @@ dir = 8; layer = 4; name = "Engine Monitor"; - network = list("Engine"); + network = list("singularity"); pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ @@ -53238,15 +51729,24 @@ }, /area/engine/engineering) "cMD" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cMH" = ( -/turf/open/floor/engine, -/area/engine/supermatter) -"cMN" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, -/area/engine/supermatter) +/area/engine/engineering) +"cMH" = ( +/obj/structure/particle_accelerator/particle_emitter/center, +/turf/open/floor/plating, +/area/engine/engineering) +"cMN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cMQ" = ( /obj/structure/cable{ icon_state = "0-2" @@ -53454,6 +51954,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cQZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cSz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -53479,41 +51985,23 @@ /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) "cSG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/engine/engineering) "cSH" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/cable/yellow{ + icon_state = "0-8" }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cSI" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cSJ" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "cSK" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "cSL" = ( /obj/machinery/button/door{ id = "atmos"; @@ -53823,18 +52311,6 @@ }, /turf/open/floor/plating, /area/science/xenobiology) -"cTY" = ( -/obj/structure/sign/poster/official/safety_internals{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"cTZ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "cVb" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -53895,6 +52371,13 @@ dir = 6 }, /area/security/brig) +"dkZ" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "dAS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -53934,6 +52417,24 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"eeP" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) +"eiu" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + target_temperature = 80; + dir = 2; + on = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "eiQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -53944,6 +52445,13 @@ }, /turf/open/floor/plating, /area/security/brig) +"ejb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) "ejX" = ( /obj/machinery/light{ dir = 1 @@ -53999,6 +52507,13 @@ icon_state = "wood-broken5" }, /area/maintenance/bar) +"eHD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) "eRz" = ( /obj/structure/lattice, /obj/structure/grille, @@ -54014,6 +52529,11 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"fdi" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space) "fgi" = ( /turf/closed/wall, /area/crew_quarters/cryopod) @@ -54050,6 +52570,13 @@ }, /turf/open/floor/plasteel/hydrofloor, /area/hallway/secondary/service) +"foQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/comfy/black, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "fsC" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable{ @@ -54057,9 +52584,16 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) -"fsQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, +"fFB" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/engine/engineering) "fIx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -54124,6 +52658,9 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/showroomfloor, /area/space) +"gre" = ( +/turf/open/floor/plating/airless, +/area/engine/engineering) "gtB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54223,22 +52760,70 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"hfn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/biohazard, +/turf/open/floor/plating, +/area/science/xenobiology) "hgP" = ( /obj/structure/closet/bombcloset/security, /turf/open/floor/plasteel/showroomfloor, /area/space) +"hmW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"hyz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) "hCi" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space) +"hDa" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"hMa" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access = null; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"hQd" = ( +/turf/open/space/basic, +/area/engine/engineering) "hSW" = ( /turf/open/floor/plasteel/red/side, /area/security/brig) -"ijc" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +"ieW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "ilg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood{ @@ -54255,6 +52840,14 @@ /obj/machinery/droneDispenser, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"iqO" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Port Aft"; + dir = 1; + network = list("engine") + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "itG" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -54295,6 +52888,20 @@ dir = 4 }, /area/security/brig) +"iRn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 2; + external_pressure_bound = 140; + pressure_checks = 0; + name = "killroom vent" + }, +/obj/machinery/camera{ + c_tag = "Xenobiology Kill Room"; + dir = 4; + network = list("ss13","rd") + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "iZz" = ( /obj/structure/table/wood/poker, /turf/open/floor/wood, @@ -54330,7 +52937,7 @@ /obj/machinery/camera{ c_tag = "Circuitry Lab"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel, /area/science/circuit) @@ -54368,6 +52975,13 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/maintenance/bar) +"jxR" = ( +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) +"jyX" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/engineering) "jAD" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -54412,15 +53026,6 @@ dir = 9 }, /area/security/brig) -"jMY" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "jSO" = ( /obj/machinery/light{ dir = 4 @@ -54439,6 +53044,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"jZh" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "khb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -54449,7 +53061,7 @@ /area/hallway/secondary/service) "khB" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; req_access_txt = "13" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -54519,6 +53131,26 @@ icon_state = "wood-broken7" }, /area/maintenance/bar) +"kGu" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"kHd" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/xenobiology) +"kHN" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"kNw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "kPd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable{ @@ -54534,13 +53166,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"kQq" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "kSb" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -54566,6 +53191,11 @@ dir = 10 }, /area/security/brig) +"lqu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/science/xenobiology) "lxM" = ( /obj/structure/sign/poster/random{ pixel_y = -32 @@ -54642,6 +53272,12 @@ }, /turf/open/floor/noslip, /area/crew_quarters/cryopod) +"mmW" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "mnl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -54707,27 +53343,44 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"mBv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "Output to Waste" - }, -/turf/open/floor/engine, +"mzz" = ( +/obj/structure/grille, +/turf/open/floor/plating/airless, /area/engine/engineering) "mHd" = ( /obj/structure/falsewall, /turf/open/floor/plating, /area/maintenance/bar) +"mLm" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"mMg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) "mNi" = ( /obj/machinery/light_switch{ pixel_x = -20 }, /turf/open/floor/plasteel/white, /area/science/circuit) +"mQs" = ( +/obj/machinery/power/emitter/anchored{ + dir = 4; + state = 2 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "mRe" = ( /obj/machinery/light{ dir = 8 @@ -54741,6 +53394,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/fore/secondary) +"mWO" = ( +/turf/open/floor/plating/airless, +/area/space) "mXj" = ( /turf/open/floor/plasteel/showroomfloor, /area/space) @@ -54750,10 +53406,6 @@ "nnM" = ( /turf/closed/wall/r_wall, /area/security/armory) -"noK" = ( -/obj/structure/girder, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "nsq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54762,6 +53414,11 @@ dir = 8 }, /area/security/brig) +"nuC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nwx" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -54787,10 +53444,6 @@ }, /turf/open/floor/plasteel/floorgrime, /area/security/brig) -"nzh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "nAv" = ( /obj/structure/table, /obj/item/grenade/barrier{ @@ -54862,12 +53515,28 @@ /obj/item/device/electropack/shockcollar, /turf/open/floor/plating, /area/maintenance/bar) +"oaS" = ( +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "obC" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/closed/wall, /area/maintenance/bar) +"ock" = ( +/obj/structure/rack, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "ody" = ( /obj/effect/spawner/lootdrop/keg, /turf/open/floor/wood{ @@ -54932,10 +53601,19 @@ dir = 10 }, /area/security/brig) -"oDF" = ( -/obj/machinery/light, +"oAQ" = ( +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) +"oHi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "oHU" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54959,6 +53637,21 @@ /obj/machinery/disposal/bin, /turf/open/floor/plasteel/white, /area/science/circuit) +"oUs" = ( +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = -25; + req_access_txt = "11" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "oZl" = ( /turf/open/floor/plasteel/purple/side{ tag = "icon-purple (NORTH)"; @@ -54975,6 +53668,12 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) +"plc" = ( +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "plH" = ( /obj/machinery/door/window/brigdoor/security/cell{ dir = 4; @@ -55002,6 +53701,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"pmD" = ( +/turf/open/space/basic, +/area/space/nearstation) "pzG" = ( /obj/structure/sign/poster/random{ pixel_x = -32 @@ -55162,12 +53864,32 @@ "qWq" = ( /turf/closed/wall, /area/space) +"rgF" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/obj/structure/table, +/obj/item/folder/white, +/obj/item/pen, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "rhJ" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/effect/decal/cleanable/blood/old, /obj/item/device/assembly/signaler, /turf/open/floor/plating, /area/maintenance/bar) +"riY" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Starboard Aft"; + dir = 1; + network = list("engine") + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "rmX" = ( /obj/structure/table, /obj/item/reagent_containers/food/drinks/beer, @@ -55210,11 +53932,33 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"rNn" = ( +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"rPW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Kill Chamber"; + req_access_txt = "55" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/xenobiology) "rWu" = ( /turf/open/floor/wood{ icon_state = "wood-broken6" }, /area/maintenance/bar) +"rZV" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "saK" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -55227,6 +53971,20 @@ /obj/item/gun/energy/laser/practice, /turf/open/floor/plasteel/white, /area/science/circuit) +"spp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) "srd" = ( /turf/open/floor/plasteel/red/corner{ dir = 4 @@ -55249,6 +54007,12 @@ /obj/item/shovel/spade, /turf/open/floor/plasteel/hydrofloor, /area/hallway/secondary/service) +"sAz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "sGJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood{ @@ -55315,6 +54079,12 @@ /obj/structure/chair/office/light, /turf/open/floor/plasteel/white, /area/science/circuit) +"sWi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "sXy" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -55378,6 +54148,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/space/nearstation) +"tHc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "tMl" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/showroomfloor, @@ -55408,21 +54184,14 @@ /obj/item/storage/box/drinkingglasses, /turf/open/floor/wood, /area/maintenance/bar) -"udp" = ( -/obj/item/crowbar/large, -/obj/structure/rack, -/obj/item/device/flashlight, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"uhH" = ( -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 +"ugZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/obj/structure/rack, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, /area/engine/engineering) "ujc" = ( /obj/machinery/vending/cigarette, @@ -55462,7 +54231,7 @@ /obj/item/screwdriver, /obj/machinery/camera{ c_tag = "Circuitry Lab North"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/circuit) @@ -55480,6 +54249,20 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"uuA" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -2 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "uvc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, @@ -55487,6 +54270,12 @@ "uvy" = ( /turf/closed/wall/r_wall, /area/space) +"uAt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/yellow/side, +/area/engine/engineering) "uMX" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -55566,6 +54355,12 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) +"vie" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "vxh" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -55596,6 +54391,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/white, /area/science/circuit) +"vHQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) "vNJ" = ( /obj/machinery/vending/clothing, /turf/open/floor/wood, @@ -55819,6 +54621,22 @@ /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"xJs" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"xMh" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xTa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -55847,6 +54665,14 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"yam" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/plasteel, +/area/engine/atmos) +"yck" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) "ycu" = ( /obj/structure/cable{ icon_state = "2-4" @@ -55871,6 +54697,9 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/security/armory) +"ymd" = ( +/turf/open/floor/plasteel/dark, +/area/security/processing) (1,1,1) = {" aaa @@ -78826,10 +77655,10 @@ abc abc afu abc -aaa -aaa -aaa -aaa +abc +abc +abc +abc aaa aaa aaa @@ -79095,7 +77924,7 @@ aln aiU aaa aiU -anN +aln aiU aaa aaa @@ -79203,8 +78032,8 @@ aaa aaa aaa aaa -aaT -aaT +aaa +aaa aaa aaa aaa @@ -79348,11 +78177,11 @@ aaf aaf aaf aiU -alp +ymd aiU aaa aiU -alp +ymd aiU aaf aaf @@ -79448,21 +78277,21 @@ cjJ aaa aaa crn -aaf -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -aaf -ctv -aaT -aaT aaa aaa aaa @@ -79609,7 +78438,7 @@ cxJ aiU aiT aiU -cxP +cxJ aiU aiV aiT @@ -79705,21 +78534,21 @@ cjJ aaa aaa crn -aaf -aaT -ctv -ctv -ctv -ctv -ctv -ctv -ctv -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -aaf -ctv -ctv -aaT aaa aaa aaa @@ -79962,20 +78791,20 @@ cjJ aaf aaf cig -aaf -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaf -aaf -aaf -aaf +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80220,17 +79049,17 @@ ccw ccw ccw aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaf aaa aaa aaa -aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80477,19 +79306,19 @@ cqw cqO crp aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaf aaa aaa aaa -aaT -aaT -aaT +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80733,20 +79562,20 @@ cgR cgR cqN cro -cEl -cEE -cEl -cFm -csx -cFm -cFm -csx -csv +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa -aaT -ctv -aaT aaa aaa aaa @@ -80990,20 +79819,20 @@ ciN cji cDZ crr -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -81243,24 +80072,24 @@ ccw cfL coH cBO -cgR +cnv cDB cqP crq -crZ -crT -crZ -cFo -css -cFm -cFm -css -csv +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa -aaT -ctv -aaT aaa aaa aaa @@ -81504,21 +80333,21 @@ cgR cqx cqR crp -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT -aaa +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +hCi aaa aaa aaa @@ -81761,25 +80590,25 @@ cpX cqz cqQ ccw -crH -crT -crZ -cFo -css -cFm -cFm -css -csv +pmD aaa aaa -aaT -ctv -aaT +uvy +uvy +uvy aaa aaa aaa aaa aaa +uvy +uvy +uvy +hCi +hCi +aaa +aaa +aaa aaa aaa aaa @@ -82018,24 +80847,24 @@ clJ cig cig ccw -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT -aaa +pmD +pmD +uvy +uvy +uvy +uvy +uvy aaa aaa aaa +uvy +uvy +uvy +uvy +uvy +hCi +hCi +hCi aaa aaa aaa @@ -82269,30 +81098,30 @@ ccw ccw ccw cnZ -coH +oHi +cpt +cpt cpt -cpZ -cig cqS ccw -crH -crT -crZ -cFo -css -cFm -cFm -css -csv -aaa -aaa -aaT -ctv -aaT -aaa -aaa -aaf -aaa +ccw +ccw +ccw +ccw +ccw +ccw +ccw +ccw +cpy +ccw +ccw +ccw +ccw +ccw +ccw +ccw +uvy +hCi aaa aaa aaa @@ -82528,28 +81357,28 @@ cnt cob coL cDo +oaS cgR -cqA cqT -csg +ccw crJ -crU +ccw csb cFn css +cFn csx -csx -css -csb -aaf -aaf -aaT -aaT -aaT -gXs -aaf -aaf -aaf +ccw +ccw +ccw +cGE +cFn +jZh +mzz +mzz +ccw +uvy +yck aaa aaa aaa @@ -82786,27 +81615,27 @@ cgw coK cpu cMm -ccw -ccw -ccw +ckH +uAt +hMa crK cEK csa -csj -csa -csa +gre +mQs +gre cGr -aaa -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa +vHQ +hDa +vHQ +mLm +gre +mQs +gre +gre +ccw +uvy +hCi aaa aaa aaa @@ -83039,31 +81868,31 @@ ckG clJ cmF cgR -cgI +cnZ chF ciO -cqc -cqc -cqc -cEd -cEr -cEL +oaS +cgR +cqT +ccw +cig +ccw cFb -cFu +gre cFI -cGd -cGs -cGr +gre +gre +gre +gre +gre +gre +gre +cFI +gre +iqO ccw -ccw -ccw -ccw -ccw -ccw -aaa -eRz -aaT -eRz +uvy +fdi aaa aaa aaa @@ -83296,30 +82125,30 @@ cTa ceZ clQ cgR -cgx -coM -cpv -cqb -cqb -cqb -cqb +cnZ +oHi +cgR +cgR +cgR +cqT +fFB cEs -cqb -cqb +gre +rNn cAp -cqb +xJs cAo -cGt -cgx -jMY -csd -cHa -csd -uhH +xJs +cAo +xJs +cAo +xJs +cQZ +gre +gre +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -83554,29 +82383,29 @@ cTd ckF ckF cgK -cDg -cDp -cqe -cqB -cqB -cEe +oHi +cgR +cgR +cgR +cqT +fFB csP -cAl -cFc +gre +gre cAq -cFJ +mWO cSH -cGu -cGH -fsQ -fsQ -cGR -csd -csd +mWO +cSH +mWO +cSH +mWO +cSH +mWO +gre +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -83814,26 +82643,26 @@ cgJ chG cpx cqd -cDC +cjc cqU -cEf -cEt -cEM -csA -cEg +fFB +csP +gre +rNn +cAq cFK -cGe -cGv -cGI -cGS -cHb -cHg -cHn -oDF +aoV +aoV +cFK +gXs +aaa +aoV +aoV +cFK +mWO +gre ccw -aaf -aaT -ctv +uvy aaT aaf aaa @@ -84067,30 +82896,30 @@ cig cig cTf cgR -ccw +cnZ cDh cpy -cDv -cDD -cqU -cMD -cEu -cEz -cEz -cMD -cFL -cGf -kQq -cMm -ciZ -cHc -cAu -cAu -ciZ ccw +hyz +ccw +ccw +cqY +cqY +cqY +cAq +aoV +aoV +aoV +hCi +aaf aaa -aaT -ctv +aoV +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -84324,30 +83153,30 @@ ckI clJ cmL cBO +cnZ +cDh ccw -chV -cpx cqf cqD -cMD +oUs crs cEv -cEv -cFe -cMD -cFM -czE -kQq -ccw -cGT -csd -csd -csd -csd -ccw +ugZ +cqY +cAq +aoV +aoV +aaa +aaa aaf -aaT -ctv +aaa +aaa +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -84581,30 +83410,30 @@ ckK clJ cmL cgR -cgL +cnZ chX -cpx +spp cqh cqF cra crI cEw -cEw -cEw -cFw -cFN -csH -csR -cMm -cGU -csd -csd -cHo -csd -ccw +ejb +cqY +cAq aaa -aaT -ctv +aaa +aaa +cDO +cGU +sWi +aaa +hCi +cFK +mWO +gre +ccw +uvy aaT aaa aaa @@ -84838,30 +83667,30 @@ ckI clJ cmL cnv -cMm -chX -cpx +cnZ +eHD +ccw cqg cqE cqZ crt cMH cAm -cMH +mMg cMN -cFO -cSI -cSI -cMm +gXs +aaf +aaf +kNw cGV -csd -cGV -noK -csd +tHc +aaf +aaf +gXs +mWO +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -85095,30 +83924,30 @@ cfb ccw cmN cgR -cgL -chX -cpx +cnZ +eHD +hyz cqj cSG crb cru cEx -cEx -cEx -cAP -cFP -csI -cAt -cMm -csd -csd -csd -cHp -csd +oAQ +cqY +cAq +cFK +hCi +aaa +hmW +sAz +ieW +aaa +aaa +aaa +mWO +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -85352,30 +84181,30 @@ cfb clM cfz cgR +cnZ +eHD ccw -cii -cpx cqi cMD cAP -crv -cEy -cEy -cFh cMD -cFM -czE -kQq -ccw -cGT -csd -csd -csd -csd -ccw +cMD +cEy +cqY +cAq +aoV +aoV +aaa +aaa aaf -aaT -ctv +aaa +aaa +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -85609,30 +84438,30 @@ cfb cfa cje cgR +cnZ +eHD +cpy ccw -cDi -cDr -cDw -cDE -cEa -cMD -cEz -cEz -cEz -cMD -cFR -cSJ -kQq -cMm -ciZ -cHd -cHj -cHd -ciZ +hyz ccw +ccw +cqY +cqY +cqY +cAq +aoV +aoV aaa -aaT -ctv +aaa +aaf +hCi +aaa +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -85866,30 +84695,30 @@ ckL cmF cje cgR -cMm -chX +cnZ +cjS cpD cDw cDF cEa -cEg -cEA -cET -cFj -cEf -cFS -cGg -mBv -cGI -cGS -cHe -cHe -cHr -oDF +fFB +csP +gre +rNn +cAq +cFK +aoV +aaa +aaa +gXs +cFK +aoV +aoV +cFK +mWO +gre ccw -aaf -aaT -ctv +uvy aaT aaf aaa @@ -86123,30 +84952,30 @@ ceq clQ cje cgR -cMm -cDj -cDs -cql -cDG -cDG -cEh -cEB -cEU -cFk -cAs -cFT +cnZ +cjS +cgR +cgR +cgR +cqT +fFB +csP +gre +gre +cAq +mWO cSK -cGx -cGK -nzh -nzh -cGY -csd -csd +mWO +cSK +mWO +cSK +mWO +cSK +mWO +gre +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -86380,30 +85209,30 @@ ckO ckH cja cny -ccw -cip +cnZ +cjS cnx cDx cqb -cqb -cqb -cEC -cqb -cqb +cqT +fFB +cEs +gre +rNn cAr -cqb +xJs cGh -cGC -cey -ijc -csd -cEk -csd -udp +xJs +cGh +xJs +cGh +xJs +vie +gre +gre +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -86637,30 +85466,30 @@ cfb clR cgR cgR -cMm -cir +cnZ +cjS cDt cDy cqC +cqT +ccw +ccw +ccw crc -cEi -cED -crc -crc -cFy +gre cBR -cGi -cGD -cGL +gre +gre +gre +gre +gre +gre +gre +cBR +gre +riY ccw -ccw -ccw -ccw -ccw -ccw -aaa -aaT -aaT +uvy aaT aaa aaa @@ -86898,27 +85727,27 @@ cDe cDk coc cqa -cig -ccw -ccw +uuA +uAt +hMa czF +cEK csd -csd -cFz +gre cFU -cGj +gre cGE -cGM +vHQ cGZ -aag -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa +vHQ +csx +gre +cFU +gre +gre +ccw +uvy +hCi aaa aaa aaa @@ -87154,28 +85983,28 @@ cgU cgU cis cjN -cDz -cDH -cMm -csd -crM -crV -crV -cFA -csd -cGk +cgR +cgR +cqT ccw -aag -aag -aag -aaf -aaf -aaf -aaf -gXs -aaf -aaf -aaf +crM +ccw +crV +cFn +xMh +cFn +mLm +ccw +ccw +ccw +cGr +cFn +rZV +mzz +mzz +ccw +uvy +yck aaf aaa aaa @@ -87407,32 +86236,32 @@ ccw cet cfd cfB -cfI -cgQ +cfB +cfB cjS cjN -cqm cgR -crd -cEk -crL -cEW -cse -cse -csu -cGl +cgR +cqT ccw -aaa -aaa -aaf -aaa -aaf -ctv -aaT -aaa -aaa -aaf -aaa +ccw +ccw +ccw +ccw +ccw +ccw +ccw +ccw +cpy +ccw +ccw +ccw +ccw +ccw +ccw +jyX +uvy +hCi aaa aaa aaa @@ -87668,28 +86497,28 @@ ccw ccw cDl cjN -cjh -cDI +cgR +cgR +cgR +cqS ccw ccw ccw ccw ccw -cMm -cMm -cMm ccw -aaf -aaf -aaf -aaf -aaf -ctv -aaT -aaa -aaa -aaf +hQd +pmD +pmD +pmD +uvy +uvy +uvy +uvy +uvy aaa +yck +hCi aaa aaa aaa @@ -87926,7 +86755,7 @@ ccw cDm cjP ckF -cDJ +ckF ckF cpE cjR @@ -87939,13 +86768,13 @@ aaa aaa aaa aaa -ctv -ctv -ctv -aaT -aaa -aaa -aaa +pmD +uvy +uvy +uvy +hCi +hCi +hCi aaa aaa aaa @@ -88168,7 +86997,7 @@ caE cbA ccy bOd -bOd +yam bQu cfO cgW @@ -88190,17 +87019,17 @@ ccw crX cfK aag -aaa -aaa -aaa -aaa -aaa -aaa -aaT -aaT -aaT -aaT -aaa +hCi +hCi +hCi +hCi +hCi +hCi +gXs +gXs +gXs +gXs +hCi aaa aaa aae @@ -88413,7 +87242,7 @@ bIF bOZ bQp bRA -bOd +yam bTO bUL bVU @@ -88440,7 +87269,7 @@ ccw cpa cjc cqo -cDL +ccw cjk cjm ccw @@ -88456,7 +87285,7 @@ aaa aaa aaa aaa -eRz +gXs aaa aaa aaa @@ -88697,7 +87526,7 @@ ccw ccw cpI ccw -cDL +ccw cjl cjQ cjV @@ -88954,7 +87783,7 @@ cig cpb ciZ cqp -cDN +cig cjT cgR crP @@ -89211,7 +88040,7 @@ cig cig czg cig -cDN +cig crh crA crR @@ -89468,7 +88297,7 @@ cig cpc cpJ cpc -cDN +cig cqY cqY cqY @@ -89701,7 +88530,7 @@ bRF bSM bTS bUQ -agd +bWa bUO bVZ bVZ @@ -89725,7 +88554,7 @@ cig cpd czM cpd -cDN +cig aaa aaa aaa @@ -89958,8 +88787,8 @@ bRE bSJ bPe bOd -cCB -cCC +bOd +bOd bXT bXT bXT @@ -89982,7 +88811,7 @@ ccw cpd czL cpd -cDL +ccw aaf aaa aaa @@ -90216,7 +89045,7 @@ bSM bTU bUS bUS -cCD +bUS bXU bUS bUS @@ -90239,7 +89068,7 @@ aaa cpd cpM cpd -cCQ +aaf aaf aaa aaa @@ -90473,7 +89302,7 @@ bSN bTT bUR bWb -cCE +bUR bTT bUR bZJ @@ -90496,7 +89325,7 @@ aaa aaa czN aaa -cCQ +aaf aaf aaa aaa @@ -90753,7 +89582,7 @@ aaa aaa aaa aaa -cCQ +aaf aaf aaa aaa @@ -90987,7 +89816,7 @@ bSP bPh bQy bRI -cCF +bQy bPh bQy bRI @@ -91010,7 +89839,7 @@ aaa aaa aaa aaa -cCQ +aaf aaf aaa aaa @@ -91244,16 +90073,16 @@ aaf bRK aaf bVv -cCG -cCH -cCI -cCJ -cCI -cCH -cCI -cCJ -cCI -cCP +aaf +bRK +aaf +bVv +aaf +bRK +aaf +bVv +aaf +aaf bLK chg bLK @@ -91267,7 +90096,7 @@ aoV aoV aoV aoV -cCQ +aaf aoV aaa aaa @@ -91510,7 +90339,7 @@ bPj bQA bPj bOh -cCQ +aaf bLK cyG bLK @@ -91524,7 +90353,7 @@ aoV aoV aoV aoV -cCQ +aaf aoV aaa aaa @@ -91767,21 +90596,21 @@ cbI ccC cdD bOh -cCG -cCS -cCS -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cDY +aaf +aah +aah +aaf +aaf +aaf +aaf +aaf +aah +aah +aah +aah +aah +aah +aaf aaf aaf aaf @@ -98190,8 +97019,8 @@ bRT bEm bEm bDb -cfr -cho +iRn +eeP bDb aaa cNW @@ -98432,7 +97261,7 @@ bJJ bKY bMi bNo -bIP +foQ bPA bJN bRU @@ -98447,9 +97276,9 @@ bRU bEm bEm bDb -cgi -chq -ccQ +jxR +mmW +kHd aaa cOT cQB @@ -98704,9 +97533,9 @@ bRU bEm cBz bDb -cgi -chq -ccQ +jxR +mmW +kHd aaa cOT cQB @@ -99218,8 +98047,8 @@ bRV bTa cbR bDb -cgk -chr +hfn +rPW bDb aaa cNW @@ -99474,10 +98303,10 @@ bZa bMi bMi bRZ -cTY -cTZ -chu -ccQ +plc +kGu +cyA +kHd aaf cOT cQB @@ -99731,12 +98560,12 @@ bTc bRX bTc cbT -ccP -ccP -cht -ckn +kHN +kHN +dkZ +lqu csk -czQ +nuC czU czZ cOT @@ -99988,10 +98817,10 @@ bZb bRZ bMi bMi -cfy -cgn -cjB -ccQ +ock +eiu +rgF +kHd aaf cOT cgm @@ -106150,7 +104979,7 @@ bTr bTr bTr bTr -bXu +bTr bTr bTr bTr diff --git a/_maps/cit_map_files/Deltastation/DeltaStation2.dmm b/_maps/cit_map_files/Deltastation/DeltaStation2.dmm index f4821e135d..a95d74ee74 100644 --- a/_maps/cit_map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/cit_map_files/Deltastation/DeltaStation2.dmm @@ -3966,7 +3966,7 @@ /obj/machinery/camera{ c_tag = "Supermatter Engine - Fore"; name = "atmospherics camera"; - network = list("SS13","Engine") + network = list("ss13","engine") }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -8666,7 +8666,7 @@ /obj/machinery/camera{ c_tag = "Supermatter Chamber"; dir = 2; - network = list("Engine") + network = list("engine") }, /turf/open/floor/engine, /area/engine/supermatter) @@ -9182,10 +9182,6 @@ }, /turf/open/floor/circuit/green, /area/engine/supermatter) -"ayK" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) "ayL" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 @@ -9245,7 +9241,7 @@ c_tag = "Supermatter Engine - Starboard"; dir = 8; name = "atmospherics camera"; - network = list("SS13","Engine") + network = list("ss13","engine") }, /obj/structure/cable{ icon_state = "1-2" @@ -9646,7 +9642,7 @@ c_tag = "Supermatter Engine - Port"; dir = 4; name = "atmospherics camera"; - network = list("SS13","Engine") + network = list("ss13","engine") }, /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/unary/thermomachine/heater{ @@ -11684,7 +11680,7 @@ /obj/machinery/camera{ c_tag = "Supermatter Engine - Aft"; name = "atmospherics camera"; - network = list("SS13","Engine") + network = list("ss13","engine") }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -12900,7 +12896,7 @@ c_tag = "Prison - Garden"; dir = 2; name = "prison camera"; - network = list("SS13","prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/neutral/side{ dir = 1 @@ -17780,7 +17776,7 @@ c_tag = "Prison - Relaxation Area"; dir = 1; name = "prison camera"; - network = list("SS13","prison") + network = list("ss13","prison") }, /turf/open/floor/plating, /area/security/prison) @@ -19590,7 +19586,7 @@ c_tag = "Prison - Cell 3"; dir = 2; name = "prison camera"; - network = list("SS13","prison") + network = list("ss13","prison") }, /turf/open/floor/plating{ icon_state = "panelscorched" @@ -19630,7 +19626,7 @@ c_tag = "Prison - Cell 2"; dir = 2; name = "prison camera"; - network = list("SS13","prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -19662,7 +19658,7 @@ c_tag = "Prison - Cell 1"; dir = 2; name = "prison camera"; - network = list("SS13","prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -29378,7 +29374,7 @@ "bpg" = ( /obj/machinery/computer/security{ name = "Labor Camp Monitoring"; - network = list("Labor") + network = list("labor") }, /obj/item/device/radio/intercom{ name = "Station Intercom"; @@ -29694,7 +29690,7 @@ c_tag = "AI Satellite - Fore"; dir = 1; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -32973,7 +32969,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Chamber - Fore"; name = "motion-sensitive ai camera"; - network = list("AI") + network = list("ai") }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, @@ -33462,8 +33458,7 @@ "bxe" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -33589,7 +33584,7 @@ c_tag = "AI Satellite - Fore Port"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -33649,7 +33644,7 @@ c_tag = "AI Satellite - Fore Starboard"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -35403,7 +35398,7 @@ dir = 4; layer = 4; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_x = -24 }, /turf/open/floor/plasteel/caution{ @@ -35744,7 +35739,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; name = "Research Monitor"; - network = list("RD","Sat"); + network = list("rd","minisat"); pixel_y = 2 }, /turf/open/floor/plasteel/dark, @@ -41547,7 +41542,7 @@ c_tag = "Telecomms - Monitoring"; dir = 2; name = "telecomms camera"; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) @@ -42033,7 +42028,7 @@ c_tag = "AI Chamber - Aft"; dir = 1; name = "motion-sensitive ai camera"; - network = list("AI") + network = list("ai") }, /turf/open/floor/plasteel/vault, /area/ai_monitored/turret_protected/ai) @@ -42974,7 +42969,7 @@ c_tag = "AI Satellite - Port"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -43042,7 +43037,7 @@ c_tag = "AI Satellite - Starboard"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -43954,7 +43949,7 @@ c_tag = "AI Satellite - Antechamber"; dir = 2; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault, @@ -44798,8 +44793,7 @@ "bTl" = ( /obj/machinery/camera/motion{ c_tag = "Armoury - Exterior"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/space, /area/space/nearstation) @@ -44874,7 +44868,7 @@ c_tag = "AI Satellite - Maintenance"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /obj/effect/turf_decal/stripes/line, @@ -44962,7 +44956,7 @@ c_tag = "AI Satellite - Teleporter"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -45078,7 +45072,7 @@ c_tag = "AI Satellite - Transit Tube"; dir = 2; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /obj/item/clipboard, @@ -46442,7 +46436,7 @@ desc = "Used for watching the AI's satellite."; dir = 4; name = "Research Monitor"; - network = list("Sat"); + network = list("minisat"); pixel_y = 2 }, /turf/open/floor/plasteel/vault{ @@ -46489,7 +46483,7 @@ dir = 4; layer = 4; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_x = -30 }, /mob/living/simple_animal/parrot/Poly, @@ -49781,7 +49775,7 @@ c_tag = "Telecomms - Chamber Port"; dir = 4; name = "telecomms camera"; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel/vault/telecomms{ dir = 8 @@ -50225,7 +50219,7 @@ /obj/machinery/camera/motion{ c_tag = "AI - Upload"; name = "motion-sensitive ai camera"; - network = list("Sat") + network = list("minisat") }, /turf/open/floor/plasteel/vault, /area/ai_monitored/turret_protected/ai_upload) @@ -50253,6 +50247,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/power/emitter{ + anchored = 1; + state = 2 + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cdE" = ( @@ -51319,8 +51317,9 @@ /obj/machinery/camera/emp_proof{ c_tag = "Containment - Fore Starboard"; dir = 8; - network = list("Singularity") + network = list("singularity") }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/engine/engineering) "cfC" = ( @@ -51668,7 +51667,7 @@ c_tag = "Telecomms - Chamber Starboard"; dir = 8; name = "telecomms camera"; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel/vault/telecomms{ dir = 8 @@ -52292,7 +52291,6 @@ /turf/open/space, /area/space/nearstation) "chu" = ( -/obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) @@ -53036,7 +53034,7 @@ /obj/machinery/camera/emp_proof{ c_tag = "Containment - Fore Port"; dir = 4; - network = list("Singularity") + network = list("singularity") }, /turf/open/space, /area/space/nearstation) @@ -53057,10 +53055,10 @@ "cjb" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, /turf/open/space, /area/space/nearstation) @@ -53076,28 +53074,11 @@ /turf/open/floor/plating, /area/engine/engineering) "cje" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plating, /area/engine/engineering) -"cjf" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "cjg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -53334,8 +53315,7 @@ /obj/machinery/camera/motion{ c_tag = "Bridge - Captain's Emergency Escape"; dir = 4; - name = "command camera"; - network = list("SS13") + name = "command camera" }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -53663,13 +53643,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"ckx" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "cky" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -53685,6 +53658,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/space/nearstation) "ckA" = ( @@ -53693,35 +53667,11 @@ id = "engpa"; name = "Engineering Chamber Shutters" }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plating, /area/engine/engineering) -"ckB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"ckC" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/neutral, -/area/engine/engineering) "ckD" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral, @@ -54292,20 +54242,9 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "clS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"clT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/field/generator{ - anchored = 1 + anchored = 1; + state = 2 }, /turf/open/floor/plating/airless, /area/space/nearstation) @@ -54318,19 +54257,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"clV" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "clW" = ( /obj/structure/rack, /obj/item/crowbar, @@ -54340,9 +54266,6 @@ /turf/open/floor/plasteel, /area/engine/engineering) "clX" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/engineering) @@ -55094,7 +55017,7 @@ c_tag = "AI Satellite - Aft Port"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -55169,7 +55092,7 @@ c_tag = "AI Satellite - Aft Starboard"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault{ @@ -55208,9 +55131,6 @@ id = "engpa"; name = "Engineering Chamber Shutters" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -55473,7 +55393,7 @@ c_tag = "Telecomms - Cooling Room"; dir = 8; name = "telecomms camera"; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -55896,9 +55816,6 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -56458,6 +56375,10 @@ /turf/open/floor/plating, /area/engine/engineering) "cqr" = ( +/obj/structure/particle_accelerator/particle_emitter/left{ + icon_state = "emitter_left"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "cqs" = ( @@ -56466,6 +56387,7 @@ /area/engine/engineering) "cqt" = ( /obj/structure/cable, +/obj/machinery/particle_accelerator/control_box, /turf/open/floor/plating, /area/engine/engineering) "cqu" = ( @@ -57027,7 +56949,7 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "crJ" = ( -/obj/item/wrench, +/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "crK" = ( @@ -57068,7 +56990,10 @@ /turf/open/floor/plating, /area/engine/engineering) "crO" = ( -/obj/item/weldingtool/largetank, +/obj/structure/particle_accelerator/fuel_chamber{ + icon_state = "fuel_chamber"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "crP" = ( @@ -57092,7 +57017,7 @@ dir = 4; layer = 4; name = "Engine Containment Telescreen"; - network = list("Singularity"); + network = list("singularity"); pixel_x = -30 }, /obj/effect/turf_decal/stripes/line{ @@ -57846,7 +57771,10 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "ctp" = ( -/obj/item/wrench, +/obj/structure/particle_accelerator/particle_emitter/right{ + icon_state = "emitter_right"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "ctq" = ( @@ -58650,7 +58578,7 @@ /obj/machinery/camera/emp_proof{ c_tag = "Containment - Particle Accelerator"; dir = 1; - network = list("Singularity") + network = list("singularity") }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -58659,9 +58587,6 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) @@ -58716,6 +58641,7 @@ dir = 8 }, /obj/effect/turf_decal/bot, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, /area/engine/engineering) "cva" = ( @@ -59873,24 +59799,6 @@ dir = 4 }, /area/crew_quarters/fitness/recreation) -"cxA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"cxB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "cxD" = ( /obj/structure/rack, /obj/item/crowbar, @@ -60710,13 +60618,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"czp" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/space/nearstation) "czq" = ( /obj/structure/cable{ icon_state = "0-2" @@ -60730,33 +60631,9 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/corner, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/space/nearstation) -"czs" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"czt" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/neutral, -/area/engine/engineering) "czu" = ( /obj/structure/cable/white{ icon_state = "0-2" @@ -61344,7 +61221,7 @@ /obj/machinery/camera/emp_proof{ c_tag = "Containment - Aft Port"; dir = 4; - network = list("Singularity") + network = list("singularity") }, /turf/open/space, /area/space/nearstation) @@ -61358,10 +61235,10 @@ "cAI" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-4" }, /turf/open/space, /area/space/nearstation) @@ -61373,11 +61250,7 @@ /turf/open/space, /area/space/nearstation) "cAK" = ( -/obj/machinery/power/rad_collector/anchored, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -62961,8 +62834,9 @@ /obj/machinery/camera/emp_proof{ c_tag = "Containment - Aft Starboard"; dir = 8; - network = list("Singularity") + network = list("singularity") }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/engine/engineering) "cDW" = ( @@ -63846,6 +63720,12 @@ icon_state = "0-2" }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/power/emitter{ + anchored = 1; + dir = 1; + icon_state = "emitter"; + state = 2 + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cFI" = ( @@ -67620,7 +67500,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology - Cell 1"; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -67633,7 +67513,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology - Cell 2"; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -67646,15 +67526,12 @@ /obj/machinery/camera{ c_tag = "Xenobiology - Cell 3"; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 }, /area/science/xenobiology) -"cNh" = ( -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) "cNi" = ( /obj/machinery/light/small{ dir = 1 @@ -67663,7 +67540,7 @@ c_tag = "Xenobiology - Killroom Chamber"; dir = 2; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault/killroom, /area/science/xenobiology) @@ -68381,26 +68258,6 @@ "cON" = ( /turf/open/floor/circuit/green, /area/science/xenobiology) -"cOO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 2; - external_pressure_bound = 140; - name = "killroom vent"; - pressure_checks = 0 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cOP" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cOQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 2; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cOR" = ( /turf/closed/wall/r_wall, /area/science/research) @@ -69156,24 +69013,6 @@ dir = 1 }, /area/science/xenobiology) -"cQw" = ( -/obj/machinery/atmospherics/pipe/manifold/general/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) -"cQx" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) -"cQy" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) "cQz" = ( /obj/structure/closet/wardrobe/science_white, /obj/machinery/light/small{ @@ -69712,7 +69551,7 @@ c_tag = "Xenobiology - Port"; dir = 2; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -72180,7 +72019,7 @@ c_tag = "Xenobiology - Secure Cell"; dir = 4; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -72394,7 +72233,7 @@ c_tag = "Science - Fore"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 4 @@ -72454,7 +72293,7 @@ c_tag = "Security Post - Science"; dir = 8; name = "security camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/red/side{ dir = 6 @@ -72505,7 +72344,7 @@ c_tag = "Science - Waiting Room"; dir = 1; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 8 @@ -72570,13 +72409,6 @@ dir = 8 }, /area/medical/medbay/central) -"cXG" = ( -/obj/structure/table, -/obj/item/folder/white, -/turf/open/floor/plasteel/whiteblue/corner{ - dir = 8 - }, -/area/medical/medbay/central) "cXH" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -73201,7 +73033,7 @@ c_tag = "Xenobiology - Starboard"; dir = 8; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -73381,12 +73213,11 @@ id = "chemisttop"; name = "Chemistry Lobby Shutters" }, -/obj/machinery/door/window/southleft{ +/obj/item/folder/yellow, +/obj/machinery/door/window/northleft{ name = "Chemistry Desk"; req_access_txt = "5; 33" }, -/obj/item/folder/yellow, -/obj/machinery/door/window/northleft, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/medical/medbay/central) @@ -74963,7 +74794,7 @@ c_tag = "Science - Research Division Access"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -76222,7 +76053,7 @@ c_tag = "Science - Research and Development"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner, /area/science/lab) @@ -76290,7 +76121,7 @@ c_tag = "Medbay - Chemistry"; dir = 8; name = "medbay camera"; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteyellow/corner, /area/medical/chemistry) @@ -76676,7 +76507,7 @@ c_tag = "Xenobiology - Cell 4"; dir = 1; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -76688,7 +76519,7 @@ c_tag = "Xenobiology - Cell 5"; dir = 1; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -76700,7 +76531,7 @@ c_tag = "Xenobiology - Cell 6"; dir = 1; name = "xenobiology camera"; - network = list("SS13","xeno","RD") + network = list("ss13","xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -76745,7 +76576,7 @@ c_tag = "Science - Port"; dir = 2; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 1 @@ -76812,7 +76643,7 @@ c_tag = "Science - Center"; dir = 2; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 1 @@ -77966,7 +77797,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 4; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_x = -28 }, /turf/open/floor/plasteel/white/corner, @@ -78125,7 +77956,7 @@ c_tag = "Science - Experimentation Lab"; dir = 2; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -79526,7 +79357,7 @@ c_tag = "Science - Lab Access"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -81872,7 +81703,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 4; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_x = -28 }, /turf/open/floor/plasteel/white/corner{ @@ -82119,7 +81950,7 @@ c_tag = "Science - Research Director's Office"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -83970,7 +83801,7 @@ c_tag = "Science - Experimentor"; dir = 1; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -83985,7 +83816,7 @@ c_tag = "Science - Toxins Mixing Lab Fore"; dir = 4; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/escape{ dir = 8 @@ -84027,7 +83858,7 @@ c_tag = "Science - Firing Range"; dir = 4; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -84124,7 +83955,7 @@ c_tag = "Science - Aft Center"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner, /area/science/research) @@ -84167,7 +83998,7 @@ c_tag = "Science - Mech Bay"; dir = 1; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -87081,7 +86912,7 @@ c_tag = "Science - Research Director's Quarters"; dir = 1; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/modular_computer/console/preset/research{ dir = 1 @@ -87777,7 +87608,7 @@ c_tag = "Science - Robotics Lab"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -88615,7 +88446,7 @@ c_tag = "Science - Toxins Launch Site"; dir = 2; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -88730,7 +88561,7 @@ c_tag = "Science - Toxins Mixing Lab Aft"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -89358,7 +89189,7 @@ dir = 4; layer = 4; name = "Testing Site Telescreen"; - network = list("Toxins") + network = list("toxins") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -90187,7 +90018,7 @@ c_tag = "Science - Server Room"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/science/server) @@ -90200,7 +90031,7 @@ c_tag = "Science - Aft"; dir = 4; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/corner{ dir = 8 @@ -90673,7 +90504,7 @@ /turf/open/floor/plating/airless, /area/science/test_area) "dJJ" = ( -/obj/machinery/doppler_array{ +/obj/machinery/doppler_array/research/science{ dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -90861,7 +90692,7 @@ c_tag = "Science - Toxins Secure Storage"; dir = 4; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -91663,7 +91494,7 @@ invuln = 1; light = null; name = "hardened testing camera"; - network = list("Toxins"); + network = list("toxins"); start_active = 1; use_power = 0 }, @@ -93003,7 +92834,7 @@ c_tag = "Science - Break Room"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/neutral/side{ dir = 4 @@ -100888,7 +100719,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Service Bay"; dir = 8; - network = list("MiniSat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -100898,6 +100729,25 @@ dir = 4 }, /area/science/misc_lab) +"fzH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "fGq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -100916,6 +100766,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/circuit) +"gsR" = ( +/turf/open/space, +/area/space) "gKr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -100929,6 +100782,12 @@ dir = 8 }, /area/science/misc_lab) +"gPz" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/vault/killroom, +/area/science/xenobiology) "gQS" = ( /turf/open/floor/plasteel/white/side{ dir = 9 @@ -101006,6 +100865,9 @@ dir = 9 }, /area/science/circuit) +"hRG" = ( +/turf/open/space/basic, +/area/space/nearstation) "iQh" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -101032,7 +100894,7 @@ c_tag = "Science - Experimentation Lab"; dir = 2; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/requests_console{ department = "Circuitry Lab"; @@ -101064,10 +100926,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral, /area/medical/morgue) +"jKb" = ( +/turf/open/space, +/area/space/nearstation) +"jRX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 2; + external_pressure_bound = 120; + name = "server vent" + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "kwx" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/whitepurple/corner, /area/science/research) +"kwP" = ( +/turf/open/floor/plasteel/vault/killroom, +/area/science/xenobiology) "kyo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -101089,6 +100965,9 @@ dir = 5 }, /area/crew_quarters/locker) +"lkn" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) "loI" = ( /obj/machinery/autolathe, /obj/machinery/door/window/southleft{ @@ -101104,6 +100983,10 @@ dir = 4 }, /area/science/lab) +"lxv" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "lEl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -101148,6 +101031,13 @@ dir = 1 }, /area/science/circuit) +"mqk" = ( +/obj/structure/particle_accelerator/end_cap{ + icon_state = "end_cap"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "mvm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -101159,6 +101049,25 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit/green, /area/science/research/abandoned) +"npb" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/vault/killroom, +/area/science/xenobiology) +"nGW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 2; + external_pressure_bound = 140; + name = "killroom vent"; + pressure_checks = 0 + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) +"nJG" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "oZC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -101172,6 +101081,13 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) +"pfd" = ( +/obj/structure/particle_accelerator/particle_emitter/center{ + icon_state = "emitter_center"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "pmQ" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster{ @@ -101182,6 +101098,9 @@ dir = 1 }, /area/science/circuit) +"pqQ" = ( +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "psi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bodycontainer/morgue{ @@ -101235,6 +101154,12 @@ "saw" = ( /turf/closed/wall, /area/science/circuit) +"tdp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "tmi" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -101273,6 +101198,9 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel/whitepurple/side, /area/science/misc_lab) +"uDN" = ( +/turf/open/floor/plating/airless, +/area/space) "uYS" = ( /obj/machinery/door/airlock/atmos/glass{ heat_proof = 1; @@ -101294,6 +101222,12 @@ dir = 5 }, /area/medical/morgue) +"vOd" = ( +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/vault/killroom, +/area/science/xenobiology) "wei" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -101330,6 +101264,13 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"xwB" = ( +/obj/structure/particle_accelerator/power_box{ + icon_state = "power_box"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "xwK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -101338,7 +101279,7 @@ c_tag = "Science - Lab Access"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/structure/sign/departments/science{ pixel_x = 32 @@ -101355,6 +101296,13 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) +"xJl" = ( +/obj/structure/table, +/obj/item/folder/white, +/turf/open/floor/plasteel/whiteblue/corner{ + dir = 8 + }, +/area/medical/medbay/central) "xMn" = ( /obj/structure/disposalpipe/trunk, /obj/machinery/disposal/bin, @@ -121815,14 +121763,14 @@ aaa cja ckw clS -aad -aad -clR -aaa -abj -aad -aad -cxA +jKb +jKb +clS +nJG +hRG +jKb +jKb +clS ctn cja aaa @@ -122070,17 +122018,17 @@ cdC cfA aad cjb -ckx +cky +jKb +gsR +gsR +lxv aad -aaa -aaa -abj -aad -abj -aaa -aaa -aad -czp +hRG +gsR +gsR +jKb +czq cAI aad cDT @@ -122328,15 +122276,15 @@ cfA aaa cja ckw +jKb +gsR +hRG +hRG aad -aaa -abj -abj -abj -abj -abj -aaa -aad +hRG +hRG +gsR +jKb ctn cja aaa @@ -122583,19 +122531,19 @@ car cbP cfA abj -cja -ckw -ckw -abj -abj +cjb +cky +hRG +hRG +hRG cqo clR ctm -abj -abj -abj -ctn -cja +hRG +lxv +clS +czq +cAI abj cDT cFJ @@ -122840,19 +122788,19 @@ car cbP cdC aad -cjb -cky -aaa +cja +ckw +nJG +aad aad -abj ckw crJ -ctn -abj +tdp aad -aaa -czq -cAI +aad +nJG +ctn +cja aad cdC cFJ @@ -123097,19 +123045,19 @@ car cbP cfA abj -cja -ckw -abj -abj -abj +cjb +cky +clS +lxv +hRG cqp crK cto -abj -abj -ctn -ctn -cja +hRG +hRG +hRG +czq +cAI abj cDT cFJ @@ -123356,15 +123304,15 @@ cfA aaa cja ckw +jKb +gsR +hRG +hRG aad -aaa -abj -abj -abj -abj -abj -aaa -aad +hRG +hRG +gsR +jKb ctn cja aaa @@ -123612,17 +123560,17 @@ cdC cfA aad cjb -ckx +cky +jKb +gsR +aaa +hRG aad +lxv aaa -aaa -abj -aad -abj -aaa -aaa -aad -czp +gsR +jKb +czq cAI aad cDU @@ -123870,15 +123818,15 @@ cfA aaa cja ckw -clT -aad -aad -abj -aaa -crK -aad -aad -cxB +clS +jKb +hRG +hRG +nJG +clS +jKb +jKb +clS ctn cja aaa @@ -124381,8 +124329,8 @@ car cbT cdG cfB -aaa -aad +uDN +lkn aaa aad cjd @@ -124394,8 +124342,8 @@ cjd cjd aad aaa -aad -aaa +lkn +uDN cDV cFL cHg @@ -124902,7 +124850,7 @@ cje cjd cpa cqr -cqr +pfd ctp cuQ cjd @@ -125153,19 +125101,19 @@ cbV cdJ car chv -cjf +chv ckA -clV +chv cnC cpa cqs -cqr +xwB ctq cuR cnC -cjf -czs -clV +chv +chv +chv chv car cFO @@ -125411,7 +125359,7 @@ cdK cfD chw cjg -ckB +chw clW cnD cpb @@ -125421,7 +125369,7 @@ ctr cuS cnD cxD -ckB +chw chw chw cDW @@ -125668,17 +125616,17 @@ cdL cfE chx cjh -ckC +cjn clX cnE cpc cqu -cqr +mqk cts cuT cnE clX -czt +cjn cAL cCs cDX @@ -127155,7 +127103,7 @@ atS avb awh axz -ayK +axz axz aAW axz @@ -128526,7 +128474,7 @@ das dcd cMY deX -dgo +fzH dhR lKu tmi @@ -132626,9 +132574,9 @@ cHA cjp cKl cLI -cNh -cNh -cNh +kwP +kwP +kwP cNc cTQ cVI @@ -132883,9 +132831,9 @@ cHB cjp cKj cLI -cNh -cOO -cQw +kwP +nGW +vOd cSf cTR cVP @@ -133141,8 +133089,8 @@ caE cKm cLI cNi -cOP -cQx +pqQ +gPz cSg cTS cVQ @@ -133397,9 +133345,9 @@ cHB cjp cKk cLI -cNh -cOQ -cQy +kwP +jRX +npb cSh cTT cVR @@ -133654,9 +133602,9 @@ cHA ceb cKk cLI -cNh -cNh -cNh +kwP +kwP +kwP cNc cTU cVS @@ -141370,7 +141318,7 @@ cQT cSE cUt cWj -cXG +xJl cZt dbc dcO diff --git a/_maps/cit_map_files/MetaStation/MetaStation.dmm b/_maps/cit_map_files/MetaStation/MetaStation.dmm index 96021ab0f9..74cdbe936c 100644 --- a/_maps/cit_map_files/MetaStation/MetaStation.dmm +++ b/_maps/cit_map_files/MetaStation/MetaStation.dmm @@ -188,7 +188,7 @@ }, /obj/machinery/camera{ c_tag = "Prison Hydroponics"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -1035,7 +1035,7 @@ /obj/machinery/camera{ c_tag = "Prison Chamber"; dir = 1; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -1120,7 +1120,7 @@ /obj/machinery/camera{ c_tag = "Prison Sanitarium"; dir = 2; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/whitered/side{ dir = 1 @@ -1425,7 +1425,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 3"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -1448,7 +1448,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 2"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -1480,7 +1480,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Prison Cell 1"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) @@ -1533,8 +1533,7 @@ /obj/structure/lattice, /obj/machinery/camera/motion{ c_tag = "Armory - External"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/space, /area/space/nearstation) @@ -2147,12 +2146,12 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/machinery/camera{ c_tag = "Prison Hallway Port"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/red/corner{ dir = 2 @@ -2218,7 +2217,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /turf/open/floor/plasteel/red/corner{ @@ -2295,7 +2294,7 @@ /obj/machinery/camera{ c_tag = "Prison Hallway Starboard"; dir = 2; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/red/corner{ dir = 2 @@ -2399,8 +2398,7 @@ }, /obj/machinery/camera{ c_tag = "Head of Security's Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) @@ -3421,8 +3419,7 @@ pixel_y = 8 }, /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) @@ -3562,8 +3559,7 @@ /obj/machinery/light, /obj/machinery/camera/motion{ c_tag = "Armory - Internal"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/vault, /area/ai_monitored/security/armory) @@ -3622,7 +3618,7 @@ desc = "Used for watching certain areas."; dir = 1; name = "Head of Security's Monitor"; - network = list("Prison","MiniSat","tcomm"); + network = list("prison","minisat","tcomm"); pixel_y = -30 }, /turf/open/floor/plasteel/vault, @@ -3925,8 +3921,7 @@ /obj/machinery/light/small, /obj/machinery/camera{ c_tag = "Security - EVA Storage"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -3991,8 +3986,7 @@ /obj/effect/landmark/blobstart, /obj/machinery/camera{ c_tag = "Evidence Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/item/storage/secure/safe{ name = "evidence safe"; @@ -4446,7 +4440,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /turf/open/floor/plasteel/vault, @@ -4922,8 +4916,7 @@ }, /obj/machinery/camera{ c_tag = "Security - Secure Gear Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/flasher/portable, /obj/effect/turf_decal/bot, @@ -5182,8 +5175,7 @@ }, /obj/machinery/camera{ c_tag = "Firing Range"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -5322,10 +5314,6 @@ "alq" = ( /turf/closed/wall, /area/maintenance/starboard) -"alr" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/starboard) "als" = ( /obj/machinery/light{ dir = 8 @@ -6050,8 +6038,7 @@ "amM" = ( /obj/machinery/camera{ c_tag = "Gravity Generator Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -6349,8 +6336,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Security - Office - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/red/side{ dir = 8 @@ -6749,8 +6735,7 @@ }, /obj/machinery/camera{ c_tag = "Brig - Infirmary"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/item/clothing/under/rank/medical/purple{ pixel_y = -4 @@ -7464,8 +7449,7 @@ }, /obj/machinery/camera{ c_tag = "Warden's Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/rack, /obj/item/storage/toolbox/mechanical{ @@ -7508,8 +7492,7 @@ /obj/structure/closet/wardrobe/red, /obj/machinery/camera{ c_tag = "Security - Gear Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) @@ -7567,8 +7550,7 @@ }, /obj/machinery/camera{ c_tag = "Security - Office - Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/red/side{ @@ -7776,8 +7758,7 @@ pixel_y = 8 }, /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) @@ -7976,7 +7957,7 @@ "aqY" = ( /obj/machinery/computer/security{ name = "Labor Camp Monitoring"; - network = list("Labor") + network = list("labor") }, /turf/open/floor/plasteel/dark, /area/security/brig) @@ -7992,7 +7973,7 @@ desc = "Used for watching Prison Wing holding areas."; dir = 2; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_x = -30 }, /turf/open/floor/plasteel/showroomfloor, @@ -9947,8 +9928,7 @@ }, /obj/machinery/camera{ c_tag = "Brig - Hallway - Entrance"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/red/corner{ dir = 4 @@ -10927,8 +10907,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Brig - Hallway - Port"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/door_timer{ id = "Cell 1"; @@ -11100,8 +11079,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Brig - Hallway - Starboard"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/red/corner{ dir = 2 @@ -11269,6 +11247,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "axN" = ( @@ -11372,17 +11353,21 @@ req_one_access_txt = "0" }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "axV" = ( /obj/structure/sign/warning/securearea{ pixel_y = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axW" = ( /obj/structure/disposalpipe/segment, @@ -11392,10 +11377,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axX" = ( /obj/machinery/light_switch{ @@ -11411,41 +11395,21 @@ /obj/structure/sign/warning/securearea{ pixel_y = 32 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 5 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axY" = ( /turf/closed/wall/r_wall, /area/engine/engineering) -"axZ" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"aya" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "ayc" = ( -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/mask/breath{ - pixel_x = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-4" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) -"aye" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) "ayf" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/glass{ @@ -11788,46 +11752,59 @@ dir = 1; pixel_y = 2 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, /area/engine/engineering) "ayT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "ayV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "ayW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"ayX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) -"aza" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +"ayX" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aza" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "azb" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, @@ -11839,13 +11816,18 @@ }, /area/security/brig) "azd" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aze" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-22" @@ -12231,7 +12213,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/item/device/flashlight/lamp/green{ @@ -12284,6 +12266,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -12473,13 +12458,20 @@ "aAo" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "aAp" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/item/clothing/suit/hooded/wintercoat/engineering, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, /area/engine/engineering) "aAr" = ( /obj/item/device/radio/intercom{ @@ -12490,18 +12482,14 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aAt" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, @@ -12515,27 +12503,21 @@ sortType = 4 }, /obj/effect/landmark/start/station_engineer, +/obj/structure/cable/white{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/engine/engineering) "aAv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/engineering) -"aAw" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "aAx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, /area/engine/engineering) "aAz" = ( /obj/structure/table/wood, @@ -12559,7 +12541,7 @@ id = "mining_home"; name = "mining shuttle bay"; width = 7; - roundstart_template = /datum/map_template/shuttle/mining/box; + roundstart_template = /datum/map_template/shuttle/mining/box }, /turf/open/space/basic, /area/space) @@ -12762,7 +12744,7 @@ id = "laborcamp_home"; name = "fore bay 1"; width = 9; - roundstart_template = /datum/map_template/shuttle/labour/box; + roundstart_template = /datum/map_template/shuttle/labour/box }, /turf/open/space/basic, /area/space) @@ -12782,8 +12764,7 @@ }, /obj/machinery/camera{ c_tag = "Labor Shuttle Dock"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/flasher{ id = "PRelease"; @@ -12894,8 +12875,7 @@ /obj/effect/landmark/blobstart, /obj/machinery/camera{ c_tag = "Detective's Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) @@ -13115,8 +13095,7 @@ "aBG" = ( /obj/machinery/camera{ c_tag = "Engineering - Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/suit_storage_unit/engine, /obj/effect/turf_decal/bot{ @@ -13156,18 +13135,14 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aBK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBL" = ( @@ -13179,9 +13154,6 @@ }, /obj/machinery/rnd/circuit_imprinter, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBM" = ( @@ -13191,9 +13163,6 @@ }, /obj/machinery/rnd/protolathe/department/engineering, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBN" = ( @@ -13202,21 +13171,10 @@ dir = 1 }, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"aBQ" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) "aBS" = ( /obj/item/stack/ore/silver, @@ -13230,8 +13188,7 @@ /obj/structure/reagent_dispensers/fueltank, /obj/machinery/camera{ c_tag = "Mining Dock"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -13259,8 +13216,7 @@ }, /obj/machinery/camera{ c_tag = "Mining Office"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/mineral/equipment_vendor, /turf/open/floor/plasteel/brown{ @@ -13336,8 +13292,7 @@ "aCg" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/light, /obj/structure/cable/yellow{ @@ -13732,9 +13687,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aCV" = ( @@ -13744,38 +13696,29 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "aCW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"aCX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel, /area/engine/engineering) "aCY" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/space) "aCZ" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "aDa" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -13939,8 +13882,7 @@ }, /obj/machinery/camera{ c_tag = "Fore Primary Hallway Cells"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -14057,8 +13999,7 @@ }, /obj/machinery/camera{ c_tag = "Brig - Desk"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/item/device/radio/intercom{ freerange = 0; @@ -14379,10 +14320,9 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aEo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -14405,31 +14345,16 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aEq" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aEr" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Fore Port"; + dir = 4; + network = list("singularity") }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, /area/engine/engineering) "aEt" = ( /obj/structure/table, @@ -14448,7 +14373,7 @@ "aEv" = ( /obj/machinery/computer/security/mining{ dir = 4; - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) @@ -14777,8 +14702,7 @@ }, /obj/machinery/camera{ c_tag = "Restrooms"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) @@ -14968,10 +14892,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 2 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aFw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -14989,52 +14912,26 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aFz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) "aFA" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFB" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/rack, +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = -26; + req_access_txt = "11" }, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/black, +/obj/item/wrench, +/obj/item/clothing/glasses/meson/engine, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aFD" = ( -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/meter, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/turf/open/floor/engine, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFE" = ( /obj/structure/table/wood, @@ -15215,8 +15112,7 @@ }, /obj/machinery/camera{ c_tag = "Storage Wing - Security Access Door"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light/small{ dir = 8 @@ -15457,7 +15353,7 @@ desc = "Used for watching Prison Wing holding areas."; dir = 1; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = -30 }, /obj/item/restraints/handcuffs, @@ -15782,10 +15678,9 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aGW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -15796,31 +15691,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) -"aGY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "aGZ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "External Gas to Loop" +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"aHa" = ( -/obj/structure/cable/white, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "aHb" = ( /obj/machinery/camera{ @@ -16225,6 +16103,9 @@ lootcount = 2; name = "2maintenance loot spawner" }, +/obj/machinery/light/small{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aHW" = ( @@ -16241,42 +16122,21 @@ dir = 8; pixel_x = -24 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aHY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"aHZ" = ( -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/effect/turf_decal/delivery, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aIc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating, -/area/engine/engineering) "aIe" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering) +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space) "aIf" = ( /obj/machinery/camera{ c_tag = "Auxillary Base Construction"; @@ -16352,8 +16212,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo Bay - Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/sign/map/right{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -16478,8 +16337,7 @@ "aIt" = ( /obj/machinery/camera{ c_tag = "Cargo Bay - Storage Wing Entrance"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -16544,8 +16402,7 @@ }, /obj/machinery/camera{ c_tag = "Storage Wing"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/light, /obj/structure/cable/yellow{ @@ -16745,8 +16602,7 @@ }, /obj/machinery/camera{ c_tag = "Courtroom"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/blue/side{ dir = 1 @@ -16795,7 +16651,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /turf/open/floor/wood, @@ -16945,8 +16801,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Secure Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plating, /area/engine/engineering) @@ -16958,34 +16813,13 @@ /obj/structure/table, /obj/item/airlock_painter, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aJp" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/machinery/light{ - dir = 4 +/turf/open/floor/plasteel/yellow/side{ + dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel, /area/engine/engineering) "aJu" = ( /turf/open/floor/plating, /area/engine/engineering) -"aJv" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "aJB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -17432,12 +17266,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"aKA" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aKB" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -17451,53 +17279,26 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/engine/engineering) -"aKF" = ( -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_x = 24; - req_access_txt = "10" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "aKG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +/obj/structure/particle_accelerator/end_cap{ + icon_state = "end_cap"; dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "aKH" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Gas to Chamber"; - on = 0 +/obj/structure/particle_accelerator/fuel_chamber{ + icon_state = "fuel_chamber"; + dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "aKI" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 +/obj/structure/particle_accelerator/power_box{ + icon_state = "power_box"; + dir = 4 }, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"aKL" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Mix Bypass"; - on = 0 - }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "aKN" = ( /obj/machinery/door/poddoor{ @@ -17792,7 +17593,7 @@ /obj/structure/table, /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Fore"; - network = list("SS13","RD","AIUpload") + network = list("ss13","rd","aiupload") }, /obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 @@ -17891,8 +17692,7 @@ /obj/machinery/photocopier, /obj/machinery/camera{ c_tag = "Law Office"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/wood, /area/lawoffice) @@ -17962,8 +17762,7 @@ /obj/structure/disposalpipe/trunk, /obj/machinery/camera{ c_tag = "Locker Room Starboard"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/sign/warning/pods{ pixel_y = 30 @@ -18050,12 +17849,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/engine/engineering) -"aMc" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aMd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -18076,62 +17869,52 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aMg" = ( -/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" +/turf/open/floor/plasteel/yellow/side{ + dir = 4 }, -/turf/open/floor/plating, /area/engine/engineering) "aMh" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aMi" = ( /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "1-8" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"aMi" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Gas to Filter" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aMj" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) "aMk" = ( -/turf/open/floor/engine, -/area/engine/supermatter) -"aMm" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel/dark, +/obj/machinery/particle_accelerator/control_box, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, /area/engine/engineering) "aMo" = ( -/obj/structure/reflector/box/anchored{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "aMq" = ( /obj/structure/window/reinforced, /turf/open/space, @@ -18200,8 +17983,7 @@ /area/quartermaster/storage) "aMA" = ( /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/rack, /obj/item/storage/toolbox/electrical{ @@ -18579,7 +18361,9 @@ maxcharge = 15000 }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 10 + }, /area/engine/engineering) "aNr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -18589,17 +18373,27 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aNu" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Gas to Filter"; - on = 0 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Particle Accelerator"; + dir = 1; + network = list("singularity") + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) "aNv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) "aNw" = ( /obj/structure/window/reinforced{ dir = 4 @@ -18772,8 +18566,7 @@ /area/quartermaster/qm) "aNP" = ( /obj/machinery/camera/autoname{ - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -19245,8 +19038,7 @@ /obj/machinery/disposal/bin, /obj/machinery/camera{ c_tag = "Garden"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/disposalpipe/trunk{ dir = 8 @@ -19265,10 +19057,9 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aOP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -19291,26 +19082,12 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aOR" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ +"aOS" = ( +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aOS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_y = 21 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space) "aOT" = ( /obj/structure/window/reinforced{ dir = 4 @@ -19556,8 +19333,7 @@ }, /obj/machinery/camera{ c_tag = "Tool Storage"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/brown{ dir = 4 @@ -19637,8 +19413,7 @@ }, /obj/machinery/camera{ c_tag = "Fore Primary Hallway Aft"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/red/corner{ dir = 2 @@ -19838,8 +19613,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Power Monitoring"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/modular_computer/console/preset/engineering, /turf/open/floor/plasteel/vault, @@ -19857,41 +19631,32 @@ icon_state = "2-8" }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "aPZ" = ( /obj/machinery/vending/tool, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aQa" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/turf/open/floor/plasteel/yellow/side{ + dir = 1 }, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/open/floor/plasteel, /area/engine/engineering) "aQd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/rack, +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = 26; + req_access_txt = "11" }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ +/obj/item/storage/belt/utility, +/obj/item/weldingtool, +/obj/item/clothing/head/welding, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/engine, -/area/engine/engineering) -"aQe" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, /area/engine/engineering) "aQf" = ( /obj/structure/chair{ @@ -19979,8 +19744,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo Bay - Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/item/paper_bin{ pixel_x = -1; @@ -19997,7 +19761,7 @@ "aQq" = ( /obj/machinery/computer/security/mining{ dir = 4; - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /obj/machinery/light_switch{ pixel_x = -23 @@ -20111,7 +19875,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Port"; dir = 1; - network = list("SS13","RD","AIUpload") + network = list("ss13","rd","aiupload") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai_upload) @@ -20134,7 +19898,7 @@ /obj/machinery/camera/motion{ c_tag = "AI Upload Chamber - Starboard"; dir = 1; - network = list("SS13","RD","AIUpload") + network = list("ss13","rd","aiupload") }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai_upload) @@ -20248,8 +20012,7 @@ }, /obj/machinery/camera{ c_tag = "Crew Quarters Entrance"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -20498,19 +20261,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aRo" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, /area/engine/engineering) "aRp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -20522,9 +20275,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aRq" = ( @@ -20551,13 +20301,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"aRv" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "aRy" = ( /turf/closed/wall/r_wall, /area/aisat) @@ -20974,10 +20717,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aSu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -21006,9 +20748,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) "aSx" = ( @@ -21019,36 +20759,39 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/engineering) "aSz" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/pen, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, +/obj/item/paper_bin{ + layer = 2.9 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/table/glass, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "aSA" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 3 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 5 - }, -/turf/open/floor/engine, +/obj/item/book/manual/wiki/engineering_construction, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/obj/item/device/flashlight, +/turf/open/floor/plasteel, /area/engine/engineering) "aSB" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aSD" = ( @@ -21366,8 +21109,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Courtroom - Gallery"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/dark, /area/security/courtroom) @@ -21458,8 +21200,7 @@ }, /obj/machinery/camera{ c_tag = "Locker Room Port"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 2 @@ -21535,10 +21276,9 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aTG" = ( /obj/structure/disposalpipe/segment{ @@ -21550,26 +21290,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aTH" = ( /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, +/obj/machinery/light, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aTI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -21580,9 +21312,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -21595,31 +21324,6 @@ /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aTM" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aTN" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"aTO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aTQ" = ( @@ -21655,7 +21359,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Fore Port"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -21707,7 +21411,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Fore Starboard"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -21757,8 +21461,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo Bay - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/conveyor{ dir = 1; @@ -21957,7 +21660,7 @@ desc = "Used for watching the AI Upload."; dir = 4; name = "AI Upload Monitor"; - network = list("AIUpload"); + network = list("aiupload"); pixel_x = -29 }, /turf/open/floor/plasteel/vault{ @@ -21983,12 +21686,12 @@ desc = "Used for watching areas on the MiniSat."; dir = 8; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_x = 29 }, /obj/machinery/camera/motion{ c_tag = "AI Upload Foyer"; - network = list("SS13","RD","AIUpload") + network = list("ss13","rd","aiupload") }, /obj/machinery/airalarm{ pixel_y = 26 @@ -22225,7 +21928,9 @@ "aUY" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/wardrobe/engineering_yellow, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 10 + }, /area/engine/engineering) "aUZ" = ( /obj/structure/disposalpipe/segment, @@ -22236,8 +21941,8 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/turf/open/floor/plasteel{ - dir = 1 +/turf/open/floor/plasteel/yellow/side{ + dir = 6 }, /area/engine/engineering) "aVa" = ( @@ -22274,31 +21979,13 @@ dir = 4 }, /obj/structure/closet/secure_closet/engineering_electrical, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aVe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"aVf" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/engineering{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aVh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aVk" = ( /obj/structure/window/reinforced{ @@ -22334,7 +22021,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Fore"; dir = 2; - network = list("RD") + network = list("rd") }, /obj/structure/showcase/cyborg/old{ dir = 2; @@ -22402,8 +22089,7 @@ /obj/structure/chair, /obj/machinery/camera{ c_tag = "Arrivals - Fore Arm - Far"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -22584,7 +22270,7 @@ }, /obj/machinery/computer/security/mining{ dir = 8; - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -22688,8 +22374,7 @@ "aWd" = ( /obj/machinery/camera{ c_tag = "Central Primary Hallway - Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -22840,8 +22525,10 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aWu" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/airlock/external{ + name = "Escape Pod Four"; + req_access = null; + req_access_txt = "32" }, /turf/open/floor/plating, /area/maintenance/starboard) @@ -22929,18 +22616,16 @@ dir = 1 }, /area/engine/engineering) -"aWH" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) "aWK" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 +/obj/structure/cable/white{ + icon_state = "2-4" }, -/turf/open/space, -/area/space/nearstation) +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aWL" = ( /obj/machinery/ai_status_display{ pixel_x = -32 @@ -23063,8 +22748,7 @@ }, /obj/machinery/camera{ c_tag = "Arrivals - Fore Arm"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light{ dir = 4 @@ -23183,8 +22867,7 @@ /obj/structure/table/reinforced, /obj/machinery/camera{ c_tag = "Security Post - Cargo"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/red/side, /area/security/checkpoint/supply) @@ -23368,8 +23051,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Fore - AI Upload"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/sign/warning/securearea{ desc = "A warning sign which reads 'HIGH-POWER TURRETS AHEAD'."; @@ -23785,8 +23467,7 @@ }, /obj/machinery/camera{ c_tag = "Chief Engineer's Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -23841,17 +23522,20 @@ /turf/closed/wall, /area/security/checkpoint/engineering) "aYx" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aYy" = ( /obj/machinery/camera{ c_tag = "AI Chamber - Port"; dir = 4; - network = list("RD") + network = list("rd") }, /obj/structure/showcase/cyborg/old{ dir = 4; @@ -23997,8 +23681,7 @@ "aYP" = ( /obj/machinery/camera{ c_tag = "Cargo Bay - Aft"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -24565,7 +24248,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Core"; dir = 2; - network = list("RD") + network = list("rd") }, /turf/open/floor/plasteel/vault{ dir = 10 @@ -24968,8 +24651,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Fore - Port Corner"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -25150,8 +24832,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Fore - Courtroom"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 8 @@ -25219,8 +24900,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Fore - Starboard Corner"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral/corner{ dir = 4 @@ -25464,7 +25144,7 @@ desc = "Used for monitoring the engine."; dir = 8; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_x = 32 }, /turf/open/floor/plasteel/vault{ @@ -25503,8 +25183,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Entrance"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -25519,7 +25198,7 @@ /obj/machinery/computer/security/telescreen{ dir = 4; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_x = -29 }, /turf/open/floor/plasteel/red/side{ @@ -25577,7 +25256,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Starboard"; dir = 8; - network = list("RD") + network = list("rd") }, /obj/structure/showcase/cyborg/old{ dir = 8; @@ -25731,8 +25410,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo - Foyer"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/brown{ dir = 4 @@ -25842,8 +25520,7 @@ "bcr" = ( /obj/machinery/camera{ c_tag = "Auxiliary Tool Storage"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/airalarm{ dir = 8; @@ -26062,7 +25739,7 @@ desc = "Used for monitoring the engine."; dir = 8; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_x = 32 }, /turf/open/floor/plasteel/red/side{ @@ -26166,8 +25843,7 @@ }, /obj/machinery/camera{ c_tag = "Customs Checkpoint"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/red/side{ dir = 1 @@ -26687,7 +26363,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_y = -30 }, /turf/open/floor/plasteel/vault{ @@ -26754,8 +26430,7 @@ "bem" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/button/door{ desc = "A remote control-switch for the engineering security doors."; @@ -26835,7 +26510,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Port Fore"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -26876,7 +26551,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Starboard Fore"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -27046,8 +26721,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo - Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/brown{ dir = 8 @@ -27117,8 +26791,7 @@ /obj/item/reagent_containers/spray/cleaner, /obj/machinery/camera{ c_tag = "Custodial Closet"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light/small{ dir = 8 @@ -27321,8 +26994,7 @@ /obj/effect/landmark/start/captain, /obj/machinery/camera{ c_tag = "Captain's Quarters"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/wood, /area/crew_quarters/heads/captain/private) @@ -28105,8 +27777,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge - Central"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/table/glass, /turf/open/floor/plasteel/darkbrown/side{ @@ -28331,8 +28002,7 @@ }, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway - Tech Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/yellow/corner{ dir = 1 @@ -28626,7 +28296,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Space Access"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -28669,7 +28339,7 @@ /obj/machinery/camera{ c_tag = "AI Chamber - Aft"; dir = 1; - network = list("RD") + network = list("rd") }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, @@ -29569,8 +29239,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo - Mailroom"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/arrival{ dir = 2 @@ -29856,7 +29525,7 @@ icon_state = "2-4" }, /obj/machinery/computer/security/mining{ - network = list("MINE","AuxBase") + network = list("mine","auxbase") }, /obj/machinery/keycard_auth{ pixel_y = 24 @@ -30071,8 +29740,7 @@ }, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway - Auxiliary Tool Storage"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/caution/corner{ dir = 8 @@ -30114,8 +29782,7 @@ }, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway - Engineering"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/caution/corner{ dir = 8 @@ -30610,7 +30277,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /turf/open/floor/wood, @@ -30786,8 +30453,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge - Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/darkblue/side{ dir = 4 @@ -31029,8 +30695,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Foyer - Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel, /area/engine/break_room) @@ -31226,7 +30891,7 @@ /obj/machinery/camera{ c_tag = "MiniSat - Antechamber"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -31352,8 +31017,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Arrivals - Station Entrance"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -31475,8 +31139,7 @@ }, /obj/machinery/camera{ c_tag = "Port Primary Hallway - Middle"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -31649,8 +31312,7 @@ /obj/structure/cable/yellow, /obj/machinery/camera{ c_tag = "Bridge - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/darkblue/side{ dir = 8 @@ -31808,8 +31470,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Starboard - Art Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/neutral/corner{ @@ -31882,8 +31543,7 @@ /obj/item/gun/ballistic/revolver/doublebarrel, /obj/machinery/camera{ c_tag = "Bar - Backroom"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/wood, /area/crew_quarters/bar) @@ -32095,7 +31755,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Fore"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, @@ -32110,9 +31770,6 @@ dir = 6 }, /area/security/checkpoint/customs) -"bpu" = ( -/turf/closed/wall/r_wall, -/area/space/nearstation) "bpv" = ( /obj/structure/sign/warning/securearea{ pixel_y = 32 @@ -32495,8 +32152,7 @@ }, /obj/machinery/camera{ c_tag = "Arrivals - Lounge"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/landmark/start/assistant, /turf/open/floor/plasteel/grimy, @@ -32816,7 +32472,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_y = -29 }, /turf/open/floor/plasteel/darkblue/side{ @@ -33285,8 +32941,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering - Foyer - Port"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/table/glass, /turf/open/floor/plasteel/cafeteria{ @@ -33456,7 +33111,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior Access"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/power/apc{ aidisabled = 0; @@ -33550,7 +33205,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 4; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_x = -28 }, /turf/open/floor/plasteel/vault{ @@ -33572,7 +33227,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Foyer"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/darkblue/corner{ dir = 8 @@ -33630,7 +33285,7 @@ /obj/machinery/computer/security/telescreen{ dir = 8; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_x = 28 }, /turf/open/floor/plasteel/vault{ @@ -33655,7 +33310,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_y = -29 }, /turf/open/floor/plasteel/dark, @@ -33679,7 +33334,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Maintenance"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -33904,8 +33559,7 @@ }, /obj/machinery/camera{ c_tag = "Port Primary Hallway - Starboard"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 8 @@ -34050,8 +33704,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge - Command Chair"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/carpet, /area/bridge) @@ -34424,7 +34077,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_y = -28 }, /turf/open/floor/plasteel/darkblue/corner, @@ -34555,8 +34208,7 @@ }, /obj/machinery/camera{ c_tag = "Port Primary Hallway - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/dark, /area/hallway/primary/port) @@ -34870,8 +34522,7 @@ "buJ" = ( /obj/machinery/camera{ c_tag = "Captain's Office"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/carpet, /area/crew_quarters/heads/captain/private) @@ -34883,8 +34534,7 @@ }, /obj/machinery/camera{ c_tag = "Captain's Office - Emergency Escape"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating{ icon_state = "platingdmg2" @@ -35173,8 +34823,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/machinery/camera{ c_tag = "Engineering - Transit Tube Access"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/corner{ dir = 2 @@ -35659,8 +35308,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge - Port Access"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/darkblue/corner{ dir = 1 @@ -35699,8 +35347,7 @@ "bwv" = ( /obj/machinery/camera{ c_tag = "Council Chamber"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/light{ dir = 1 @@ -35737,8 +35384,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge - Starboard Access"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/darkblue/corner, /area/bridge) @@ -35886,8 +35532,7 @@ "bwM" = ( /obj/machinery/camera{ c_tag = "Bar"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/requests_console{ department = "Bar"; @@ -35985,8 +35630,7 @@ }, /obj/machinery/camera{ c_tag = "Club - Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/wood, /area/crew_quarters/bar) @@ -36182,8 +35826,7 @@ "bxu" = ( /obj/machinery/camera{ c_tag = "Arrivals - Middle Arm - Far"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/status_display{ pixel_y = -32 @@ -36229,8 +35872,7 @@ }, /obj/machinery/camera{ c_tag = "Arrivals - Middle Arm"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -36885,8 +36527,7 @@ pixel_y = 32 }, /obj/machinery/camera{ - c_tag = "Atmospherics - Control Room"; - network = list("SS13") + c_tag = "Atmospherics - Control Room" }, /obj/machinery/computer/station_alert, /turf/open/floor/plasteel/caution{ @@ -36954,8 +36595,7 @@ icon_state = "0-2" }, /obj/machinery/camera{ - c_tag = "Atmospherics - Entrance"; - network = list("SS13") + c_tag = "Atmospherics - Entrance" }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -37041,8 +36681,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ - c_tag = "Atmospherics - Distro Loop"; - network = list("SS13") + c_tag = "Atmospherics - Distro Loop" }, /turf/open/floor/plasteel/caution{ dir = 1 @@ -37110,7 +36749,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Port Aft"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -37202,7 +36841,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Starboard Aft"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/dark, /area/aisat) @@ -37281,8 +36920,7 @@ dir = 4 }, /obj/machinery/camera/autoname{ - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, @@ -37493,7 +37131,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); + network = list("minisat","tcomm"); pixel_y = -29 }, /obj/structure/bed/dogbed/renault, @@ -37640,8 +37278,7 @@ }, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway - Atmospherics"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/arrival{ dir = 8 @@ -37859,8 +37496,7 @@ "bAZ" = ( /obj/machinery/camera{ c_tag = "Head of Personnel's Office"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/table/wood, /obj/item/storage/box/PDAs{ @@ -38565,7 +38201,6 @@ /obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/space, /area/space/nearstation) "bCA" = ( @@ -38670,8 +38305,7 @@ /obj/machinery/light/small, /obj/machinery/camera{ c_tag = "Auxilary Restrooms"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/crew_quarters/toilet/auxiliary) @@ -38948,8 +38582,7 @@ }, /obj/machinery/camera{ c_tag = "Command Hallway - Starboard"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/neutral/corner{ dir = 4 @@ -39246,7 +38879,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Fore-Port"; dir = 2; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) @@ -39277,7 +38910,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Fore-Starboard"; dir = 2; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) @@ -39376,8 +39009,7 @@ pixel_x = -32 }, /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/displaycase/trophy, /turf/open/floor/wood, @@ -39511,8 +39143,7 @@ }, /obj/machinery/camera{ c_tag = "Command Hallway - Port"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 8 @@ -40310,8 +39941,7 @@ "bGb" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - Mix"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/vacuum, /area/engine/atmos) @@ -40432,8 +40062,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Port"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral/corner{ dir = 2 @@ -40565,8 +40194,7 @@ }, /obj/machinery/camera{ c_tag = "Command Hallway - Central"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral/corner{ dir = 2 @@ -41358,8 +40986,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Kitchen Hatch"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) @@ -41641,7 +41268,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Control Room"; dir = 1; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /obj/structure/table/wood, /obj/item/pen, @@ -42181,8 +41808,7 @@ "bKn" = ( /obj/machinery/camera{ c_tag = "Club - Aft"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/computer/security/telescreen/entertainment{ pixel_y = -29 @@ -42404,7 +42030,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Aft Starboard"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /obj/structure/window/reinforced{ dir = 4 @@ -42457,8 +42083,7 @@ }, /obj/machinery/camera{ c_tag = "Arrivals - Aft Arm"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/arrival{ dir = 4 @@ -42793,8 +42418,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Starboard - Kitchen"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -42921,8 +42545,7 @@ }, /obj/machinery/camera{ c_tag = "Telecomms - Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/dark, /area/storage/tcom) @@ -43002,8 +42625,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics - Central"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, @@ -43032,10 +42654,6 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) -"bMi" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) "bMj" = ( /obj/machinery/holopad, /turf/open/floor/plasteel, @@ -43073,8 +42691,7 @@ "bMn" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - N2O"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/n2o, /area/engine/atmos) @@ -43089,7 +42706,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft-Port"; dir = 4; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) @@ -43127,7 +42744,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft-Starboard"; dir = 8; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /obj/structure/cable/yellow{ icon_state = "0-8" @@ -43146,8 +42763,7 @@ "bMu" = ( /obj/machinery/camera{ c_tag = "Arrivals - Aft Arm - Far"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -43325,8 +42941,7 @@ /obj/item/folder, /obj/item/folder, /obj/machinery/camera/autoname{ - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/table/wood, /obj/item/device/taperecorder, @@ -43435,8 +43050,7 @@ "bMZ" = ( /obj/machinery/camera{ c_tag = "Teleporter Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/rack, /obj/structure/window/reinforced{ @@ -43531,8 +43145,7 @@ /obj/item/clothing/glasses/sunglasses, /obj/machinery/camera{ c_tag = "Corporate Showroom"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/wood, /area/bridge/showroom/corporate) @@ -43591,8 +43204,7 @@ }, /obj/machinery/camera{ c_tag = "Gateway - Atrium"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/bot{ dir = 1 @@ -43921,7 +43533,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Aft Port"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /obj/structure/window/reinforced{ dir = 8 @@ -43944,7 +43556,7 @@ /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Aft"; dir = 1; - network = list("SS13","tcomm") + network = list("ss13","tcomm") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/ntnet_relay, @@ -45605,8 +45217,7 @@ }, /obj/machinery/camera{ c_tag = "Gateway - Access"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -45686,8 +45297,7 @@ /obj/item/kitchen/rollingpin, /obj/machinery/camera{ c_tag = "Kitchen"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/cafeteria{ dir = 2 @@ -45779,8 +45389,7 @@ }, /obj/machinery/camera{ c_tag = "Kitchen - Coldroom"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) @@ -45843,8 +45452,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -45901,8 +45509,7 @@ "bSl" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - Toxins"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/plasma, /area/engine/atmos) @@ -46366,8 +45973,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics - Starboard"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -46402,10 +46008,10 @@ /turf/closed/wall, /area/maintenance/solars/port/aft) "bTq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel, /area/engine/engineering) "bTr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -46453,8 +46059,7 @@ pixel_y = -24 }, /obj/machinery/camera/autoname{ - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/table/wood, /turf/open/floor/wood, @@ -46982,8 +46587,12 @@ }, /area/maintenance/starboard) "bUw" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/dark, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, /area/engine/engineering) "bUx" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -47470,7 +47079,6 @@ /turf/closed/wall, /area/hallway/secondary/service) "bVA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock{ name = "Service Hall"; req_access_txt = "null"; @@ -47619,8 +47227,7 @@ }, /obj/machinery/camera{ c_tag = "Aft Port Solar Maintenance"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) @@ -47801,8 +47408,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Aft-Port Corner"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 8 @@ -48018,8 +47624,7 @@ }, /obj/machinery/camera{ c_tag = "Central Primary Hallway - Aft-Starboard Corner"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/neutral/corner{ dir = 2 @@ -48233,6 +47838,9 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "bXc" = ( @@ -48405,8 +48013,7 @@ "bXs" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - CO2"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/co2, /area/engine/atmos) @@ -48561,8 +48168,7 @@ "bXQ" = ( /obj/machinery/camera{ c_tag = "Central Primary Hallway - Aft-Port"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/blue/corner{ dir = 8 @@ -48600,8 +48206,7 @@ "bXW" = ( /obj/machinery/camera{ c_tag = "Central Primary Hallway - Aft-Starboard"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/purple/corner{ dir = 2 @@ -48669,8 +48274,7 @@ /area/hallway/primary/central) "bYe" = ( /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /obj/item/book/manual/hydroponics_pod_people, /obj/item/paper/guides/jobs/hydroponics, @@ -48737,8 +48341,7 @@ dir = 4 }, /obj/machinery/camera/autoname{ - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/table/glass, /obj/effect/turf_decal/stripes/line{ @@ -48843,8 +48446,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics - Port-Aft"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/caution{ dir = 8 @@ -49125,7 +48727,7 @@ /obj/machinery/camera{ c_tag = "Security Post - Medbay"; dir = 2; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/red/side{ dir = 1 @@ -49831,7 +49433,7 @@ /obj/machinery/camera{ c_tag = "Research Division - Lobby"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/side{ dir = 1 @@ -50547,7 +50149,7 @@ /obj/machinery/camera{ c_tag = "Medbay Storage"; dir = 8; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/closet/crate/freezer/surplus_limbs, @@ -50573,7 +50175,7 @@ desc = "Used for monitoring medbay to ensure patient safety."; dir = 1; name = "Medbay Monitor"; - network = list("Medbay"); + network = list("medbay"); pixel_y = -29 }, /obj/item/device/radio/intercom{ @@ -50755,7 +50357,7 @@ desc = "Used for watching the RD's goons from the safety of his office."; dir = 8; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_x = 28; pixel_y = 2 }, @@ -50789,8 +50391,7 @@ /obj/item/paper/guides/jobs/hydroponics, /obj/machinery/camera{ c_tag = "Hydroponics - Foyer"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/item/device/radio/intercom{ pixel_y = -25 @@ -51093,8 +50694,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics - Starboard Aft"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/dark, /area/engine/atmos) @@ -51539,7 +51139,7 @@ /obj/machinery/camera{ c_tag = "Security Post - Research Division"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/red/side{ dir = 4 @@ -51908,7 +51508,7 @@ /obj/machinery/camera{ c_tag = "Medbay Foyer"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/side{ dir = 2 @@ -53294,7 +52894,7 @@ /obj/machinery/camera{ c_tag = "Experimentation Lab - Test Chamber"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light{ dir = 1 @@ -53413,7 +53013,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Exterior - Aft"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, @@ -53662,7 +53262,7 @@ /obj/machinery/camera{ c_tag = "Medbay Hallway Fore"; dir = 2; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/corner{ dir = 4 @@ -53890,7 +53490,7 @@ /obj/machinery/camera{ c_tag = "Research Division - Airlock"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -54041,8 +53641,7 @@ "cje" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - N2"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/n2, /area/engine/atmos) @@ -54056,8 +53655,7 @@ "cjh" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - O2"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/o2, /area/engine/atmos) @@ -54072,8 +53670,7 @@ "cjk" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - Air"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/engine/air, /area/engine/atmos) @@ -54234,7 +53831,7 @@ /obj/machinery/camera{ c_tag = "Medbay Sleepers"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/side{ dir = 10 @@ -55119,8 +54716,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Aft Primary Hallway - Fore"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/firealarm{ dir = 4; @@ -55305,7 +54901,7 @@ /obj/machinery/camera{ c_tag = "Research Division - Break Room"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/cafeteria{ dir = 5 @@ -55667,7 +55263,7 @@ /obj/machinery/camera{ c_tag = "Research and Development"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light_switch{ pixel_x = 27 @@ -56199,7 +55795,7 @@ /obj/machinery/camera{ c_tag = "Chemistry"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/machinery/light{ dir = 8 @@ -56394,7 +55990,7 @@ /obj/machinery/camera{ c_tag = "Research Division Hallway - Central"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/research) @@ -56781,7 +56377,7 @@ /obj/machinery/camera{ c_tag = "CMO's Office"; dir = 8; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/barber{ dir = 8 @@ -57306,23 +56902,23 @@ }, /area/maintenance/port/aft) "cpR" = ( +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = -26; + req_access_txt = "11" + }, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 10 }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Port"; - dir = 8; - network = list("SS13","Engine") +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/machinery/airalarm/engine{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "cpS" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -57816,7 +57412,7 @@ /obj/machinery/camera{ c_tag = "Research Division Hallway - Starboard"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/research) @@ -57901,7 +57497,7 @@ /obj/machinery/camera{ c_tag = "Experimentation Lab"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light, /turf/open/floor/plasteel/white, @@ -58089,7 +57685,7 @@ /obj/machinery/camera{ c_tag = "Medbay Cryo"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/item/screwdriver{ pixel_y = 6 @@ -58524,7 +58120,7 @@ /obj/machinery/camera{ c_tag = "Medbay Surgery"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/white, /area/medical/surgery) @@ -58587,7 +58183,7 @@ /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/side{ dir = 2 @@ -58611,7 +58207,7 @@ /obj/machinery/camera{ c_tag = "Medbay Hallway Central"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/corner{ dir = 8 @@ -58735,7 +58331,7 @@ desc = "Used for monitoring medbay to ensure patient safety."; dir = 8; name = "Medbay Monitor"; - network = list("Medbay"); + network = list("medbay"); pixel_x = 29 }, /obj/item/device/radio/intercom{ @@ -59004,7 +58600,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = 2 }, /obj/structure/table/reinforced, @@ -59127,7 +58723,7 @@ active_power_usage = 0; c_tag = "Turbine Vent"; dir = 4; - network = list("Turbine"); + network = list("turbine"); use_power = 0 }, /turf/open/space, @@ -59971,7 +59567,7 @@ /obj/machinery/camera{ c_tag = "Toxins Storage"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -60177,7 +59773,7 @@ /obj/machinery/camera{ c_tag = "Genetics Lab"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue, /area/medical/genetics) @@ -60717,7 +60313,7 @@ /obj/machinery/camera{ c_tag = "Genetics Desk"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/structure/table/glass, /turf/open/floor/plasteel/blue/side{ @@ -60802,7 +60398,7 @@ /obj/machinery/camera{ c_tag = "Research Division Hallway - Mech Bay"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/airalarm{ dir = 4; @@ -60879,7 +60475,7 @@ /obj/machinery/camera{ c_tag = "Research Director's Office"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light, /turf/open/floor/plasteel/cafeteria{ @@ -61242,7 +60838,7 @@ /obj/machinery/camera{ c_tag = "Mech Bay"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/circuit/green, /area/science/robotics/mechbay) @@ -61253,7 +60849,7 @@ /obj/machinery/camera{ c_tag = "Research Testing Range"; dir = 8; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_y = -22 }, /obj/machinery/airalarm{ @@ -61670,7 +61266,7 @@ /obj/machinery/camera{ c_tag = "Toxins - Lab"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/portable_atmospherics/canister, @@ -61856,7 +61452,7 @@ /obj/machinery/camera{ c_tag = "Genetics Cloning Lab"; dir = 8; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whiteblue/side{ dir = 6 @@ -62443,8 +62039,7 @@ }, /obj/machinery/camera{ c_tag = "Aft Primary Hallway - Middle"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -62799,7 +62394,7 @@ dir = 8; layer = 4; name = "Test Chamber Telescreen"; - network = list("Toxins"); + network = list("toxins"); pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ @@ -63237,7 +62832,7 @@ dir = 8; layer = 4; name = "Test Chamber Telescreen"; - network = list("Toxins"); + network = list("toxins"); pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ @@ -63328,7 +62923,7 @@ /obj/machinery/camera{ c_tag = "Medbay Break Room"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/cafeteria{ dir = 5 @@ -63715,7 +63310,7 @@ /obj/machinery/camera{ c_tag = "Medbay Hallway Aft"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/white/side{ dir = 5 @@ -63899,7 +63494,7 @@ /obj/machinery/camera{ c_tag = "Robotics - Fore"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -64060,7 +63655,7 @@ light = null; luminosity = 3; name = "Hardened Bomb-Test Camera"; - network = list("Toxins"); + network = list("toxins"); use_power = 0 }, /obj/item/target/alien/anchored, @@ -64978,7 +64573,7 @@ /obj/machinery/camera{ c_tag = "Research Division Hallway - Robotics"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/research) @@ -65047,7 +64642,7 @@ /obj/machinery/camera{ c_tag = "Toxins - Mixing Area"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -65107,7 +64702,7 @@ /obj/machinery/camera{ c_tag = "Virology - Cells"; dir = 4; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whitegreen/side{ dir = 9 @@ -66174,7 +65769,7 @@ /obj/machinery/camera{ c_tag = "Virology - Lab"; dir = 8; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/structure/sink{ dir = 4; @@ -66201,7 +65796,7 @@ /obj/machinery/camera{ c_tag = "Virology - Airlock"; dir = 1; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/machinery/light, /obj/structure/closet/l3closet, @@ -66233,7 +65828,7 @@ /obj/machinery/camera{ c_tag = "Virology - Entrance"; dir = 8; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/machinery/light/small{ dir = 4 @@ -66531,7 +66126,7 @@ /obj/machinery/camera{ c_tag = "Research Division - Server Room"; dir = 2; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_x = 22 }, /obj/machinery/power/apc{ @@ -66826,8 +66421,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Aft Primary Hallway - Aft"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/escape{ dir = 2 @@ -67585,7 +67179,7 @@ /obj/machinery/camera{ c_tag = "Virology - Break Room"; dir = 2; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /turf/open/floor/plasteel/whitegreen/side{ dir = 1 @@ -68280,7 +67874,7 @@ desc = "Used for watching the turbine vent."; dir = 8; name = "turbine vent monitor"; - network = list("Turbine"); + network = list("turbine"); pixel_x = 29 }, /obj/machinery/button/door{ @@ -68310,15 +67904,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/aft) -"cLE" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - name = "euthanization chamber freezer"; - on = 1; - target_temperature = 80 - }, -/turf/open/floor/plating, -/area/science/xenobiology) "cLF" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -68565,8 +68150,7 @@ }, /obj/machinery/camera{ c_tag = "Departure Lounge - Starboard Fore"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/structure/extinguisher_cabinet{ pixel_x = 27 @@ -68640,8 +68224,7 @@ }, /obj/machinery/camera{ c_tag = "Aft Starboard Solar Maintenance"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) @@ -68811,8 +68394,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel - Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/table/wood, /turf/open/floor/plasteel/vault, @@ -68983,7 +68565,6 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching output from station security cameras."; name = "Security Camera Monitor"; - network = list("SS13"); pixel_y = 30 }, /turf/open/floor/plasteel/red/side{ @@ -69192,8 +68773,7 @@ "cNu" = ( /obj/machinery/camera{ c_tag = "Chapel Office - Backroom"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/item/device/radio/intercom{ dir = 4; @@ -69524,8 +69104,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel Office"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/grimy, /area/chapel/office) @@ -69697,8 +69276,7 @@ }, /obj/machinery/camera{ c_tag = "Departure Lounge - Security Post"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/item/book/manual/wiki/security_space_law{ pixel_x = -4; @@ -70243,8 +69821,7 @@ "cPO" = ( /obj/machinery/camera{ c_tag = "Departure Lounge - Port Aft"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -70309,8 +69886,7 @@ "cPV" = ( /obj/machinery/camera{ c_tag = "Departure Lounge - Starboard Aft"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light{ dir = 4 @@ -70514,7 +70090,7 @@ /obj/machinery/camera{ c_tag = "Research Division Hallway - Xenobiology Lab Access"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/side{ dir = 1 @@ -70560,7 +70136,7 @@ /obj/machinery/camera{ c_tag = "Toxins - Launch Area"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/suit_storage_unit/rd, /obj/effect/turf_decal/bot{ @@ -70577,7 +70153,7 @@ /turf/open/floor/plasteel/vault, /area/chapel/main) "cQB" = ( -/obj/machinery/doppler_array{ +/obj/machinery/doppler_array/research/science{ dir = 4 }, /obj/item/device/radio/intercom{ @@ -70658,8 +70234,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel - Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/chapel{ dir = 4 @@ -70884,8 +70459,7 @@ "cRn" = ( /obj/machinery/camera{ c_tag = "Chapel - Port"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/chair/comfy/black{ dir = 4 @@ -71334,7 +70908,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #1"; dir = 4; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -71408,7 +70982,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #2"; dir = 8; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -71909,7 +71483,7 @@ /obj/machinery/computer/security/telescreen{ dir = 1; name = "Test Chamber Monitor"; - network = list("Xeno"); + network = list("xeno"); pixel_y = 2 }, /obj/structure/table/reinforced, @@ -72253,6 +71827,12 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) +"cWu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cWA" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -72289,18 +71869,6 @@ /obj/structure/easel, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"cXz" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Aft"; - dir = 1; - network = list("SS13","Engine") - }, -/turf/open/floor/engine, -/area/engine/engineering) "cXA" = ( /turf/closed/wall/r_wall, /area/security/checkpoint/engineering) @@ -72313,7 +71881,12 @@ }, /area/construction/mining/aux_base) "cXI" = ( -/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cXR" = ( @@ -72325,11 +71898,12 @@ }, /area/construction/mining/aux_base) "cXZ" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/window/reinforced{ - dir = 8 +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/starboard) "cYc" = ( @@ -72342,15 +71916,16 @@ /obj/machinery/camera{ c_tag = "Robotics - Aft"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white/side{ dir = 1 }, /area/science/robotics/lab) "cYj" = ( -/obj/structure/closet/firecloset, -/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cYE" = ( @@ -72386,7 +71961,7 @@ desc = "Used for the Auxillary Mining Base."; dir = 1; name = "Auxillary Base Monitor"; - network = list("AuxBase"); + network = list("auxbase"); pixel_y = -28 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, @@ -72478,9 +72053,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"cZv" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cZR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -72582,7 +72154,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Test Chamber"; dir = 1; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -72643,28 +72215,24 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"daR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1; - external_pressure_bound = 140; - name = "server vent"; - pressure_checks = 0 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "daS" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/circuit/killroom, /area/science/xenobiology) "daW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = 26; + req_access_txt = "11" }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "daX" = ( /obj/structure/cable/yellow{ @@ -72674,27 +72242,20 @@ icon_state = "platingdmg2" }, /area/maintenance/port/fore) -"daY" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter) "daZ" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 +/obj/structure/particle_accelerator/particle_emitter/right{ + icon_state = "emitter_right"; + dir = 4 }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "dbb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/structure/particle_accelerator/particle_emitter/center{ + icon_state = "emitter_center"; + dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "dbd" = ( /obj/structure/sink/kitchen{ pixel_y = 28 @@ -72707,30 +72268,6 @@ }, /turf/open/floor/carpet, /area/crew_quarters/heads/hop) -"dbg" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dbh" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "dbj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -72760,7 +72297,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #3"; dir = 4; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -72771,7 +72308,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #4"; dir = 8; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -72784,7 +72321,7 @@ /obj/machinery/camera{ c_tag = "Morgue"; dir = 2; - network = list("SS13","Medbay") + network = list("ss13","medbay") }, /obj/structure/bodycontainer/morgue{ dir = 8 @@ -72798,7 +72335,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #5"; dir = 4; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -72809,7 +72346,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #6"; dir = 8; - network = list("SS13","RD","Xeno") + network = list("ss13","rd","xeno") }, /turf/open/floor/engine, /area/science/xenobiology) @@ -72818,15 +72355,6 @@ /obj/machinery/light/small, /turf/open/floor/circuit/killroom, /area/science/xenobiology) -"dbw" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Kill Chamber"; - dir = 1; - network = list("SS13","RD","Xeno"); - start_active = 1 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "dbE" = ( /obj/machinery/plantgenes, /obj/effect/turf_decal/stripes/line{ @@ -73059,7 +72587,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Fore"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/side{ dir = 1 @@ -73299,7 +72827,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Airlock"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -73492,7 +73020,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Central"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ @@ -73687,7 +73215,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Aft-Port"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -73702,7 +73230,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Lab - Aft-Starboard"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -73895,14 +73423,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"ddB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 1; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "ddC" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -73927,16 +73447,12 @@ /turf/open/floor/plating, /area/shuttle/auxillary_base) "ddO" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "ddP" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) @@ -73950,41 +73466,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"ddS" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Fore"; - dir = 4; - network = list("SS13","Engine") - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -26 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddT" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddU" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/obj/machinery/meter, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddV" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "ddW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, @@ -73997,28 +73482,14 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel, -/area/engine/engineering) -"ddY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engineering) "ddZ" = ( -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dea" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - volume_rate = 200 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, /turf/open/floor/plating/airless, -/area/engine/engineering) +/area/space) "deb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -74026,644 +73497,153 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"ded" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"dee" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "def" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"deh" = ( -/obj/structure/cable/white{ +/obj/structure/lattice/catwalk, +/obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"dei" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dej" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dek" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - name = "Mix to Gas" - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"del" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/space, +/area/space) "dem" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Mix" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"den" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dep" = ( -/obj/machinery/firealarm{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"deq" = ( -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_y = 21 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"der" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"des" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deu" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dev" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dew" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dex" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dey" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"deA" = ( -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"deB" = ( +/obj/structure/lattice/catwalk, /obj/structure/cable{ icon_state = "1-2" }, +/turf/open/space, +/area/space) +"den" = ( /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deC" = ( -/obj/effect/turf_decal/bot{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"der" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) -"deD" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"deI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, -/area/engine/engineering) -"deK" = ( -/obj/structure/cable/white, -/obj/machinery/power/emitter/anchored{ - dir = 2; +"dev" = ( +/obj/machinery/field/generator{ + anchored = 1; state = 2 }, -/turf/open/floor/plating, -/area/engine/engineering) -"deL" = ( -/obj/structure/cable/white, -/obj/machinery/light{ - dir = 4 +/turf/open/floor/plating/airless, +/area/space/nearstation) +"dew" = ( +/turf/open/space, +/area/space/nearstation) +"deB" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" }, -/turf/open/floor/plating, -/area/engine/engineering) -"deM" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"deN" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"deO" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) -"deS" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/engine, -/area/engine/supermatter) -"deU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"deD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" }, +/turf/open/floor/plating/airless, +/area/space) +"deM" = ( +/obj/structure/table, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, /area/engine/engineering) "deV" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"deW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Starboard"; - dir = 4; - network = list("SS13","Engine") +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"deX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space) "deY" = ( -/obj/structure/reflector/single/anchored{ - dir = 9 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "dfa" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) -"dfb" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfc" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, -/area/engine/engineering) -"dff" = ( -/obj/structure/reflector/double/anchored{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfg" = ( -/obj/structure/reflector/single/anchored{ - dir = 10 +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plating, /area/engine/engineering) "dfh" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dfi" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/table, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = 10 + }, +/turf/open/floor/plasteel/yellow/side{ dir = 4 }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, /area/engine/engineering) -"dfj" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfk" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"dfm" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) "dfp" = ( -/obj/effect/turf_decal/bot{ +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfq" = ( -/obj/machinery/camera{ - c_tag = "Supermatter Chamber"; - dir = 4; - network = list("Engine") - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"dft" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - filter_type = "n2" - }, -/turf/open/floor/engine, /area/engine/engineering) "dfz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dfA" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfB" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfC" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) "dfD" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/engineering_singularity_safety{ + pixel_x = 3; + pixel_y = 3 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/engineering_particle_accelerator{ + pixel_x = -3; + pixel_y = -3 }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/meter, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/turf/open/floor/plasteel, /area/engine/engineering) "dfI" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Cooling Loop Bypass" +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfJ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfM" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfO" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/space) "dfP" = ( /obj/structure/cable/white{ - icon_state = "4-8" + icon_state = "2-8" }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Atmos to Loop" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfQ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/engine, -/area/engine/engineering) -"dfR" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Gas to Cold Loop"; - on = 1 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfS" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfT" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfU" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Cold Loop to Gas"; - on = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfV" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfW" = ( -/obj/item/wrench, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) "dfX" = ( /obj/structure/disposalpipe/segment, @@ -74681,137 +73661,82 @@ }, /area/engine/engineering) "dfY" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "1-4" }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dfZ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "dga" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "2-8" }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dgb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, +/turf/open/floor/plating/airless, /area/engine/engineering) "dgc" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 +/obj/item/clothing/gloves/color/rainbow, +/obj/item/clothing/head/soft/rainbow, +/obj/item/clothing/shoes/sneakers/rainbow, +/obj/item/clothing/under/color/rainbow, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/turf/open/floor/plating, /area/maintenance/starboard) "dgd" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dge" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgf" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/cable/white{ + icon_state = "0-2" }, -/turf/open/space, -/area/space/nearstation) +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/emitter{ + anchored = 1; + dir = 1; + icon_state = "emitter"; + state = 2 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgg" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgh" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"dgi" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/plating, -/area/maintenance/starboard) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgj" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/structure/grille, +/obj/structure/cable/white{ + icon_state = "1-4" }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgk" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"dgo" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"dgp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"dgr" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"dgt" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgu" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) -"dgv" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgw" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgz" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/delivery, @@ -74819,134 +73744,13 @@ /turf/open/floor/plasteel, /area/engine/engineering) "dgA" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgB" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/machinery/light{ + dir = 4 }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plasteel, +/area/engine/engineering) "dgI" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"dgJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgK" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgM" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"dgN" = ( -/obj/structure/lattice, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgO" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/transit_tube/horizontal, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dha" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dhc" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dhe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhg" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhh" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine"; - on = 0 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhi" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/door/window/northleft{ - dir = 8; - icon_state = "left"; - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"dhj" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"dhk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"dhl" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 - }, -/turf/open/space, +/turf/closed/wall/mineral/plastitanium, /area/space/nearstation) "dhn" = ( /obj/structure/table, @@ -75376,8 +74180,7 @@ }, /obj/machinery/camera{ c_tag = "Theatre - Stage"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light/small{ dir = 4 @@ -75544,8 +74347,7 @@ "dir" = ( /obj/machinery/camera{ c_tag = "Theatre - Backstage"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/sign/poster/contraband/random{ pixel_y = -32 @@ -75894,8 +74696,7 @@ }, /obj/machinery/camera{ c_tag = "Departure Lounge - Port Fore"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-24" @@ -75945,8 +74746,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel - Funeral Parlour"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, @@ -75969,26 +74769,18 @@ /turf/open/space, /area/science/xenobiology) "djt" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/engine/supermatter) +/area/engine/engineering) "djx" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Aft Port"; + dir = 4; + network = list("singularity") }, -/obj/item/crowbar, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) "djz" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -76026,7 +74818,7 @@ id = "arrivals_stationary"; name = "arrivals"; width = 7; - roundstart_template = /datum/map_template/shuttle/arrival/box; + roundstart_template = /datum/map_template/shuttle/arrival/box }, /turf/open/space/basic, /area/space) @@ -76048,12 +74840,11 @@ /turf/open/floor/plating, /area/chapel/main) "dlI" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dlN" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/supermatter) +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "dlV" = ( /turf/closed/wall/r_wall, /area/maintenance/department/science/xenobiology) @@ -76264,6 +75055,14 @@ icon_state = "platingdmg2" }, /area/maintenance/port/fore) +"drT" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dsg" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76304,6 +75103,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"dtL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space, +/area/space) "dtP" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76637,46 +75443,24 @@ /turf/closed/wall, /area/engine/gravity_generator) "dBw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBx" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dBy" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dBz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBB" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) +"dBy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) +"dBB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space) "dBC" = ( /obj/machinery/meter, /obj/structure/grille, @@ -77356,6 +76140,23 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"dPf" = ( +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"dPp" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engineering) "dYu" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Airlock" @@ -77365,6 +76166,28 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"dYv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1; + external_pressure_bound = 140; + name = "server vent"; + pressure_checks = 0 + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) +"dZD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space) +"eln" = ( +/turf/open/space/basic, +/area/engine/engineering) +"enN" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/engineering) "eoK" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -77397,6 +76220,17 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"esV" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "evy" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -77407,6 +76241,25 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"eEu" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "eFN" = ( /obj/structure/bodycontainer/crematorium{ id = "crematoriumChapel"; @@ -77437,16 +76290,63 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/engine/engineering) +"ffK" = ( +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) +"fjy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space) +"foU" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching the Engine."; + dir = 8; + layer = 4; + name = "Engine Monitor"; + network = list("singularity"); + pixel_x = 30 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) "fDD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, /area/science/circuit) +"fGs" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"fWO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space) "gfh" = ( /obj/machinery/libraryscanner, /turf/open/floor/plasteel/white, /area/science/circuit) +"gha" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 1; + external_pressure_bound = 120; + name = "server vent" + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "gix" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ @@ -77465,6 +76365,14 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"goZ" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "gEk" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -77490,6 +76398,14 @@ /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating, /area/engine/atmos) +"gKb" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Fore Starboard"; + dir = 8; + network = list("singularity") + }, +/turf/open/floor/plating/airless, +/area/space) "gLC" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel, @@ -77522,6 +76438,9 @@ }, /turf/open/floor/plating, /area/security/prison) +"hWU" = ( +/turf/open/floor/plating/airless, +/area/space) "ioI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -77549,6 +76468,46 @@ }, /turf/open/floor/plasteel/whitepurple, /area/science/lab) +"iOa" = ( +/turf/closed/wall/mineral/plastitanium, +/area/maintenance/starboard) +"iTS" = ( +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) +"iYY" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/engine/engineering) +"jjF" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"jwP" = ( +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Kill Chamber"; + dir = 1; + network = list("ss13","rd","xeno"); + start_active = 1 + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "jwW" = ( /turf/closed/wall/mineral/plastitanium, /area/crew_quarters/fitness/recreation) @@ -77560,7 +76519,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of your own office."; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = 32 }, /turf/open/floor/plasteel/white, @@ -77579,6 +76538,21 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"jFx" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"jIV" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "jKK" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -77588,6 +76562,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"jYQ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) "kfu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, @@ -77693,6 +76673,14 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"lHL" = ( +/turf/open/space/basic, +/area/space/nearstation) +"lLj" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, +/area/engine/engineering) "lMz" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -77734,6 +76722,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"moI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/space) "mvj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -77743,6 +76737,12 @@ }, /turf/closed/wall, /area/hallway/secondary/service) +"mwK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space) "mzh" = ( /obj/machinery/firealarm{ dir = 1; @@ -77771,6 +76771,30 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/circuit) +"nte" = ( +/obj/machinery/the_singularitygen/tesla, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"nwU" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "nyo" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -77805,10 +76829,33 @@ }, /turf/open/floor/plasteel, /area/construction/storage/wing) +"nKh" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "obb" = ( /obj/structure/target_stake, /turf/open/floor/plasteel/white, /area/science/circuit) +"obN" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space, +/area/space) +"ocj" = ( +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating/airless, +/area/engine/engineering) "ocT" = ( /obj/machinery/light{ dir = 1 @@ -77823,7 +76870,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of your own office."; name = "Research Monitor"; - network = list("RD"); + network = list("rd"); pixel_y = 32 }, /turf/open/floor/plasteel/white, @@ -77907,6 +76954,15 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"pPA" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1; + name = "euthanization chamber freezer"; + on = 1; + target_temperature = 80 + }, +/turf/open/floor/plating, +/area/science/xenobiology) "pSX" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Escape Airlock" @@ -77923,6 +76979,13 @@ dir = 2 }, /area/crew_quarters/locker) +"pWF" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "qnJ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -77953,6 +77016,12 @@ "qBq" = ( /turf/closed/wall/mineral/plastitanium, /area/hallway/secondary/entry) +"qJG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) "qJZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -77963,7 +77032,7 @@ /obj/machinery/camera{ c_tag = "Research Division Circuitry Lab"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/circuit) @@ -77976,6 +77045,18 @@ dir = 1 }, /area/science/lab) +"rEi" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"rFx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/engineering) "rQK" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -77995,6 +77076,29 @@ /obj/machinery/vending/snack/random, /turf/open/floor/plasteel, /area/science/mixing) +"rTo" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"rVX" = ( +/obj/structure/particle_accelerator/particle_emitter/left{ + icon_state = "emitter_left"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"rWa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/yellow/side, +/area/engine/engineering) "sdi" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -78031,6 +77135,21 @@ "sJW" = ( /turf/closed/wall/mineral/plastitanium, /area/engine/break_room) +"sOW" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"sSU" = ( +/turf/closed/wall/r_wall, +/area/space) +"tdB" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/starboard/fore) "tjH" = ( /obj/structure/table/reinforced, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -78052,22 +77171,19 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "tDM" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/item/wrench, +/turf/open/floor/plating, +/area/engine/engineering) "tFJ" = ( /obj/structure/bodycontainer/morgue{ dir = 8 }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"tMT" = ( +/obj/structure/lattice, +/turf/open/space, +/area/engine/engineering) "tVY" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -78118,6 +77234,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard) +"uQo" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) "uRM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -78142,15 +77263,34 @@ "vhG" = ( /obj/structure/table/glass, /obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel, /area/science/misc_lab) +"vmz" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space) +"vAk" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "vLD" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space) +"vSl" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "wiZ" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -78201,11 +77341,39 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/misc_lab) +"xcM" = ( +/obj/structure/closet/firecloset, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) +"xfK" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "xkG" = ( /obj/item/device/integrated_electronics/wirer, /obj/structure/table/reinforced, /turf/open/floor/plasteel/white, /area/science/circuit) +"xqB" = ( +/obj/structure/cable/white, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/emitter{ + anchored = 1; + state = 2 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xse" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance"; @@ -78237,6 +77405,19 @@ /obj/structure/chair/comfy, /turf/open/floor/plasteel, /area/science/misc_lab) +"xLP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space, +/area/space) +"xNI" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -78247,6 +77428,24 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"xWZ" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"yeY" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Aft Starboard"; + dir = 8; + network = list("singularity") + }, +/turf/open/floor/plating/airless, +/area/space) "ygk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -111118,7 +110317,7 @@ cRi cRi cRi daP -cLE +pPA dlV aaa aaa @@ -111633,8 +110832,8 @@ cSn cRi dmq cRi -cZv -cZv +ffK +ffK cRi aaf aag @@ -111890,8 +111089,8 @@ cSn cRi ddx ddz -daR -cZv +dYv +ffK cRe aaa aaa @@ -112404,8 +111603,8 @@ daK cRi bIv ddz -ddB -cZv +gha +ffK cRe aaa aaf @@ -112661,8 +111860,8 @@ daN cRi dmr cRi -cZv -dbw +ffK +jwP cRi aaa aag @@ -118454,12 +117653,12 @@ aFu aBI aBI aJn -aCO -aFq +lLj +lLj aNq aBI aPZ -aRo +aSB aSu aTG aUZ @@ -118700,7 +117899,7 @@ arJ arI dnh dqu -doh +tdB axO axY aAo @@ -118710,12 +117909,12 @@ aEn aFv aGV aHX -aEi -aKA -aMc -aEi +aBO +aBO +aBO +aBO aOO -aEi +aBO aRp aSv aTH @@ -119217,7 +118416,7 @@ avt awJ axS axY -aCO +jIV ddW aCT aEp @@ -119477,18 +118676,18 @@ axY aAr ddX aCU -aEq -aTO +aCW +aBO aGX -aHZ -aJp -aTO +aBO +aBO +aBO aSB -aTO -aOR -aQa +aBO +aBO +aBO aGX -aTO +aBK aTK aVd aBI @@ -119731,23 +118930,23 @@ avv axY axU ayS -dCk -ddY +enN +ddX deb -deh -aFz -aCZ +aBO +aBO +iTS deM -axY -aCZ +uQo +foU aMg -aCZ +xcM dfh -deM -aCZ -aFz -deh -aVe +aBO +aBO +aBK +dPp +rFx axY aYu aYu @@ -119991,21 +119190,21 @@ ddP aAt aBL deb -dei +aBO aFA +axY +axY deB -deB -deB -deB +axY aMh -deB -deB -deB -deB +axY +axY +nKh +aBO aSz -aTM +aTK aVe -apc +aJu aYu aZL bbB @@ -120248,21 +119447,21 @@ aAu ddQ aBM aCV -aEr +aBO aFB -aGY +axY daW dBw -aKF +dBw aMi cpR -dfi +axY aQd -dBA +aBO aSA -aTN -aVf -apc +aTK +aVe +aJu aYu aZM bbC @@ -120505,21 +119704,21 @@ ayV aAv aBN aCW -aEr -aFC +aBO +aFA aGZ -aGZ -dlI +qJG +aJu aKG -aMj +aJu dBy -dlI -aQe -aRv +aGZ +nKh +aBO dfD -aTN -aVe -apc +aTK +rWa +aJu aYu aZN bbD @@ -120760,23 +119959,23 @@ axY axY ayW bTq +dgA +aBO aBO -aCX -dej aFC -deC -deC -dlI +axY +qJG +aJu aKH aMk aNu -dlI +axY dfp -dfp -dfE +aBO +dgA dfP dfY -dgc +axY aYu cXA cXA @@ -121014,30 +120213,30 @@ ath ajb avA axY -axZ +axY ayX -ddS -bUw -aCY -dek +axY +axY +aBO +aBO der -deD -dlI -aJv +axY +qJG +aJu aKI tDM -dfb -dfj +dBy +axY dlI -deD -dfF -aTN -aVe -aWH -dgi +aBO +axY +axY +ayX +axY +atm dgc -aqq -aqr +alq +apc aWu bif bif @@ -121271,29 +120470,29 @@ ati ajb avB axY -ddO +jYQ bUw -ddT -ddZ -ded -del -des +aJu +axY +axY +axY +axY djt -daY +qJG daZ dbb -aMk -aNv -dfk -dfq +rVX +dBy djt -dfG -dfQ -dfZ -apc -apc -dgo -apc +axY +axY +axY +aJu +bUw +iYY +axY +alq +alq cXZ atm bfZ @@ -121528,31 +120727,31 @@ ajb ajb avC axY -aya -bUw -ddU -aBQ -dee +axY +eEu +axY +axY +ddO aEr -des +ddO djt -daY -daZ -dbb +qJG +aJu +rEi dfa aNv -dfk -daY +djt +ddO djx -dfG -cXz -aVe -atm -alr -dgp +axY +axY +nwU +axY +axY +alq cXI cYj -atm +iOa bga big bga @@ -121571,7 +120770,7 @@ bFS bHy bIV bKC -bMi +bAQ bNU bMg bQV @@ -121785,31 +120984,31 @@ dps dpL avD axY +axY +xNI +ddO +ddO +ddO +ddO ddO -bUw -ddV -aBQ -dee -aEr -aKL djt -daY -deS -dbb -aMk -aNv -dfm -daY djt -dbg -dfR +djt +aRm +djt +djt +djt +ddO +ddO +ddO +ddO dga dgd dgj -dgp -alr -atm atm +alq +jFx +iOa bgb cTu bgb @@ -121828,8 +121027,8 @@ bFT bHz bIW bKD -dhe -dhg +bCi +bCi bPu bPu bPu @@ -122044,28 +121243,28 @@ avE axY ayc aza -aAw -bUw +ddO +aaa aCY dem -aFD +dem +deD +deD deD -dlI -dlI deV -dlN -dfc -dlI -dlI -deD +dem +dem +dem +dem +dem dfI -dfS -aVh -aaf +aaa +ddO +ddO aYx -dgr -dgw -dgA +sSU +lHL +lMJ dgI bgb cTi @@ -122086,7 +121285,7 @@ bHy bIX bKE bKE -dhh +bKE bPv bKE bKE @@ -122296,34 +121495,34 @@ apn aqy arT apm -dnS +vAk avB axY -axY -bTq +goZ +ddO aAx -aBO +sOW aIe aOS -deu -deI -deN -deI -deW -aMm -dfd -deN -dft +mwK +mwK +mwK +mwK +mwK +mwK +mwK +mwK +mwK dBB -dbh -dfT -aVh -aaa +aIe +sOW +cWu +ddO aYx -dgf -dgj -ack -dgJ +sSU +lMJ +lMJ +lHL bgb bij bgb @@ -122343,7 +121542,7 @@ bHA bIY bKF bMk -dhi +bNV bPw bQW bSj @@ -122556,31 +121755,31 @@ atk aux avF dqT -dqT -aaf -ack -dea -aIc -den +esV +xqB +aAx +aaa +aIe +dZD +dev +aav +aav +dev +lMJ +aaa +aav +aav dev -deJ -deO -deU -deX -dBx -dfe -dBz -dfu dfz -dfJ -dfU -dga +aIe +aaa +cWu dge azd -azd -azd -dgB -dgK +sSU +lMJ +lMJ +lHL aaa cUL aaa @@ -122600,7 +121799,7 @@ bHB bIZ bKG bMl -dhj +bKG bIZ bKG bMl @@ -122813,31 +122012,31 @@ atl auy dnS dqT -dqT -aaf -ack -ack +fGs +ddO +aAx +sOW def aCZ -dew -aCZ -axY -axY -aCZ -aCZ -aCZ -axY -axY -aCZ -dew -aCZ -aVe -dgf -dgk -dgt -dgk -dgv -dgJ +aav +aav +aav +vLD +aaf +aaa +aav +aav +aav +xfK +obN +sOW +cWu +ddO +dgg +sSU +lMJ +lHL +lHL anT aaf aaf @@ -122857,7 +122056,7 @@ bza bJa bza bFX -dhk +bza bJa bza bFX @@ -123069,52 +122268,52 @@ apm apm dnh dnS -dnz dqT +xWZ +dPf +aAx +aaa +aIe +dZD +aav +aav +aaa +aaa aaf -aaf -aaf -def -ddZ -dex -aJu -ddZ -ddZ -ddZ -aMo -dff -ddZ -ddZ -aJu -dex -ddZ -aVe +aaa +aaa +aav +aav +dfz +aIe +aaa +cWu aWK dgk -dgt -dgk -dgB -dgM -dgN -dgO -dgO -dgw -dgO -dgS -dgO -dgO -dgw -dgw -dgw -dgw +sSU +lMJ +lHL +lHL +anT +dew +dew +aaf +dew +bpw +dew +dew +aaf +aaf +aaf +aaf bCz -dgw -dha -dgw -dhc -dgw -dha -dhl +aaf +bFY +aaf +bJb +aaf +bFY +aaf bJb aaf bFY @@ -123327,31 +122526,31 @@ dnh auz dqp dqT -dqT +axY +fGs +aAx +vmz +def +aCZ aaa aaa aaa -bTq -dep -dey -aHa ddZ -ddZ -ddZ -ddZ -ddZ -ddZ -ddZ -dfA -dfM -dfV -dgb +cDu +fWO +aaa +vLD +dev +xfK +obN +vmz +cWu dgg -azd -azd -azd -dgv -aaf +axY +sSU +lMJ +lHL +lHL anT aaa aaa @@ -123584,30 +122783,30 @@ dni auA dnS dqT -aaa -aaa -aaa -aaa axY -deq -dey -deK -ddZ -ddZ -ddZ +fGs +ddO +sOW +aIe +dZD +lMJ +aaf +aaf +den +nte aMo -ddZ -ddZ -ddZ -dfB -dfM -dfW +aaf +aaf +lMJ +dfz +aIe +sOW +ddO +dgg axY -aWK -dgk -dgt -dgk -dgB +sSU +lMJ +lHL aaa anT aaa @@ -123841,31 +123040,31 @@ dnh auB avG dqT -aaa -aaa -aaa -aaa axY -aJu -deA -deL -aJu -aJu +fGs +aAx +vmz +def +aCZ +dev +vLD +aaa +fjy deY +moI +aaa +aaa +aaa +xfK +obN +vmz +cWu +dgg axY -dfg -aJu -aJu -dfC -dfO -ddZ -axY -dgh -dgk -dgk -dgk -dgv -aaf +sSU +lMJ +lHL +lHL anT aaa aaa @@ -124098,30 +123297,30 @@ dnh dnh jKK dqT +ocj +rTo +aAx +aaa +aIe +dZD +aav +aav +aaa +aaa aaf aaa aaa +aav +aav +dfz +aIe aaa -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -aWK +cWu +jjF dgm -dgu -dgm -dgB +sSU +lMJ +lHL aaa anT aaa @@ -124355,31 +123554,31 @@ atn bOY avG dqT -aaf -aaa -aaa +fGs +ddO +aAx +sOW +dtL +aCZ +aav +aav aaa aaa aaf +vLD aaa -aaf -aaa -aaa -aaf -aaa -aaf -aaa -aaf -aaa -aaf -aaf -ack -ack -aye -dgv -aye -dgv -aaf +aav +aav +xfK +xLP +sOW +pWF +ddO +dgg +sSU +lMJ +lHL +lHL anT aaf aaf @@ -124612,29 +123811,29 @@ dnh dnh lNZ dqT -aaf +drT +xqB +aAx +aaa +vmz +dZD +dev +aav aaa aaa +lMJ +dev +aav +aav +dev +dfz +vmz aaa -aaa -aaf -aaa -aaf -aaa -aaa -aaf -aaa -aaf -aaa -aaf -aaa -aaa -aaf -aaf -aaf -aaa -aaa -aaf +cWu +dge +vSl +sSU +lMJ aaa aaa aaf @@ -124869,29 +124068,29 @@ aaa aaf ack dqT -aaf -anT -anT -anT -anT -aaf -anT -anT -anT -anT -anT -anT -aqB -anT -anT -anT -anT -anT -anT -aaf -aaa -aaa -aaf +axY +axY +ddO +hWU +hWU +gKb +hWU +hWU +hWU +hWU +hWU +hWU +hWU +hWU +hWU +yeY +hWU +hWU +ddO +axY +axY +sSU +lMJ aaa aaa aaf @@ -125126,29 +124325,29 @@ aaf aaf ack aaf -aaa -aaa -aaa -aaf -aaa -aaa -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -aaa -aaa -aaa -aaf -aaf -aaf -aaf +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +sSU +lMJ aaa aaa aaa @@ -125382,30 +124581,30 @@ aaa aaa aaa aaa +vLD aaa +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +eln +tMT aaa -aaa -aaa -aaf -aaf -aaf -anT -anT -anT -anT -aqB -anT -anT -anT -anT -aqB -aaf -aaf -aaf -aaf -aaa -aaf -aaf +lHL +lMJ aaa aaa aaa @@ -125639,7 +124838,7 @@ aaa aaa aaa aaa -aaa +vLD aaa aaa aaa @@ -125896,26 +125095,26 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD aaf aai aaa diff --git a/_maps/cit_map_files/OmegaStation/OmegaStation.dmm b/_maps/cit_map_files/OmegaStation/OmegaStation.dmm index 88e19bad50..ccef5665e1 100644 --- a/_maps/cit_map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/cit_map_files/OmegaStation/OmegaStation.dmm @@ -2574,7 +2574,7 @@ c_tag = "AI Vault - Port"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /obj/effect/turf_decal/stripes/line{ @@ -3515,7 +3515,7 @@ c_tag = "AI Vault - Starboard"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /obj/effect/turf_decal/stripes/line{ @@ -4081,8 +4081,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/camera{ - c_tag = "Armoury - Internal"; - network = list("Labor") + c_tag = "Armoury - Internal" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4542,8 +4541,7 @@ dir = 8 }, /obj/machinery/camera{ - c_tag = "Security - Cell 1"; - network = list("MINE") + c_tag = "Security - Cell 1" }, /turf/open/floor/plasteel/red/side{ dir = 5 @@ -4569,8 +4567,7 @@ }, /obj/machinery/camera{ c_tag = "Fore Primary Hallway"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -5967,8 +5964,7 @@ /obj/item/stamp, /obj/machinery/camera{ c_tag = "Cargo Bay Entrance"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/brown{ dir = 8 @@ -6147,8 +6143,7 @@ dir = 8 }, /obj/machinery/camera{ - c_tag = "Security - Cell 2"; - network = list("MINE") + c_tag = "Security - Cell 2" }, /turf/open/floor/plasteel/red/side{ dir = 5 @@ -6521,8 +6516,7 @@ }, /obj/machinery/camera{ c_tag = "Security - Office"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -6547,8 +6541,7 @@ "amK" = ( /obj/machinery/camera{ c_tag = "Security - Central"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/neutral/side{ dir = 8 @@ -6629,8 +6622,7 @@ "amS" = ( /obj/machinery/camera{ c_tag = "Locker Room Toilets"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/freezer, /area/hallway/primary/central) @@ -8505,8 +8497,7 @@ /obj/item/shovel, /obj/machinery/camera{ c_tag = "Mining Dock"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -9015,7 +9006,6 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics Tank 4"; - network = list("thunder"); pixel_x = 10 }, /turf/open/floor/plasteel/green/side{ @@ -9418,8 +9408,7 @@ }, /obj/machinery/camera{ c_tag = "Central Diner 3"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/vault/side{ dir = 4 @@ -10058,8 +10047,7 @@ "atz" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank 1"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -10454,8 +10442,7 @@ }, /obj/machinery/camera{ c_tag = "Bar"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -10473,8 +10460,7 @@ }, /obj/machinery/camera{ c_tag = "Bar Backroom"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/vault, /area/crew_quarters/bar/atrium) @@ -11736,8 +11722,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics East"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/caution{ dir = 4 @@ -11956,8 +11941,7 @@ "axj" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank 2"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -12059,8 +12043,7 @@ /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/machinery/camera{ c_tag = "Atmospherics Monitoring"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -12634,8 +12617,7 @@ }, /obj/machinery/camera{ c_tag = "Central Diner 2"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/vault/side{ dir = 4 @@ -13466,8 +13448,7 @@ /obj/structure/bedsheetbin, /obj/machinery/camera{ c_tag = "Locker Room East"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/arrival{ @@ -14488,8 +14469,7 @@ }, /obj/machinery/camera{ c_tag = "Central Hallway East"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/neutral/corner{ dir = 1 @@ -15091,8 +15071,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Secure Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault/side{ @@ -15337,8 +15316,7 @@ }, /obj/machinery/camera{ c_tag = "Locker Room South"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault{ @@ -15695,8 +15673,7 @@ }, /obj/machinery/camera{ c_tag = "SMES Access"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -15739,8 +15716,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Access"; - dir = 8; - network = list("Labor") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -15877,8 +15853,7 @@ }, /obj/machinery/camera{ c_tag = "Central Diner 1"; - dir = 4; - network = list("MINE") + dir = 4 }, /turf/open/floor/plasteel/redyellow, /area/crew_quarters/bar/atrium) @@ -16458,8 +16433,7 @@ "aHg" = ( /obj/machinery/camera{ c_tag = "Gravity Generator Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/bot_white/left, /turf/open/floor/plasteel/vault{ @@ -16559,7 +16533,7 @@ /obj/machinery/camera{ c_tag = "Engineering Fore"; dir = 2; - network = list("SS13","Engine"); + network = list("ss13","engine"); pixel_x = 23 }, /turf/open/floor/engine, @@ -17184,8 +17158,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Monitoring"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -18010,7 +17983,7 @@ /obj/machinery/camera{ c_tag = "Kitchen Coldroom"; dir = 4; - network = list("MINE") + network = list("mine") }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) @@ -19145,7 +19118,7 @@ /obj/machinery/camera{ c_tag = "Engineering Port"; dir = 4; - network = list("SS13","Engine") + network = list("ss13","engine") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -19171,7 +19144,7 @@ /obj/machinery/camera{ c_tag = "Supermatter Chamber"; dir = 2; - network = list("Engine"); + network = list("engine"); pixel_x = 23 }, /obj/structure/cable{ @@ -19285,7 +19258,7 @@ desc = "Used for watching the Engine."; dir = 1; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_y = -32 }, /obj/machinery/rnd/protolathe/department/engineering, @@ -19335,8 +19308,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics South West"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/neutral/corner{ dir = 8; @@ -19468,8 +19440,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Hydroponics South"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault/side{ @@ -20153,8 +20124,7 @@ icon_state = "4-8" }, /obj/machinery/camera{ - c_tag = "Aft Primary Hallway 4"; - network = list("SS13","Prison") + c_tag = "Aft Primary Hallway 4" }, /turf/open/floor/plasteel/green/corner{ dir = 1 @@ -20262,8 +20232,7 @@ icon_state = "4-8" }, /obj/machinery/camera{ - c_tag = "Aft Primary Hallway 3"; - network = list("SS13","Prison") + c_tag = "Aft Primary Hallway 3" }, /turf/open/floor/plasteel/green/corner{ dir = 1 @@ -21100,7 +21069,7 @@ /obj/machinery/camera{ c_tag = "Engineering Aft"; dir = 2; - network = list("SS13","Engine"); + network = list("ss13","engine"); pixel_x = 23 }, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -21257,8 +21226,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Aft Primary Hallway 2"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/yellow/corner{ dir = 8 @@ -21535,8 +21503,7 @@ }, /obj/machinery/camera{ c_tag = "Library 2"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/dark, /area/library) @@ -21685,8 +21652,7 @@ }, /obj/machinery/camera{ c_tag = "Chemistry"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/whiteyellow/corner{ dir = 1 @@ -22567,8 +22533,7 @@ "aUo" = ( /obj/machinery/camera{ c_tag = "Genetics Cloning"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/whiteblue/corner{ dir = 1 @@ -23136,7 +23101,7 @@ /obj/machinery/camera{ c_tag = "Server Room"; dir = 2; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_x = 22 }, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -23645,8 +23610,7 @@ /obj/structure/closet/crate/bin, /obj/machinery/camera{ c_tag = "Medbay Morgue"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/vault/side{ dir = 8 @@ -23914,8 +23878,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay West"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -24230,8 +24193,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/delivery, /obj/structure/window/reinforced{ @@ -24495,8 +24457,7 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Research Division South"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/whitepurple/corner, /area/science/research) @@ -25331,7 +25292,7 @@ /obj/machinery/camera{ c_tag = "Robotics Lab"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault/side, @@ -25637,8 +25598,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Foyer"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral, /area/hallway/primary/central) @@ -26708,8 +26668,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay South"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/whiteblue/corner{ dir = 8 @@ -27226,8 +27185,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/vault/side{ dir = 8 @@ -28451,7 +28409,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Test Chamber"; dir = 2; - network = list("Xeno","RD") + network = list("xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 4 @@ -28546,7 +28504,7 @@ /obj/machinery/camera{ c_tag = "Crematorium"; dir = 4; - network = list("MINE") + network = list("mine") }, /turf/open/floor/plasteel/vault/side{ dir = 4 @@ -29231,8 +29189,7 @@ }, /obj/machinery/camera{ c_tag = "Chaplain's Quarters"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/vault{ dir = 8 @@ -29278,8 +29235,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/camera{ c_tag = "Chapel Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/wood, /area/chapel/main) @@ -29714,8 +29670,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel South"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -29737,8 +29692,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Arrivals Hallway 3"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -29825,7 +29779,7 @@ c_tag = "Science - Server Room"; dir = 8; name = "science camera"; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/science/xenobiology) @@ -30413,8 +30367,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Port Primary Hallway"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -30431,8 +30384,7 @@ }, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway 2"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral/corner, /area/hallway/primary/central) @@ -30440,8 +30392,7 @@ /obj/structure/closet/firecloset, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway 2"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault/side{ @@ -30464,8 +30415,7 @@ "blk" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank 3"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -30478,12 +30428,11 @@ /obj/machinery/camera{ c_tag = "Shuttle Docking Foyer"; dir = 8; - network = list("MINE") + network = list("mine") }, /obj/machinery/camera{ c_tag = "Escape Arm Airlocks"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -30492,8 +30441,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Starboard Primary Hallway"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/vault/side{ @@ -30507,7 +30455,7 @@ /obj/machinery/camera{ c_tag = "Engineering Starboard"; dir = 8; - network = list("SS13","Engine") + network = list("ss13","engine") }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -30523,8 +30471,7 @@ }, /obj/machinery/camera{ c_tag = "Research Division Access"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/structure/cable/white{ icon_state = "2-8" @@ -30538,7 +30485,6 @@ /obj/machinery/camera{ c_tag = "Aft Primary Hallway 1"; dir = 8; - network = list("SS13"); pixel_y = -22 }, /turf/open/floor/plasteel/purple/corner, @@ -30583,7 +30529,6 @@ /obj/machinery/camera{ c_tag = "Surgery Operating"; dir = 1; - network = list("SS13"); pixel_x = 22 }, /turf/open/floor/plasteel/neutral, @@ -30592,7 +30537,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Test Chamber"; dir = 2; - network = list("Xeno","RD") + network = list("xeno","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -30615,8 +30560,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Arrivals Hallway"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -30627,8 +30571,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Arrivals Hallway 2"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -30685,8 +30628,7 @@ }, /obj/machinery/camera{ c_tag = "Chapel Mass Driver"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/light/small, /obj/machinery/button/massdriver{ @@ -31264,8 +31206,7 @@ "buU" = ( /obj/machinery/camera{ c_tag = "Communications Relay"; - dir = 8; - network = list("MINE") + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -33064,7 +33005,7 @@ c_tag = "AI Chamber - Core"; dir = 2; name = "core camera"; - network = list("RD") + network = list("rd") }, /obj/machinery/cell_charger, /turf/open/floor/plasteel/vault/side, @@ -33247,7 +33188,7 @@ c_tag = "AI Chamber - Core"; dir = 2; name = "core camera"; - network = list("RD") + network = list("rd") }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -33384,7 +33325,7 @@ c_tag = "AI Chamber - Core"; dir = 2; name = "core camera"; - network = list("RD") + network = list("rd") }, /obj/machinery/light{ dir = 1 @@ -33617,7 +33558,7 @@ c_tag = "AI Satellite - Access"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault/side{ @@ -33905,7 +33846,7 @@ c_tag = "AI Satellite - Maintenance"; dir = 8; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -33977,7 +33918,7 @@ c_tag = "AI Satellite - Antechamber"; dir = 4; name = "ai camera"; - network = list("Sat"); + network = list("minisat"); start_active = 1 }, /turf/open/floor/plasteel/vault/side{ diff --git a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm index 31fcdadf69..b21ac7ff8c 100644 --- a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm @@ -2,6 +2,12 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aau" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/darkpurple, +/area/crew_quarters/cryopod) "aby" = ( /obj/structure/lattice, /obj/structure/grille, @@ -16,7 +22,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat External Fore"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/space, /area/space/nearstation) @@ -63,7 +69,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber North"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/light, /obj/machinery/flasher{ @@ -121,7 +127,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber Center"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/light/small{ dir = 1 @@ -160,7 +166,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat External Port"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /turf/open/space, /area/space/nearstation) @@ -171,7 +177,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber West"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/light{ dir = 8 @@ -241,7 +247,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber East"; dir = 8; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/light{ dir = 4 @@ -252,7 +258,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat External Starboard"; dir = 4; - network = list("MiniSat") + network = list("minisat") }, /turf/open/space, /area/space/nearstation) @@ -332,7 +338,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber South"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /obj/machinery/light{ dir = 1 @@ -625,7 +631,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Maintenance Port Fore"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAP) @@ -684,7 +690,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat AI Chamber Observation"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/grimy, /area/ai_monitored/turret_protected/aisat_interior) @@ -718,7 +724,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Maintenance Starboard Fore"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAS) @@ -852,7 +858,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Bridge Port Fore"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /turf/open/space, /area/ai_monitored/turret_protected/AIsatextAP) @@ -880,7 +886,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Bridge Starboard Fore"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /turf/open/space, /area/ai_monitored/turret_protected/AIsatextAS) @@ -977,7 +983,7 @@ }, /obj/machinery/camera{ c_tag = "Permabrig Central"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /turf/open/floor/plasteel/dark, /area/security/prison) @@ -1039,7 +1045,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Bridge Port Aft"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/space, /area/ai_monitored/turret_protected/AIsatextAP) @@ -1057,7 +1063,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Bridge Starboard Aft"; dir = 1; - network = list("MiniSat") + network = list("minisat") }, /turf/open/space, /area/ai_monitored/turret_protected/AIsatextAS) @@ -1239,7 +1245,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Maintenance Port Aft"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAP) @@ -1304,7 +1310,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Foyer"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plasteel/darkblue/side{ dir = 4 @@ -1354,7 +1360,7 @@ /obj/machinery/camera{ c_tag = "MiniSat Maintenance Starboard Aft"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAS) @@ -1876,7 +1882,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Permabrig Cell 2"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /obj/item/device/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; @@ -1918,7 +1924,7 @@ /obj/structure/bed, /obj/machinery/camera{ c_tag = "Permabrig Cell 1"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /obj/item/device/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; @@ -2171,7 +2177,7 @@ /obj/machinery/camera/motion{ c_tag = "MiniSat Entrance"; dir = 2; - network = list("MiniSat") + network = list("minisat") }, /turf/open/space, /area/space/nearstation) @@ -2292,12 +2298,12 @@ "ahF" = ( /obj/machinery/camera{ c_tag = "Brig Prison Hallway"; - network = list("SS13","Prison") + network = list("ss13","prison") }, /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; - network = list("Prison"); + network = list("prison"); pixel_y = 30 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -2385,6 +2391,10 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 6 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -27 + }, /turf/open/floor/plasteel/showroomfloor, /area/security/main) "ahN" = ( @@ -3256,6 +3266,10 @@ pixel_y = -3 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -27 + }, /turf/open/floor/plasteel/dark, /area/security/armory) "ajQ" = ( @@ -3823,6 +3837,10 @@ /obj/structure/cable{ icon_state = "0-2" }, +/obj/machinery/door/poddoor/preopen{ + id = "hos_spess_shutters"; + name = "Space shutters" + }, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "ala" = ( @@ -3918,8 +3936,7 @@ }, /obj/machinery/camera{ c_tag = "Brig Crematorium"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 8 @@ -4112,6 +4129,10 @@ icon_state = "0-2" }, /obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "hos_spess_shutters"; + name = "Space shutters" + }, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "alO" = ( @@ -4325,8 +4346,7 @@ }, /obj/machinery/camera{ c_tag = "Security Office"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 8 @@ -4417,6 +4437,7 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "amu" = ( @@ -4684,6 +4705,10 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28 + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "ana" = ( @@ -5021,6 +5046,11 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/machinery/button/door{ + id = "hos_spess_shutters"; + pixel_y = -26; + req_access_txt = "1" + }, /turf/open/floor/plasteel/darkred/side{ dir = 1 }, @@ -5039,8 +5069,7 @@ }, /obj/machinery/camera{ c_tag = "Head of Security's Office"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/item/device/radio/intercom{ dir = 4; @@ -5073,6 +5102,10 @@ icon_state = "0-8" }, /obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "hos_spess_shutters"; + name = "Space shutters" + }, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "anX" = ( @@ -5155,7 +5188,7 @@ "aok" = ( /obj/machinery/computer/security{ name = "Labor Camp Monitoring"; - network = list("Labor") + network = list("labor") }, /turf/open/floor/plasteel/dark, /area/security/brig) @@ -5213,6 +5246,7 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "aot" = ( @@ -5802,6 +5836,7 @@ }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apN" = ( @@ -6458,8 +6493,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/camera{ c_tag = "Bridge MiniSat Access"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/bridge) @@ -6553,8 +6587,7 @@ /obj/machinery/computer/card, /obj/machinery/camera{ c_tag = "Bridge - Central"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/darkblue/side{ dir = 1 @@ -6648,8 +6681,7 @@ "arX" = ( /obj/machinery/camera{ c_tag = "Gateway"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/table, /obj/structure/sign/warning/biohazard{ @@ -7264,9 +7296,6 @@ "atq" = ( /turf/open/floor/circuit/green, /area/maintenance/department/security/brig) -"atu" = ( -/turf/open/space, -/area/security/brig) "atv" = ( /obj/structure/cable{ icon_state = "0-4" @@ -7364,6 +7393,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/red/side{ dir = 8 }, @@ -7386,6 +7416,7 @@ req_access_txt = "63" }, /obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/red/side{ dir = 4 }, @@ -7396,6 +7427,7 @@ req_access_txt = "1" }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "atI" = ( @@ -7550,8 +7582,7 @@ "aud" = ( /obj/machinery/camera/motion{ c_tag = "Vault"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/light, /obj/structure/cable{ @@ -8041,7 +8072,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the monastery."; name = "Monastery Monitor"; - network = list("Monastery"); + network = list("monastery"); pixel_y = 32 }, /turf/open/floor/plasteel/blue/corner{ @@ -8096,8 +8127,7 @@ }, /obj/machinery/camera{ c_tag = "Labor Shuttle Dock"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/gulag_item_reclaimer{ pixel_y = 24 @@ -8264,8 +8294,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ c_tag = "Bridge MiniSat Access Foyer"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/light/small, /turf/open/floor/plasteel/vault, @@ -8290,6 +8319,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -8542,10 +8572,10 @@ /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "awx" = ( -/obj/structure/closet/athletic_mixed, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/vending/kink, /turf/open/floor/plasteel/arrival{ dir = 1 }, @@ -8749,6 +8779,7 @@ name = "brig shutters" }, /obj/item/device/radio, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "awP" = ( @@ -8770,6 +8801,7 @@ /obj/item/folder/red{ layer = 2.9 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "awQ" = ( @@ -8788,6 +8820,7 @@ name = "Brig Desk"; req_access_txt = "1" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "awR" = ( @@ -8815,7 +8848,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/maintenance/fore) +/area/crew_quarters/heads/captain) "awU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -8900,16 +8933,6 @@ dir = 4 }, /area/bridge) -"axf" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "bridgespace"; - name = "bridge external shutters" - }, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/bridge) "axg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/dark, @@ -9049,7 +9072,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/security/brig) +/area/hallway/primary/fore) "axF" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-10" @@ -9234,10 +9257,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "ayf" = ( -/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -9554,6 +9577,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "ayX" = ( @@ -9765,8 +9789,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Bridge External Access"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, @@ -10590,6 +10613,10 @@ /area/crew_quarters/heads/hop) "aBB" = ( /obj/machinery/computer/cargo/request, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "aBC" = ( @@ -10597,7 +10624,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the monastery."; name = "Monastery Monitor"; - network = list("Monastery"); + network = list("monastery"); pixel_y = 32 }, /turf/open/floor/wood, @@ -10611,8 +10638,7 @@ }, /obj/machinery/camera{ c_tag = "Head of Personnel's Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/newscaster{ pixel_y = 32 @@ -11058,8 +11084,7 @@ }, /obj/machinery/camera{ c_tag = "Captain's Office"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -11985,8 +12010,7 @@ }, /obj/machinery/camera{ c_tag = "Bridge Port Entrance"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/darkblue/corner{ @@ -12200,12 +12224,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aEY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aEZ" = ( /obj/structure/sink{ dir = 8; @@ -12668,7 +12686,6 @@ /area/storage/primary) "aGk" = ( /obj/machinery/vending/boozeomat{ - products = list(/obj/item/reagent_containers/food/drinks/bottle/rum = 1, /obj/item/reagent_containers/food/drinks/bottle/wine = 1, /obj/item/reagent_containers/food/drinks/ale = 1, /obj/item/reagent_containers/food/drinks/drinkingglass = 6, /obj/item/reagent_containers/food/drinks/ice = 1, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 4); req_access_txt = "20" }, /turf/open/floor/plasteel/vault{ @@ -14436,6 +14453,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/art) "aKM" = ( @@ -14474,6 +14492,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/auxiliary) "aKS" = ( @@ -14880,8 +14899,7 @@ }, /obj/machinery/camera{ c_tag = "Cargo Security Post"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/airalarm{ pixel_y = 22 @@ -14911,7 +14929,7 @@ }, /obj/structure/disposalpipe/trunk, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMh" = ( /obj/machinery/conveyor{ dir = 4; @@ -14919,7 +14937,7 @@ }, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMi" = ( /obj/machinery/conveyor{ dir = 4; @@ -14931,7 +14949,7 @@ supply_display = 1 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMj" = ( /obj/machinery/conveyor{ dir = 4; @@ -14945,7 +14963,7 @@ pixel_y = 32 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMk" = ( /obj/machinery/conveyor{ dir = 4; @@ -14956,14 +14974,14 @@ pixel_y = 32 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMl" = ( /obj/machinery/conveyor{ dir = 4; id = "packageSort2" }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMm" = ( /obj/machinery/conveyor{ dir = 4; @@ -14974,7 +14992,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMn" = ( /obj/machinery/disposal/deliveryChute{ dir = 8 @@ -14986,7 +15004,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14997,6 +15015,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMq" = ( @@ -15004,6 +15025,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMr" = ( @@ -15011,6 +15035,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMs" = ( @@ -15020,6 +15047,9 @@ /obj/structure/sign/poster/official/random{ pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMt" = ( @@ -15034,6 +15064,9 @@ c_tag = "Cargo Warehouse"; dir = 2 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMu" = ( @@ -15041,6 +15074,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMv" = ( @@ -15054,6 +15090,9 @@ pixel_x = 26 }, /obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMw" = ( @@ -15552,20 +15591,20 @@ dir = 1 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNH" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNI" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNJ" = ( /obj/machinery/conveyor_switch/oneway{ id = "packageSort2" @@ -15574,7 +15613,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNK" = ( /obj/structure/table, /obj/item/device/destTagger, @@ -15582,7 +15621,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNL" = ( /obj/item/stack/wrapping_paper{ pixel_x = 3; @@ -15597,7 +15636,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNM" = ( /obj/item/storage/box, /obj/item/storage/box, @@ -15614,12 +15653,15 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNN" = ( /obj/structure/closet/crate/freezer, /obj/structure/sign/poster/official/random{ pixel_x = -32 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aNO" = ( @@ -15898,8 +15940,7 @@ }, /obj/machinery/camera{ c_tag = "EVA Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -15929,8 +15970,7 @@ }, /obj/machinery/camera{ c_tag = "Teleporter"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/extinguisher_cabinet{ pixel_x = -26 @@ -16072,14 +16112,14 @@ /turf/open/floor/plasteel/red/side{ dir = 8 }, -/area/quartermaster/office) +/area/quartermaster/sorting) "aOS" = ( /obj/structure/disposalpipe/segment{ dir = 5 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aOT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16093,7 +16133,7 @@ }, /obj/effect/landmark/start/cargo_technician, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aOV" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -16112,7 +16152,7 @@ }, /obj/machinery/light/small, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aOX" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -16124,10 +16164,13 @@ dir = 4 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aOY" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aOZ" = ( @@ -16473,14 +16516,14 @@ "aPX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aPY" = ( /turf/open/floor/plasteel, /area/quartermaster/office) "aPZ" = ( /obj/machinery/holopad, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aQa" = ( /obj/structure/disposalpipe/sorting/wrap{ dir = 1 @@ -16489,7 +16532,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aQb" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -16501,8 +16544,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28 + }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aQc" = ( /obj/machinery/button/door{ id = "qm_warehouse"; @@ -16511,6 +16558,9 @@ req_access_txt = "31" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aQd" = ( @@ -16871,8 +16921,7 @@ /obj/machinery/vending/coffee, /obj/machinery/camera{ c_tag = "Bar Backroom"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/wood, /area/crew_quarters/bar) @@ -16990,11 +17039,11 @@ /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRi" = ( /obj/structure/chair/stool, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRj" = ( /obj/structure/table/reinforced, /obj/item/folder/yellow, @@ -17003,15 +17052,23 @@ layer = 2.9 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRk" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/power/apc/highcap/fifteen_k{ + dir = 4; + name = "Delivery Office APC"; + pixel_x = 28 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRm" = ( /obj/structure/closet/crate, /obj/item/reagent_containers/food/snacks/donut, @@ -17019,7 +17076,7 @@ /obj/item/reagent_containers/food/snacks/donut, /obj/item/reagent_containers/food/snacks/donut, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRn" = ( /obj/machinery/door/poddoor/shutters{ id = "qm_warehouse"; @@ -17027,6 +17084,9 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "aRo" = ( @@ -17379,7 +17439,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aSf" = ( /obj/machinery/door/firedoor, /obj/structure/table/reinforced, @@ -17390,7 +17450,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aSg" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/mining/glass{ @@ -17398,13 +17458,17 @@ req_access_txt = "0"; req_one_access_txt = "48;50" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aSh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aSi" = ( /obj/machinery/button/door{ id = "qm_warehouse"; @@ -17416,6 +17480,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aSj" = ( @@ -17794,6 +17861,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/quartermaster/office) "aTi" = ( @@ -17808,6 +17878,9 @@ departmentType = 2; pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aTj" = ( @@ -17820,6 +17893,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aTl" = ( @@ -18172,8 +18248,7 @@ "aTZ" = ( /obj/machinery/camera{ c_tag = "Kitchen Cold Room"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -18295,6 +18370,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aUp" = ( @@ -18790,6 +18866,7 @@ id = "cargodeliver" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aVt" = ( @@ -19096,8 +19173,7 @@ }, /obj/machinery/camera{ c_tag = "Bar Access"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -19931,9 +20007,7 @@ }, /area/crew_quarters/theatre) "aYn" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, +/obj/machinery/computer/cargo, /obj/machinery/requests_console{ department = "Cargo Bay"; departmentType = 2; @@ -20229,6 +20303,7 @@ pixel_x = 5; pixel_y = -2 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/darkred/side{ dir = 8 }, @@ -20536,8 +20611,7 @@ }, /obj/machinery/camera{ c_tag = "Security Checkpoint"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/airalarm{ dir = 4; @@ -20651,6 +20725,10 @@ /obj/machinery/light{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -28 + }, /turf/open/floor/plasteel/green/side{ dir = 8 }, @@ -20724,6 +20802,7 @@ name = "kitchen shutters" }, /obj/item/storage/fancy/donut_box, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/darkred/side{ dir = 8 }, @@ -21177,6 +21256,7 @@ id = "kitchenshutters"; name = "kitchen shutters" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/darkred/side{ dir = 8 }, @@ -21322,6 +21402,7 @@ }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/brown, /area/quartermaster/qm) "bbH" = ( @@ -21469,8 +21550,7 @@ }, /obj/machinery/camera{ c_tag = "Hydroponics South"; - dir = 8; - network = list("SS13") + dir = 8 }, /turf/open/floor/plasteel/neutral/side{ dir = 4 @@ -21997,8 +22077,7 @@ }, /area/maintenance/department/cargo) "bdA" = ( -/obj/item/cigbutt, -/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/droneDispenser, /turf/open/floor/plating, /area/maintenance/department/cargo) "bdB" = ( @@ -22566,8 +22645,7 @@ "beY" = ( /obj/machinery/camera{ c_tag = "Arrivals Central"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -22716,10 +22794,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) -"bfq" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/crew_quarters/kitchen) "bfr" = ( /obj/structure/sign/barsign, /turf/closed/wall, @@ -22819,8 +22893,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Cargo Quartermaster's Office"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/brown{ dir = 2 @@ -24633,7 +24706,6 @@ /turf/open/floor/plating, /area/science/robotics/lab) "bkw" = ( -/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "1-2" }, @@ -24657,7 +24729,7 @@ /obj/machinery/camera{ c_tag = "Experimentation Lab Chamber"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/engine, /area/science/explab) @@ -24826,8 +24898,7 @@ }, /obj/machinery/camera{ c_tag = "Genetics Cloning Foyer"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/airalarm{ @@ -25087,7 +25158,7 @@ /obj/machinery/camera{ c_tag = "Robotics Lab"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/structure/sink/kitchen{ name = "utility sink"; @@ -25246,7 +25317,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Test Chamber"; dir = 2; - network = list("Xeno","RD") + network = list("xeno","rd") }, /obj/machinery/atmospherics/pipe/simple/general/hidden, /obj/machinery/light{ @@ -25424,8 +25495,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Security Post"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/structure/closet/secure_closet/security/med, /turf/open/floor/plasteel/red/side{ @@ -25800,8 +25870,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Port Entrance"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -26429,7 +26498,7 @@ /obj/machinery/camera{ c_tag = "Server Room"; dir = 2; - network = list("SS13","RD"); + network = list("ss13","rd"); pixel_x = 22 }, /turf/open/floor/plasteel/dark, @@ -26543,12 +26612,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"bpp" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bpq" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, @@ -27275,7 +27338,7 @@ /obj/machinery/camera{ c_tag = "Genetics Monkey Pen Fore"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/light/small{ dir = 8 @@ -27549,6 +27612,9 @@ "bru" = ( /obj/item/storage/toolbox/mechanical, /obj/machinery/holopad, +/obj/machinery/light_switch{ + pixel_x = 25 + }, /turf/open/floor/plasteel/whitepurple/side{ dir = 1 }, @@ -27750,7 +27816,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Port"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/corner{ dir = 2 @@ -27771,7 +27837,7 @@ "brT" = ( /obj/machinery/computer/security/telescreen{ name = "Test Chamber Monitor"; - network = list("Xeno"); + network = list("xeno"); pixel_y = 2 }, /obj/structure/table/reinforced, @@ -27975,8 +28041,7 @@ /obj/machinery/dna_scannernew, /obj/machinery/camera{ c_tag = "Genetics Cloning"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/airalarm{ dir = 4; @@ -28296,7 +28361,7 @@ /obj/machinery/camera{ c_tag = "Robotics - Aft"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/robotics/lab) @@ -28350,7 +28415,7 @@ /turf/open/floor/plasteel/white, /area/science/explab) "btj" = ( -/obj/machinery/droneDispenser, +/obj/structure/table, /turf/open/floor/plasteel/white, /area/science/explab) "btk" = ( @@ -28369,7 +28434,7 @@ /obj/machinery/camera{ c_tag = "Experimentation Lab"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/explab) @@ -28483,7 +28548,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Starboard Fore"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -28773,8 +28838,7 @@ }, /obj/machinery/camera{ c_tag = "Chemistry"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/whiteyellow/side{ dir = 8 @@ -28849,12 +28913,15 @@ /obj/machinery/camera{ c_tag = "Research and Development Lab"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/firealarm{ dir = 4; pixel_x = 28 }, +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/lab) "but" = ( @@ -28888,6 +28955,7 @@ req_one_access_txt = "0" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/lab) "buw" = ( @@ -28898,14 +28966,14 @@ /turf/open/floor/plasteel/darkpurple/side{ dir = 8 }, -/area/science/server) +/area/science/research) "bux" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ icon_state = "1-2" }, /turf/open/floor/plasteel/dark, -/area/science/server) +/area/science/research) "buy" = ( /obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 @@ -28914,7 +28982,7 @@ icon_state = "darkpurple"; dir = 4 }, -/area/science/server) +/area/science/research) "buz" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -29164,7 +29232,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Kill Room"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plating/airless, /area/science/xenobiology) @@ -29202,8 +29270,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Medbay Port Hallway"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) @@ -29287,6 +29354,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bvr" = ( @@ -29317,7 +29385,6 @@ /obj/machinery/camera{ c_tag = "Aft Primary Hallway Chemistry"; dir = 4; - network = list("SS13"); start_active = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -29338,7 +29405,7 @@ name = "Shutters Control Button"; pixel_x = -28; pixel_y = -7; - req_access_txt = "7; 29" + req_access_txt = "47" }, /turf/open/floor/plasteel/white, /area/science/lab) @@ -29452,13 +29519,13 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, -/area/science/research/lobby) +/area/science/research) "bvH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/science/research/lobby) +/area/science/research) "bvI" = ( /obj/structure/closet/emcloset, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -29471,7 +29538,7 @@ /obj/machinery/camera{ c_tag = "Science Access Airlock"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/white, /area/science/research) @@ -29608,8 +29675,7 @@ /obj/structure/closet/l3closet, /obj/machinery/camera{ c_tag = "Xenobiology Access"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -29697,7 +29763,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Central"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -29716,7 +29782,7 @@ /obj/machinery/camera{ c_tag = "Xenobiology Starboard Aft"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/darkpurple/side, /area/science/xenobiology) @@ -29942,8 +30008,7 @@ }, /obj/machinery/camera{ c_tag = "Medbay Sleepers"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/whiteblue/side, /area/medical/sleeper) @@ -30270,7 +30335,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, -/area/science/research/lobby) +/area/science/research) "bxq" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -30286,7 +30351,7 @@ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/science/research/lobby) +/area/science/research) "bxr" = ( /obj/structure/cable{ icon_state = "4-8" @@ -30863,6 +30928,10 @@ /area/crew_quarters/heads/cmo) "byv" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "cmoshutters"; + name = "Privacy shutters" + }, /turf/open/floor/plating, /area/crew_quarters/heads/cmo) "byw" = ( @@ -30982,13 +31051,25 @@ /turf/open/floor/plasteel/white, /area/science/lab) "byH" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel/white, +/obj/structure/table, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/scanning_module, +/obj/item/stock_parts/scanning_module, +/obj/item/device/multitool, +/turf/open/floor/plasteel/whitepurple/side, /area/science/lab) "byI" = ( -/obj/structure/chair/stool, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, +/turf/open/floor/plasteel/whitepurple/side, /area/science/lab) "byJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -31056,13 +31137,13 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, -/area/science/research/lobby) +/area/science/research) "byP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/science/research/lobby) +/area/science/research) "byQ" = ( /obj/structure/sink{ dir = 8; @@ -31448,7 +31529,7 @@ desc = "Used for watching the monastery."; dir = 8; name = "Monastery Monitor"; - network = list("Monastery"); + network = list("monastery"); pixel_x = 28 }, /turf/open/floor/plasteel/dark, @@ -31479,7 +31560,7 @@ /obj/machinery/camera{ c_tag = "Genetics Monkey Pen Aft"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/structure/flora/ausbushes/grassybush, /obj/machinery/light/small{ @@ -31685,6 +31766,13 @@ /obj/machinery/keycard_auth{ pixel_x = 26 }, +/obj/machinery/button/door{ + dir = 4; + id = "cmoshutters"; + name = "Privacy shutters"; + pixel_x = 38; + req_access_txt = "40" + }, /turf/open/floor/plasteel/cmo, /area/crew_quarters/heads/cmo) "bAe" = ( @@ -31788,63 +31876,65 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdprivacy"; + name = "Privacy shutters" + }, +/turf/open/floor/plasteel/darkpurple/side{ + icon_state = "darkpurple"; + dir = 9 + }, +/area/crew_quarters/heads/hor) "bAp" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/door/window{ - name = "Research Director's Office"; - req_access_txt = "30" - }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/obj/machinery/door/airlock/research{ + name = "Research Director's Office"; + req_access_txt = "30"; + req_one_access_txt = "0" + }, +/turf/open/floor/plasteel/darkpurple/side{ + dir = 1 + }, +/area/crew_quarters/heads/hor) "bAq" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/scanning_module, -/obj/item/stock_parts/scanning_module, -/obj/item/device/multitool, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdprivacy"; + name = "Privacy shutters" + }, +/turf/open/floor/plasteel/darkpurple/side{ + dir = 1 + }, +/area/crew_quarters/heads/hor) "bAr" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/plus, -/obj/item/stock_parts/cell/high/plus, -/obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdprivacy"; + name = "Privacy shutters" + }, +/turf/open/floor/plasteel/darkpurple/side{ + dir = 1 + }, +/area/crew_quarters/heads/hor) "bAs" = ( -/obj/structure/table, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/machinery/light_switch{ - pixel_x = 25 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdprivacy"; + name = "Privacy shutters" }, -/obj/machinery/light{ - dir = 4 +/turf/open/floor/plasteel/darkpurple/side{ + icon_state = "darkpurple"; + dir = 5 }, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/area/crew_quarters/heads/hor) "bAt" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -32145,8 +32235,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/camera{ c_tag = "Chief Medical Office"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -32156,7 +32245,7 @@ dir = 8; layer = 4; name = "Surgery Telescreen"; - network = list("Surgery"); + network = list("surgery"); pixel_x = 30 }, /turf/open/floor/plasteel/cmo, @@ -32203,8 +32292,7 @@ icon_state = "0-4" }, /turf/open/floor/plasteel/darkpurple/side{ - icon_state = "darkpurple"; - dir = 9 + dir = 8 }, /area/crew_quarters/heads/hor) "bBr" = ( @@ -32215,26 +32303,20 @@ dir = 5 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/darkpurple/side{ - dir = 1 - }, +/turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bBs" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/darkpurple/side{ - dir = 1 - }, +/turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bBt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/darkpurple/side{ - dir = 1 - }, +/turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bBu" = ( /obj/item/twohanded/required/kirbyplants/dead, @@ -32242,19 +32324,27 @@ dir = 10 }, /obj/machinery/button/door{ - id = "rndshutters"; - name = "Research Lockdown"; - pixel_x = 28; + desc = "A switch that controls privacy shutters."; + id = "rdprivacy"; + name = "Privacy Shutters"; + pixel_x = 40; pixel_y = -5; - req_access_txt = "47" + req_access_txt = "30" }, /obj/machinery/keycard_auth{ pixel_x = 28; pixel_y = 6 }, +/obj/machinery/button/door{ + id = "research_shutters_2"; + name = "Research Lockdown"; + pixel_x = 28; + pixel_y = -5; + req_access_txt = "47" + }, /turf/open/floor/plasteel/darkpurple/side{ icon_state = "darkpurple"; - dir = 5 + dir = 4 }, /area/crew_quarters/heads/hor) "bBv" = ( @@ -32262,6 +32352,9 @@ /area/crew_quarters/heads/hor) "bBw" = ( /obj/machinery/computer/security, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel/red/side{ dir = 8 }, @@ -32402,7 +32495,7 @@ /obj/machinery/camera{ c_tag = "Toxins Lab Port"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/dark, /area/science/mixing) @@ -32446,7 +32539,7 @@ /obj/machinery/camera{ c_tag = "Toxins Lab Starboard"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -32513,7 +32606,7 @@ /obj/machinery/camera{ c_tag = "Genetics"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /turf/open/floor/plasteel/whitepurple/side, /area/medical/genetics) @@ -32569,8 +32662,7 @@ /obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Virology Airlock"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -32651,6 +32743,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/barber, /area/crew_quarters/heads/cmo) "bCr" = ( @@ -32805,6 +32898,10 @@ /obj/machinery/computer/robotics{ dir = 4 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, /turf/open/floor/plasteel/darkpurple/side{ dir = 8 }, @@ -32840,8 +32937,8 @@ "bCJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "research_shutters_2"; - name = "research shutters" + id = "rdprivacy"; + name = "Privacy shutters" }, /turf/open/floor/plating, /area/crew_quarters/heads/hor) @@ -32850,7 +32947,7 @@ /obj/machinery/camera{ c_tag = "Science Security Post"; dir = 4; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/item/book/manual/wiki/security_space_law, /turf/open/floor/plasteel/red/side{ @@ -33660,6 +33757,10 @@ /obj/item/folder/blue, /obj/item/stamp/cmo, /obj/structure/table, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, /turf/open/floor/plasteel/cmo, /area/crew_quarters/heads/cmo) "bEH" = ( @@ -33692,8 +33793,7 @@ dir = 1 }, /obj/machinery/vending/wallmed{ - pixel_y = 28; - products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 1, /obj/item/reagent_containers/pill/patch/silver_sulf = 1, /obj/item/reagent_containers/spray/medical/sterilizer = 1) + pixel_y = 28 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/landmark/blobstart, @@ -33822,7 +33922,7 @@ /obj/machinery/camera{ c_tag = "Research Director's Office"; dir = 1; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/structure/table/glass, /turf/open/floor/plasteel/darkpurple/side, @@ -33840,7 +33940,7 @@ /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; name = "Research Monitor"; - network = list("RD","MiniSat"); + network = list("rd","minisat"); pixel_y = -32 }, /obj/structure/table/glass, @@ -34073,7 +34173,7 @@ /obj/machinery/camera{ c_tag = "Toxins Launch Area"; dir = 2; - network = list("SS13","RD") + network = list("ss13","rd") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -34360,8 +34460,7 @@ "bFZ" = ( /obj/machinery/camera{ c_tag = "Aft Primary Hallway Central"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/yellow/corner, @@ -34433,7 +34532,11 @@ /obj/machinery/camera{ c_tag = "Toxins Storage"; dir = 8; - network = list("SS13","RD") + network = list("ss13","rd") + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28 }, /turf/open/floor/engine, /area/science/storage) @@ -35160,8 +35263,7 @@ "bHY" = ( /obj/machinery/camera{ c_tag = "Virology"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -35224,8 +35326,7 @@ /obj/machinery/light, /obj/machinery/camera{ c_tag = "Medbay Equipment Room"; - dir = 1; - network = list("SS13") + dir = 1 }, /turf/open/floor/plasteel/whiteblue/side, /area/medical/medbay/central) @@ -35288,8 +35389,7 @@ "bIm" = ( /obj/machinery/camera{ c_tag = "Medbay Recovery Room"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -35335,7 +35435,7 @@ /obj/machinery/camera{ c_tag = "Surgery"; dir = 2; - network = list("SS13","Surgery") + network = list("ss13","surgery") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -35353,8 +35453,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/vending/wallmed{ - pixel_y = 28; - products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 1, /obj/item/reagent_containers/pill/patch/silver_sulf = 1, /obj/item/reagent_containers/spray/medical/sterilizer = 1) + pixel_y = 28 }, /turf/open/floor/plasteel/whiteblue/side{ dir = 1 @@ -35547,7 +35646,7 @@ /area/science/mineral_storeroom) "bIO" = ( /obj/structure/window/reinforced, -/obj/machinery/doppler_array{ +/obj/machinery/doppler_array/research/science{ dir = 2 }, /obj/effect/turf_decal/bot{ @@ -35718,6 +35817,10 @@ /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 4 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, /turf/open/floor/plasteel/white, /area/medical/virology) "bJo" = ( @@ -35753,6 +35856,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/medical/surgery) "bJr" = ( @@ -36010,7 +36114,7 @@ dir = 2; layer = 4; name = "Test Chamber Telescreen"; - network = list("Toxins"); + network = list("toxins"); pixel_y = -32 }, /turf/open/floor/plasteel, @@ -36226,8 +36330,7 @@ /area/medical/medbay/central) "bKw" = ( /obj/machinery/vending/wallmed{ - pixel_y = 28; - products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 1, /obj/item/reagent_containers/pill/patch/silver_sulf = 1, /obj/item/reagent_containers/spray/medical/sterilizer = 1) + pixel_y = 28 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -36295,6 +36398,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, /turf/open/floor/plasteel/whiteblue/side{ dir = 8 }, @@ -36350,11 +36457,19 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/hallway/primary/aft) +"bKN" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "prison release"; + name = "prisoner processing blast door" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) "bKO" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/plasteel/dark, @@ -36363,7 +36478,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/machinery/door/firedoor/heavy, /obj/structure/disposalpipe/segment, @@ -37237,7 +37352,6 @@ /obj/machinery/camera{ c_tag = "Aft Primary Hallway Atmospherics"; dir = 2; - network = list("SS13"); start_active = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -37432,7 +37546,7 @@ /obj/machinery/camera{ c_tag = "Monastery Dock"; dir = 1; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/vault{ dir = 4 @@ -37476,7 +37590,7 @@ /obj/machinery/camera{ c_tag = "Monastery Transit"; dir = 1; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plating, /area/chapel/dock) @@ -37989,8 +38103,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics Monitoring"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/space_heater, /turf/open/floor/plasteel/yellow/side, @@ -38041,6 +38154,7 @@ }, /obj/item/stack/sheet/glass, /obj/item/stack/rods/fifty, +/obj/item/pipe_dispenser, /turf/open/floor/plasteel/yellow/side, /area/engine/atmos) "bOY" = ( @@ -38405,7 +38519,7 @@ /obj/machinery/camera{ c_tag = "Monastery Asteroid Dock Port"; dir = 4; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plating/asteroid, /area/chapel/asteroid/monastery) @@ -38437,7 +38551,7 @@ /obj/machinery/camera{ c_tag = "Monastery Asteroid Dock Staboard"; dir = 8; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plating/asteroid, /area/chapel/asteroid/monastery) @@ -38473,13 +38587,16 @@ "bQo" = ( /obj/machinery/camera{ c_tag = "Gravity Generator"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "bQp" = ( @@ -38536,6 +38653,10 @@ pixel_y = 5 }, /obj/item/stock_parts/cell/high/plus, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, /turf/open/floor/plasteel/darkgreen, /area/storage/tech) "bQv" = ( @@ -38574,8 +38695,7 @@ }, /obj/machinery/camera{ c_tag = "Tech Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/item/circuitboard/computer/monastery_shuttle, /turf/open/floor/plasteel/darkgreen, @@ -38655,7 +38775,7 @@ }, /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -38863,8 +38983,7 @@ /obj/structure/closet/radiation, /obj/machinery/camera{ c_tag = "Gravity Generator Foyer"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -38987,7 +39106,7 @@ }, /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -39038,8 +39157,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics Central"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -39119,6 +39237,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bRI" = ( @@ -39147,6 +39266,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/tech) "bRL" = ( @@ -39241,6 +39361,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/storage/tech) "bRV" = ( @@ -39293,6 +39414,11 @@ dir = 4; id = "atmosdeliver" }, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "atmospherics security door" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bSb" = ( @@ -39343,8 +39469,7 @@ "bSh" = ( /obj/machinery/camera{ c_tag = "Atmospherics Starboard"; - dir = 8; - network = list("SS13") + dir = 8 }, /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -39573,7 +39698,6 @@ /obj/machinery/camera{ c_tag = "Aft Primary Hallway Engineering"; dir = 1; - network = list("SS13"); start_active = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -39957,11 +40081,11 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bTG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, -/area/engine/engineering) +/area/engine/break_room) "bTH" = ( /turf/open/floor/plasteel/yellow/side{ dir = 1 @@ -39996,8 +40120,7 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics Entrance"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/yellow/side{ dir = 1 @@ -40059,8 +40182,7 @@ /obj/structure/reagent_dispensers/fueltank, /obj/machinery/camera{ c_tag = "Atmospherics Mixing"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/yellow/side{ dir = 1 @@ -40150,6 +40272,7 @@ req_access_txt = "19;23" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/storage/tech) "bUh" = ( @@ -40162,8 +40285,7 @@ /obj/item/book/manual/wiki/security_space_law, /obj/machinery/camera{ c_tag = "Engineering Security Post"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/airalarm{ dir = 4; @@ -40189,16 +40311,19 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = 28 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + dir = 1; + name = "Engineering Foyer APC"; + pixel_y = 24 + }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bUm" = ( /obj/structure/cable{ icon_state = "1-2" @@ -40207,8 +40332,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bUn" = ( /obj/machinery/light{ dir = 1 @@ -40228,11 +40356,11 @@ dir = 5 }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bUo" = ( /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/machinery/door/firedoor/heavy, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -40240,7 +40368,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/atmos) "bUp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 6 @@ -40388,8 +40516,7 @@ }, /obj/machinery/camera{ c_tag = "Chief Engineer's Office"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/yellow/side{ dir = 1 @@ -40456,8 +40583,7 @@ /obj/machinery/power/smes/engineering, /obj/machinery/camera{ c_tag = "Engineering Power Storage"; - dir = 2; - network = list("SS13") + dir = 2 }, /turf/open/floor/plasteel/darkyellow/side{ dir = 1 @@ -40540,12 +40666,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bVa" = ( /obj/structure/cable{ icon_state = "1-2" @@ -40561,7 +40687,7 @@ dir = 4 }, /turf/open/floor/goonplaque, -/area/engine/engineering) +/area/engine/break_room) "bVb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40573,11 +40699,11 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bVc" = ( /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/machinery/door/firedoor/heavy, /obj/structure/disposalpipe/segment{ @@ -40588,9 +40714,8 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/atmos) "bVd" = ( -/obj/machinery/door/firedoor/heavy, /obj/machinery/door/airlock/atmos{ name = "Atmospherics"; req_access_txt = "24" @@ -40838,9 +40963,6 @@ /obj/structure/table/reinforced, /obj/item/clipboard, /obj/item/lighter, -/obj/item/clothing/glasses/meson{ - pixel_y = 4 - }, /obj/item/stamp/ce, /obj/item/stock_parts/cell/high/plus, /obj/machinery/keycard_auth{ @@ -40855,6 +40977,7 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel/yellow/side{ dir = 4 }, @@ -40974,7 +41097,7 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bVT" = ( /obj/structure/cable{ icon_state = "1-2" @@ -40985,7 +41108,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bVU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -40993,8 +41116,18 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/firealarm{ + dir = 1; + pixel_x = 27; + pixel_y = -39 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_x = 27; + pixel_y = -25 + }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bVV" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 0; @@ -41089,7 +41222,7 @@ /obj/machinery/camera{ c_tag = "Monastery Asteroid Primary Entrance"; dir = 1; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plating/asteroid, /area/chapel/asteroid/monastery) @@ -41228,7 +41361,7 @@ desc = "Used for watching the engine containment area."; dir = 4; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_x = -32 }, /turf/open/floor/plasteel/darkyellow/side{ @@ -41286,7 +41419,7 @@ desc = "Used for watching the engine containment area."; dir = 4; name = "Engine Monitor"; - network = list("Engine"); + network = list("engine"); pixel_x = -32 }, /turf/open/floor/plasteel/red/side{ @@ -41318,6 +41451,10 @@ }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, /turf/open/floor/plasteel, /area/engine/engineering) "bWF" = ( @@ -41351,7 +41488,7 @@ dir = 9 }, /turf/closed/wall, -/area/engine/engineering) +/area/engine/break_room) "bWI" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, @@ -41753,7 +41890,7 @@ desc = "Used for the Auxillary Mining Base."; dir = 1; name = "Auxillary Base Monitor"; - network = list("AuxBase"); + network = list("auxbase"); pixel_y = -28 }, /obj/machinery/computer/shuttle/mining{ @@ -42068,8 +42205,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Port Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -42246,8 +42382,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Starboard Fore"; - dir = 2; - network = list("SS13") + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -42760,10 +42895,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/item/airlock_painter, -/obj/item/clothing/glasses/meson{ - pixel_x = 3; - pixel_y = -4 - }, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cap" = ( @@ -42786,8 +42918,7 @@ }, /obj/machinery/camera{ c_tag = "Engineering Central"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/light, /obj/effect/turf_decal/stripes/line, @@ -42916,14 +43047,13 @@ }, /obj/machinery/camera{ c_tag = "Incinerator"; - dir = 4; - network = list("SS13") + dir = 4 }, /obj/machinery/computer/security/telescreen{ desc = "Used for watching the turbine vent."; dir = 4; name = "turbine vent monitor"; - network = list("Turbine"); + network = list("turbine"); pixel_x = -29 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -43014,7 +43144,7 @@ /obj/machinery/camera{ c_tag = "Turbine Chamber"; dir = 2; - network = list("Turbine") + network = list("turbine") }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) @@ -43100,11 +43230,11 @@ "cbe" = ( /obj/item/pen, /obj/item/storage/belt/utility, -/obj/item/clothing/glasses/meson, /obj/item/paper_bin{ layer = 2.9 }, /obj/structure/table/glass, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cbf" = ( @@ -43191,7 +43321,7 @@ /obj/structure/table, /obj/item/clothing/gloves/color/yellow, /obj/item/storage/belt/utility, -/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cbo" = ( @@ -43451,7 +43581,7 @@ /obj/machinery/camera{ c_tag = "Engineering Center"; dir = 2; - network = list("SS13","Engine"); + network = list("ss13","engine"); pixel_x = 23 }, /obj/machinery/light{ @@ -43621,7 +43751,7 @@ /obj/machinery/camera{ c_tag = "Auxillary Mining Base"; dir = 1; - network = list("SS13","AuxBase") + network = list("ss13","auxbase") }, /turf/open/floor/plating, /area/shuttle/auxillary_base) @@ -43640,6 +43770,9 @@ /obj/item/stack/sheet/mineral/plasma{ amount = 30 }, +/obj/item/device/gps{ + gpstag = "ENG0" + }, /turf/open/floor/plating, /area/engine/engineering) "ccS" = ( @@ -43790,7 +43923,7 @@ /obj/machinery/camera{ c_tag = "Chapel Port Access"; dir = 2; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) @@ -43860,8 +43993,7 @@ /obj/machinery/field/generator, /obj/machinery/camera{ c_tag = "Engineering Secure Storage"; - dir = 4; - network = list("SS13") + dir = 4 }, /turf/open/floor/plating, /area/engine/engineering) @@ -43899,8 +44031,7 @@ "cdP" = ( /obj/machinery/camera{ c_tag = "Engineering Port Aft"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/light, /obj/effect/turf_decal/stripes/line, @@ -43978,8 +44109,7 @@ "cdY" = ( /obj/machinery/camera{ c_tag = "Engineering Starboard Aft"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/machinery/light, /obj/effect/turf_decal/stripes/line, @@ -44201,7 +44331,7 @@ /obj/machinery/camera{ c_tag = "Chapel Crematorium"; dir = 2; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/chapel/office) @@ -44414,7 +44544,7 @@ /obj/machinery/camera{ c_tag = "Engineering Telecomms Access"; dir = 8; - network = list("Labor") + network = list("tcomm") }, /obj/machinery/light{ dir = 4 @@ -44424,7 +44554,7 @@ dir = 8; layer = 4; name = "Telecomms Telescreen"; - network = list("Telecomms"); + network = list("tcomm"); pixel_x = 30 }, /turf/open/floor/plasteel, @@ -44558,7 +44688,7 @@ /obj/machinery/camera{ c_tag = "Monastery Asteroid Starboard Aft"; dir = 1; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/asteroid, /area/chapel/asteroid/monastery) @@ -44611,7 +44741,7 @@ /obj/machinery/camera/emp_proof{ c_tag = "Engine Containment Port Fore"; dir = 2; - network = list("Engine") + network = list("engine") }, /turf/open/floor/plating/airless, /area/engine/engineering) @@ -44633,7 +44763,7 @@ /obj/machinery/camera/emp_proof{ c_tag = "Engine Containment Starboard Fore"; dir = 2; - network = list("Engine") + network = list("engine") }, /turf/open/floor/plating/airless, /area/engine/engineering) @@ -44697,7 +44827,7 @@ /obj/machinery/camera{ c_tag = "Monastery Garden"; dir = 2; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/grass, /area/hydroponics/garden/monastery) @@ -44925,7 +45055,7 @@ /obj/machinery/camera{ c_tag = "Monastery Kitchen"; dir = 4; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/hydrofloor, /area/chapel/main/monastery) @@ -45044,9 +45174,6 @@ icon_state = "0-8" }, /obj/machinery/power/tesla_coil, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, /turf/open/floor/plating/airless, /area/engine/engineering) "chz" = ( @@ -45054,9 +45181,6 @@ icon_state = "0-4" }, /obj/machinery/power/tesla_coil, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, /turf/open/floor/plating/airless, /area/engine/engineering) "chA" = ( @@ -45164,16 +45288,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/engine/engineering) -"chQ" = ( -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) "chR" = ( /obj/structure/cable{ icon_state = "2-4" @@ -45327,14 +45441,13 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "cit" = ( -/obj/machinery/the_singularitygen, +/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "ciu" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "civ" = ( @@ -45641,7 +45754,7 @@ pixel_y = 26 }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cjQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, @@ -45651,8 +45764,11 @@ icon_state = "1-4" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/carpet, -/area/library) +/area/library/lounge) "cjT" = ( /obj/structure/grille, /obj/structure/cable{ @@ -45675,7 +45791,7 @@ invuln = 1; luminosity = 3; name = "Hardened Bomb-Test Camera"; - network = list("Toxins"); + network = list("toxins"); use_power = 0 }, /turf/open/floor/plating/asteroid/airless, @@ -45769,7 +45885,7 @@ }, /obj/machinery/photocopier, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/carpet, @@ -45784,7 +45900,7 @@ icon_state = "cobweb2" }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckq" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -45793,7 +45909,7 @@ /obj/machinery/camera/emp_proof{ c_tag = "Engine Containment Port Aft"; dir = 1; - network = list("Engine") + network = list("engine") }, /turf/open/floor/plating/airless, /area/engine/engineering) @@ -45801,7 +45917,7 @@ /obj/machinery/camera/emp_proof{ c_tag = "Engine Containment Starboard Aft"; dir = 1; - network = list("Engine") + network = list("engine") }, /turf/open/floor/plating/airless, /area/engine/engineering) @@ -45871,8 +45987,12 @@ /area/maintenance/department/chapel/monastery) "ckD" = ( /obj/structure/chair/wood/normal, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -28 + }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckE" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -45889,14 +46009,17 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/carpet, -/area/library) +/area/library/lounge) "ckG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckH" = ( /turf/open/floor/plasteel/dark, /area/library) @@ -45905,7 +46028,7 @@ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckJ" = ( /obj/structure/sign/warning/securearea, /turf/closed/wall/r_wall, @@ -45961,25 +46084,26 @@ /obj/machinery/camera{ c_tag = "Monastery Library"; dir = 4; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckT" = ( /obj/machinery/door/airlock/centcom{ name = "Library" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckU" = ( /obj/machinery/bookbinder, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckV" = ( /obj/structure/bookcase/random/reference, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckW" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/plasteel/dark, @@ -45987,7 +46111,7 @@ "ckX" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "clb" = ( /obj/machinery/door/poddoor{ id = "chapelgun"; @@ -46022,7 +46146,7 @@ dir = 1 }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cli" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -46041,15 +46165,15 @@ }, /obj/machinery/libraryscanner, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "clm" = ( /obj/structure/closet/crate/bin, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cln" = ( /obj/structure/bookcase/random/adult, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "clp" = ( /obj/structure/table/wood, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -46063,7 +46187,7 @@ /obj/machinery/camera{ c_tag = "Telecomms External Fore"; dir = 1; - network = list("SS13, Telecomms"); + network = list("SS13","tcomm"); start_active = 1 }, /turf/open/space, @@ -46239,7 +46363,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Access"; dir = 1; - network = list("SS13","Telecomms") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel, /area/tcommsat/computer) @@ -46334,7 +46458,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms Monitoring"; dir = 2; - network = list("SS13","Telecomms") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel/yellow/side{ dir = 1 @@ -46442,7 +46566,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Port"; dir = 8; - network = list("Telecomms") + network = list("tcomm") }, /turf/open/space, /area/space/nearstation) @@ -46504,7 +46628,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Starboard"; dir = 4; - network = list("Telecomms") + network = list("tcomm") }, /turf/open/space, /area/space/nearstation) @@ -46697,7 +46821,7 @@ invuln = 1; luminosity = 3; name = "Hardened Bomb-Test Camera"; - network = list("Toxins"); + network = list("toxins"); use_power = 0 }, /turf/open/floor/plating/asteroid/airless, @@ -46737,7 +46861,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms Server Room"; dir = 1; - network = list("SS13","Telecomms") + network = list("ss13","tcomm") }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) @@ -46768,7 +46892,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Port Aft"; dir = 2; - network = list("Telecomms") + network = list("tcomm") }, /turf/open/space, /area/space/nearstation) @@ -46777,7 +46901,7 @@ /obj/machinery/camera/motion{ c_tag = "Telecomms External Starboard Aft"; dir = 2; - network = list("Telecomms") + network = list("tcomm") }, /turf/open/space, /area/space/nearstation) @@ -47242,8 +47366,7 @@ "cpx" = ( /obj/machinery/camera{ c_tag = "Kitchen"; - dir = 1; - network = list("SS13") + dir = 1 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -47761,7 +47884,7 @@ /obj/machinery/camera{ c_tag = "Chapel Port"; dir = 4; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) @@ -47786,7 +47909,7 @@ /obj/machinery/camera{ c_tag = "Chapel Starboard"; dir = 8; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) @@ -48012,7 +48135,7 @@ /obj/machinery/camera{ c_tag = "Chapel Office Tunnel"; dir = 1; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/asteroid, /area/chapel/office) @@ -48057,7 +48180,7 @@ /obj/machinery/camera{ c_tag = "Chapel Starboard Access"; dir = 2; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /obj/structure/chair/wood/normal, /turf/open/floor/plasteel/dark, @@ -48157,7 +48280,7 @@ /obj/machinery/camera{ c_tag = "Chapel Office"; dir = 8; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/chapel/office) @@ -48208,7 +48331,7 @@ /obj/machinery/camera{ c_tag = "Monastery Cloister Fore"; dir = 2; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -48407,7 +48530,7 @@ /obj/machinery/camera{ c_tag = "Monastery Cloister Port"; dir = 4; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) @@ -48453,7 +48576,7 @@ /obj/machinery/camera{ c_tag = "Monastery Dining Room"; dir = 8; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) @@ -48618,7 +48741,7 @@ /obj/machinery/camera{ c_tag = "Monastery Cloister Starboard"; dir = 8; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) @@ -48626,7 +48749,7 @@ /obj/machinery/camera{ c_tag = "Monastery Secondary Dock"; dir = 8; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -48771,7 +48894,7 @@ /obj/machinery/camera{ c_tag = "Monastery Cloister Aft"; dir = 1; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/vault{ dir = 5 @@ -48828,7 +48951,7 @@ /obj/machinery/camera{ c_tag = "Monastery Cemetary"; dir = 4; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) @@ -48881,7 +49004,7 @@ /area/maintenance/department/chapel/monastery) "cwe" = ( /turf/closed/wall/mineral/iron, -/area/library) +/area/library/lounge) "cwg" = ( /obj/machinery/door/airlock/centcom{ name = "Library" @@ -48890,8 +49013,9 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cwj" = ( /obj/item/storage/box/matches{ pixel_x = -3; @@ -48973,14 +49097,14 @@ }, /obj/machinery/power/apc{ dir = 4; - name = "Library APC"; + name = "Library Lounge APC"; pixel_x = 24 }, /obj/machinery/airalarm{ pixel_y = 22 }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cww" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/grown/poppy, @@ -49052,7 +49176,7 @@ dir = 8 }, /turf/open/floor/carpet, -/area/library) +/area/library/lounge) "cwM" = ( /obj/structure/window/reinforced{ dir = 4; @@ -49079,13 +49203,16 @@ /obj/structure/table/wood, /obj/machinery/computer/libraryconsole, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cxe" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/carpet, -/area/library) +/area/library/lounge) "cxg" = ( /obj/structure/window/reinforced{ dir = 1; @@ -49122,21 +49249,25 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, -/area/library) +/area/library/lounge) "cxz" = ( /obj/machinery/door/airlock/centcom{ name = "Library" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cxB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/closed/wall, -/area/library) +/area/library/lounge) "cxC" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -49147,7 +49278,7 @@ /turf/open/floor/plasteel/vault{ dir = 4 }, -/area/library) +/area/library/lounge) "cxD" = ( /obj/effect/turf_decal/stripes/corner{ dir = 2 @@ -49155,21 +49286,24 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/vault{ dir = 1 }, -/area/library) +/area/library/lounge) "cxE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, /turf/closed/wall, -/area/library) +/area/library/lounge) "cxJ" = ( /obj/structure/window/reinforced/fulltile, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/library) +/area/library/lounge) "cxK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49180,20 +49314,23 @@ /turf/open/floor/plasteel/vault{ dir = 4 }, -/area/library) +/area/library/lounge) "cxL" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/vault{ dir = 1 }, -/area/library) +/area/library/lounge) "cxM" = ( /obj/structure/window/reinforced/fulltile, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/library) +/area/library/lounge) "cxX" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49201,12 +49338,12 @@ /obj/machinery/camera{ c_tag = "Monastery Archives Access Tunnel"; dir = 4; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/vault{ dir = 4 }, -/area/library) +/area/library/lounge) "cxY" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -49214,10 +49351,13 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/vault{ dir = 1 }, -/area/library) +/area/library/lounge) "cyl" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49225,22 +49365,37 @@ /turf/open/floor/plasteel/vault{ dir = 4 }, -/area/library) +/area/library/lounge) "cym" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/vault{ dir = 1 }, -/area/library) +/area/library/lounge) +"cyr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, +/turf/open/floor/plasteel/red/side{ + dir = 1 + }, +/area/security/brig) "cyy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, /turf/closed/wall, -/area/library) +/area/library/lounge) "cyz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -49251,7 +49406,7 @@ /turf/open/floor/plasteel/vault{ dir = 4 }, -/area/library) +/area/library/lounge) "cyA" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -49259,16 +49414,19 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/vault{ dir = 1 }, -/area/library) +/area/library/lounge) "cyB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, /turf/closed/wall, -/area/library) +/area/library/lounge) "cyL" = ( /obj/structure/lattice, /obj/structure/lattice, @@ -49292,7 +49450,11 @@ /obj/machinery/camera{ c_tag = "Monastery Archives Fore"; dir = 2; - network = list("SS13","Monastery") + network = list("ss13","monastery") + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 }, /turf/open/floor/plasteel/dark, /area/library) @@ -49414,7 +49576,7 @@ /obj/machinery/camera{ c_tag = "Monastery Archives Port"; dir = 4; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/library) @@ -49455,7 +49617,7 @@ /obj/machinery/camera{ c_tag = "Monastery Archives Starboard"; dir = 8; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/library) @@ -49636,7 +49798,7 @@ /obj/machinery/camera{ c_tag = "Monastery Archives Aft"; dir = 1; - network = list("SS13","Monastery") + network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, /area/library) @@ -49666,7 +49828,6 @@ /area/maintenance/department/engine) "cBk" = ( /obj/machinery/vending/boozeomat{ - products = list(/obj/item/reagent_containers/food/drinks/bottle/whiskey = 1, /obj/item/reagent_containers/food/drinks/bottle/absinthe = 1, /obj/item/reagent_containers/food/drinks/bottle/limejuice = 1, /obj/item/reagent_containers/food/drinks/bottle/cream = 1, /obj/item/reagent_containers/food/drinks/soda_cans/tonic = 1, /obj/item/reagent_containers/food/drinks/drinkingglass = 10, /obj/item/reagent_containers/food/drinks/ice = 3, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 6, /obj/item/reagent_containers/food/drinks/flask = 1); req_access_txt = "0" }, /turf/closed/wall, @@ -49827,29 +49988,9 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "cBQ" = ( -/obj/machinery/power/rad_collector/anchored, +/obj/machinery/power/rad_collector, /turf/open/floor/plating, /area/engine/engineering) -"cBR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cBS" = ( -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) "cBT" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating/airless, @@ -49972,26 +50113,75 @@ "cDa" = ( /turf/closed/wall, /area/quartermaster/warehouse) -"cDX" = ( +"dTw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/carpet, +/area/library) +"ecV" = ( +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"eHp" = ( +/turf/closed/wall, +/area/crew_quarters/cryopod) +"eIE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"eJt" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/darkpurple, +/area/crew_quarters/cryopod) +"fic" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ icon_state = "0-2" }, /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"gfg" = ( +"fki" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"frt" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"fyh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel/darkpurple, -/area/crew_quarters/cryopod) -"gHc" = ( -/turf/open/floor/plasteel/darkpurple, -/area/crew_quarters/cryopod) -"gOG" = ( -/obj/machinery/cryopod, -/turf/open/floor/plasteel/darkpurple, -/area/crew_quarters/cryopod) +/turf/open/floor/carpet, +/area/library) +"fID" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"izp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "Engineering"; + name = "engineering security door" + }, +/turf/open/floor/plating, +/area/security/checkpoint/engineering) "izB" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod" @@ -50001,6 +50191,22 @@ }, /turf/open/floor/plating, /area/crew_quarters/dorms) +"iCc" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"iVb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "jgr" = ( /obj/machinery/door/airlock/centcom{ name = "Library" @@ -50009,8 +50215,27 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) +"jZg" = ( +/obj/machinery/cryopod, +/turf/open/floor/plasteel/darkpurple, +/area/crew_quarters/cryopod) +"kdc" = ( +/obj/machinery/cryopod, +/obj/machinery/light/small/built{ + dir = 4 + }, +/turf/open/floor/plasteel/darkpurple, +/area/crew_quarters/cryopod) +"khx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/stairs, +/area/crew_quarters/cryopod) "kjK" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "MiniSat Maintenance"; @@ -50024,53 +50249,94 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAP) -"kls" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/cryopod{ - tag = "icon-cryopod-open (EAST)"; - icon_state = "cryopod-open"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/prison) -"kFZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"kqj" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/quartermaster/storage) +"krG" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/library) +"let" = ( +/turf/closed/wall/r_wall, +/area/space) "lqy" = ( /obj/machinery/door/airlock/centcom{ name = "Library" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"lvl" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/cigbutt, +/turf/open/floor/plating, +/area/maintenance/department/cargo) +"mHo" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 27 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"mLe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel/darkred/side{ + dir = 1 + }, +/area/crew_quarters/heads/hos) +"nuB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/library/lounge) +"nJY" = ( +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/plating, +/area/maintenance/department/cargo) +"opC" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/power/apc{ + dir = 4; + name = "Library APC"; + pixel_x = 24 + }, +/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/library) -"mTb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"oig" = ( -/obj/machinery/cryopod, -/obj/machinery/light/small/built{ - dir = 4 - }, -/turf/open/floor/plasteel/darkpurple, -/area/crew_quarters/cryopod) +"oJF" = ( +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/plasteel/dark, +/area/library/lounge) "oPy" = ( /obj/machinery/door/airlock/external{ name = "Mining Dock Airlock"; @@ -50091,7 +50357,36 @@ }, /turf/open/floor/plating, /area/chapel/dock) -"pCj" = ( +"pps" = ( +/turf/closed/wall, +/area/engine/break_room) +"qWK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"sHK" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"sQt" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"tap" = ( /obj/machinery/power/apc{ areastring = "/area/medical/cryo"; dir = 1; @@ -50103,31 +50398,48 @@ }, /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"sQt" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock"; - req_access_txt = "31" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +"tez" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/library/lounge) +"tjW" = ( +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"tBM" = ( +/obj/machinery/cryopod{ + tag = "icon-cryopod-open (EAST)"; + icon_state = "cryopod-open"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"ufi" = ( +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"urZ" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/open/floor/plasteel/stairs, -/area/crew_quarters/cryopod) -"tWw" = ( -/obj/machinery/computer/cryopod{ - pixel_y = 24 +/turf/open/floor/plasteel/dark, +/area/library) +"uyt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uPm" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"vpU" = ( /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"vvr" = ( -/turf/closed/wall, -/area/crew_quarters/cryopod) "vzz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -50146,8 +50458,38 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) +"vTA" = ( +/obj/machinery/door/poddoor/preopen{ + id = "bridgespace"; + name = "bridge external shutters" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/bridge) +"xzr" = ( +/turf/closed/wall, +/area/quartermaster/sorting) +"yhZ" = ( +/obj/structure/table, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/turf/open/floor/plasteel/whitepurple/side, +/area/science/lab) +"yia" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) (1,1,1) = {" aaa @@ -67813,13 +68155,13 @@ cgG cfn ckE ckT -cjQ -cjQ +tez +tez cwK -cjQ -cjQ +tez +tez cxn -cjQ +tez lqy cxC cxK @@ -68071,12 +68413,12 @@ cvw cvK cwg cjR -ckm +nuB ckF -ckm +nuB cxe -ckm -ckm +nuB +nuB cxz cxD cxL @@ -68084,8 +68426,8 @@ cxY cym cyA vOw -ckm -ckm +fyh +dTw ckm ckm ckm @@ -68331,7 +68673,7 @@ cwr clm ckG cwU -cli +eIE ckU cwe cwe @@ -68342,7 +68684,7 @@ cxM cyB cjp cyR -ckH +urZ ckH ckH ckH @@ -68585,10 +68927,10 @@ cvy cvL cwe cwe -cko -ckH +sHK +ufi ckV -ckH +ufi cln cwe cfN @@ -68599,7 +68941,7 @@ aaa aaa cjp cyS -ckH +urZ cyZ ckH czo @@ -68842,10 +69184,10 @@ cvc cvM cfm cwe -cko -ckH -ckW -ckH +sHK +ufi +oJF +ufi cln cwe caS @@ -68856,7 +69198,7 @@ aht aht cjp cko -ckH +urZ ckH ckH clp @@ -69113,7 +69455,7 @@ aaa aaa cjp cyT -ckH +urZ cyZ ckH czp @@ -69370,8 +69712,8 @@ aht aht cjp cjp -ckH -ckI +krG +opC ckH czq czw @@ -69742,7 +70084,7 @@ aem aem aeT afn -kls +tjW afZ agn agy @@ -70022,7 +70364,7 @@ apE apE ari apE -atu +bBW apE avq apE @@ -70277,9 +70619,9 @@ aok aoO apF apE -aqC +bKN apE -atu +bBW ajM avr awH @@ -73617,7 +73959,7 @@ anJ amX aoY apN -aqp +cyr arp asB atB @@ -76954,7 +77296,7 @@ akW alK amw ani -anT +mLe aiR aph ajM @@ -78863,8 +79205,8 @@ bXk bXk bXk bXk -aaa -aaa +bXk +let aaa aaa aaa @@ -79119,9 +79461,9 @@ chR cgt cjT ckq +ckq bXk -aaa -aaa +let aaa aaa aaa @@ -79376,9 +79718,9 @@ chS cfV cgS cfV +cfV bXk -aaa -aaa +let aaa aaa aaa @@ -79561,7 +79903,7 @@ aRN aWa aRN aRN -bce +mHo aYS cpn bch @@ -79632,10 +79974,10 @@ cfV cfV cfV cgT +cfV ckr bXk -aaa -aaa +let aaa aaa aaa @@ -79882,17 +80224,17 @@ cfU cgu cgU chw -cBR -chw -chw +cgU chw +cgU chw +cgU cjs cfV cfV -bTE -aaa -aaa +cfV +bXk +let aaa aaa aaa @@ -80139,17 +80481,17 @@ cfV cgv cfV chx -chQ +cfV chx -chQ +cfV chx -chQ +cfV chx cfV cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -80338,7 +80680,7 @@ baa baa baa beu -bfq +bgk bgn aJI aDZ @@ -80397,16 +80739,16 @@ cgv cgV bBW bBW -aaa cgV +aht aaa bBW bBW cgV cfV -bTE -abI -abI +cfV +bXk +let aaa aaa aaa @@ -80654,16 +80996,16 @@ cgv bBW bBW bBW -aaa +yia abI aaa bBW bBW bBW cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -80918,9 +81260,9 @@ aaa bBW bBW cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -81172,12 +81514,12 @@ cii cis ciG aaa -aaa -aaa +yia +cgV cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -81422,7 +81764,7 @@ cfd cfw cfW cgw -cgV +aht abI abI cij @@ -81430,11 +81772,11 @@ cit ciH abI abI -cgV +aht cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -81679,8 +82021,8 @@ cfe cfx cfa cgv -aaa -aaa +cgV +yia aaa cik ciu @@ -81689,9 +82031,9 @@ aaa aaa aaa cfV -bTE -aaa -aaa +cfV +bXk +let aaa aaa aaa @@ -81946,9 +82288,9 @@ aaa bBW bBW cfV -bTE -aaa -aaa +cfV +bXk +let aaa aaa aaa @@ -82198,14 +82540,14 @@ bBW aaa aaa abI -aaa +yia aaa bBW bBW cfV -bTE -aaa -aaa +cfV +bXk +let aaa aaa aaa @@ -82436,7 +82778,7 @@ bUi bUV bVO bWA -bTC +izp bYj bYQ bZA @@ -82454,15 +82796,15 @@ cgV bBW aaa aaa +aht cgV -aaa bBW bBW cgV cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -82693,7 +83035,7 @@ bUj bUW bVP bWB -bTC +izp bYk bYQ bZA @@ -82709,17 +83051,17 @@ cfV cgv cfV chz -cBS +cfV chz -cBS +cfV chz -cBS +cfV chz cfV cfV -bTE -abI -abI +cfV +bXk +let abI abI aaa @@ -82875,9 +83217,9 @@ ahi atY auU atY -axf +vTA ayf -axf +vTA aAF aBz aCP @@ -82950,7 +83292,7 @@ bUk bUX bVQ bWC -bTC +izp bYl bYO bZC @@ -82966,17 +83308,17 @@ cfU cgx cgU chA +cgU chA +cgU chA -chA -chA -chA +cgU cjt cfV cfV -bTE -abI -aaa +cfV +bXk +let abI aaa aaa @@ -83230,10 +83572,10 @@ cfV cfV cfV cgY +cfV cks bXk -abI -aaa +let aaa aaa aaa @@ -83459,7 +83801,7 @@ bOL bRp bRY bSM -bTE +pps bUl bUZ bVS @@ -83488,9 +83830,9 @@ chO cfV cgZ cfV +cfV bXk -abI -abI +let abI aaa aaa @@ -83745,9 +84087,9 @@ chP cgt cjU ckq +ckq bXk -abI -aaa +let aaa aaa aaa @@ -83973,7 +84315,7 @@ bmC bRo bmC bQD -bTE +pps bUn bVb bVU @@ -84002,9 +84344,9 @@ bXk bXk bXk bXk +bXk ckJ -abI -aaa +let aaa aaa aaa @@ -84724,7 +85066,7 @@ bsT bus bvz bxg -byH +yhZ bAs bBu bCI @@ -86737,12 +87079,12 @@ aaa aaa aaa aaa -vvr -pCj -gfg -tBM -kFZ -aIU +eHp +tap +aau +khx +iVb +qWK aJI aLe aMe @@ -86761,7 +87103,7 @@ aVu bat aLf bcy -aKq +lvl aEj aEj bgC @@ -86994,11 +87336,11 @@ aaa aaa aaa aaa -vvr -tWw -gHc -cDX -mTb +eHp +eJt +vpU +fic +uyt aIU aJH aLe @@ -87251,20 +87593,20 @@ apX aBL aBL apX -vvr -oig -gOG -vvr +eHp +kdc +jZg +eHp aHN aIU aJI -aLf -aLf +xzr +xzr aNG aOR -aPW -aLf -aLf +iCc +xzr +xzr aTb aOT aVp @@ -87275,7 +87617,7 @@ aPY bav aLf aFi -aFi +nJY beI bfv bgE @@ -87515,7 +87857,7 @@ aET aHN aIU aJI -aLf +xzr aMg aNH aOS @@ -87772,11 +88114,11 @@ aET aHN aJh bhe -aLf +xzr aMh aNI -aOT -aPY +fID +ecV aRi aSf aTd @@ -88029,13 +88371,13 @@ aHn aIi aJi aKe -aLf +xzr aMi aNJ -aOT +fID aPZ aRj -aLf +xzr aTe aUo aVs @@ -88286,13 +88628,13 @@ aET aHN aIU aJI -aLf +xzr aMj aNK -aOT -aPY -aPY -aPW +fID +ecV +ecV +iCc aTf aUp aVt @@ -88543,7 +88885,7 @@ aET aHN aIU aJI -aLf +xzr aMk aNL aOU @@ -88800,10 +89142,10 @@ cos coy aJj aJI -aLf +xzr aMl aNM -aOV +fki aQb aRl aSh @@ -89057,14 +89399,14 @@ aDZ aDZ aJk aJH -aLf +xzr aMm -aLf +xzr aOW -aLf -aLf -aLf -aSY +xzr +xzr +xzr +frt aUs aLf aLf @@ -89307,18 +89649,18 @@ aAP avk aDg aEc -aEY +aGW cot aBI aBI aBI aJl aKf -aLf +xzr aMn -aLf +xzr aOX -aLf +xzr aRm aLg aTi @@ -89578,7 +89920,7 @@ cDa cDa cDa aLg -aTj +kqj aUu aVx aVx @@ -92941,7 +93283,7 @@ bkE aht bnd boh -bpp +uPm bqx brQ btr diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 7507cf7ce5..23b7b0aaa5 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -2,6 +2,33 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aab" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/comfy/black, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"aac" = ( +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/comfy/black, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"aad" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "aae" = ( /obj/effect/landmark/carpspawn, /turf/open/space, @@ -234,6 +261,13 @@ }, /turf/open/floor/plasteel/barber, /area/security/prison) +"aaR" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "aaS" = ( /obj/structure/grille, /obj/structure/lattice, @@ -243,7 +277,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/open/space, -/area/space/nearstation) +/area/space) "aaU" = ( /obj/machinery/computer/arcade, /turf/open/floor/plasteel/floorgrime, @@ -347,6 +381,40 @@ /obj/machinery/vending/security, /turf/open/floor/plasteel/showroomfloor, /area/security/main) +"abm" = ( +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/button/door{ + id = "xenobio8"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"abn" = ( +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/button/door{ + id = "xenobio7"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "abo" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -468,6 +536,33 @@ }, /turf/open/floor/plasteel/freezer, /area/security/prison) +"abH" = ( +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio6"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"abI" = ( +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"abJ" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "abK" = ( /obj/structure/chair/stool, /obj/machinery/light/small{ @@ -519,6 +614,15 @@ "abO" = ( /turf/open/floor/plasteel/showroomfloor, /area/security/main) +"abP" = ( +/obj/structure/rack, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "abQ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/window/southleft{ @@ -743,10 +847,27 @@ /obj/structure/closet/secure_closet/hos, /turf/open/floor/carpet, /area/crew_quarters/heads/hos) +"aco" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 2; + external_pressure_bound = 140; + pressure_checks = 0; + name = "killroom vent" + }, +/obj/machinery/camera{ + c_tag = "Xenobiology Kill Room"; + dir = 4; + network = list("ss13","rd") + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "acp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/showroomfloor, /area/security/main) +"acq" = ( +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "acr" = ( /obj/structure/chair/comfy/black, /obj/effect/landmark/start/head_of_security, @@ -778,6 +899,14 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"acw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 2; + external_pressure_bound = 120; + name = "killroom vent" + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "acx" = ( /obj/structure/cable{ icon_state = "1-2" @@ -932,7 +1061,6 @@ pixel_x = 3; pixel_y = -3 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/bot{ dir = 2 }, @@ -1204,6 +1332,11 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) +"adr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/biohazard, +/turf/open/floor/plating, +/area/science/xenobiology) "ads" = ( /obj/structure/cable{ icon_state = "0-2" @@ -1813,6 +1946,12 @@ "aeE" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/pod_3) +"aeF" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "aeG" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -2365,6 +2504,17 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) +"afQ" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + target_temperature = 80; + dir = 2; + on = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "afR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/spawner/structure/window/reinforced, @@ -2440,9 +2590,18 @@ /turf/open/floor/plating, /area/security/main) "agd" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) +"age" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "agf" = ( /obj/structure/table, /obj/item/stack/sheet/metal, @@ -2528,6 +2687,11 @@ "agn" = ( /turf/closed/wall/r_wall, /area/security/warden) +"ago" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "agp" = ( /obj/structure/cable{ icon_state = "0-2" @@ -2588,6 +2752,17 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"agv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Kill Chamber"; + req_access_txt = "55" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/xenobiology) "agw" = ( /obj/structure/table, /obj/machinery/syndicatebomb/training, @@ -3013,6 +3188,15 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"ahw" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "ahx" = ( /obj/structure/cable{ icon_state = "2-4" @@ -3238,6 +3422,13 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"ahR" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "ahS" = ( /obj/structure/cable{ icon_state = "1-8" @@ -3643,6 +3834,18 @@ /obj/machinery/light, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"aiN" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/obj/structure/table, +/obj/item/folder/white, +/obj/item/pen, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "aiO" = ( /obj/structure/window/reinforced{ dir = 4 @@ -3934,6 +4137,10 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) +"ajC" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/xenobiology) "ajD" = ( /obj/structure/cable{ icon_state = "4-8" @@ -3955,6 +4162,11 @@ dir = 8 }, /area/security/brig) +"ajG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/science/xenobiology) "ajH" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -4091,6 +4303,15 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/solars/port/fore) +"ajX" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"ajY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "ajZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external{ @@ -4577,15 +4798,13 @@ /area/engine/atmos) "aln" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; name = "Labor Camp Shuttle Airlock"; - req_access_txt = "2"; - shuttledocked = 1 + req_access_txt = "2" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/security/processing) "alp" = ( /turf/open/floor/plating, @@ -4732,7 +4951,7 @@ }, /area/security/courtroom) "alJ" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/neutral/side, /area/security/courtroom) "alK" = ( @@ -5353,7 +5572,7 @@ /area/maintenance/fore/secondary) "anE" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; req_access_txt = "13" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -5392,17 +5611,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/fore) -"anN" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; - name = "Labor Camp Shuttle Airlock"; - shuttledocked = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/processing) "anO" = ( /obj/docking_port/stationary{ dir = 8; @@ -8008,8 +8216,7 @@ "auX" = ( /obj/structure/mirror{ icon_state = "mirror_broke"; - pixel_y = 28; - broken = 1 + pixel_y = 28 }, /obj/machinery/iv_drip, /turf/open/floor/plating, @@ -8017,8 +8224,7 @@ "auY" = ( /obj/structure/mirror{ icon_state = "mirror_broke"; - pixel_y = 28; - broken = 1 + pixel_y = 28 }, /obj/item/shard{ icon_state = "medium" @@ -15526,7 +15732,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit) "aOe" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/machinery/camera{ c_tag = "Arrivals Bay 1 South" }, @@ -18067,7 +18273,7 @@ /turf/open/floor/plasteel, /area/bridge) "aVp" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/structure/cable{ icon_state = "4-8" }, @@ -22584,7 +22790,6 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/smoke_machine, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bha" = ( @@ -22777,7 +22982,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /turf/open/floor/plasteel/white, /area/science/robotics/lab) "bhy" = ( @@ -24571,7 +24776,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/rnd/protolathe/department/science, +/obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/plasteel, /area/science/lab) "blK" = ( @@ -25210,7 +25415,7 @@ /area/science/lab) "bno" = ( /obj/item/reagent_containers/glass/beaker/sulphuric, -/obj/machinery/rnd/circuit_imprinter/department/science, +/obj/machinery/rnd/production/circuit_imprinter/department/science, /turf/open/floor/plasteel, /area/science/lab) "bnp" = ( @@ -27325,7 +27530,7 @@ pixel_y = 1 }, /obj/structure/table, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -33041,7 +33246,7 @@ department = "Medbay"; departmentType = 1; name = "Medbay RC"; - pixel_w = 30 + pixel_x = 30 }, /turf/open/floor/plasteel/white, /area/medical/sleeper) @@ -34219,8 +34424,8 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bIm" = ( -/obj/machinery/rnd/protolathe/department/medical, /obj/machinery/light, +/obj/machinery/rnd/production/techfab/department/medical, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bIn" = ( @@ -34461,13 +34666,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"bIP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair/comfy/black, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bIQ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -35616,7 +35814,7 @@ /turf/open/floor/plating/airless, /area/science/test_area) "bLp" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plating/airless, /area/science/test_area) "bLq" = ( @@ -37311,14 +37509,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"bPy" = ( -/obj/effect/landmark/start/scientist, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair/comfy/black, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bPz" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers{ @@ -37342,18 +37532,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"bPA" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bPB" = ( /obj/structure/table/glass, /obj/item/paper_bin{ @@ -37440,13 +37618,6 @@ /obj/item/clothing/glasses/science, /turf/open/floor/plasteel, /area/science/xenobiology) -"bPI" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bPJ" = ( /obj/structure/table/glass, /obj/item/stack/sheet/mineral/plasma{ @@ -38079,7 +38250,7 @@ dir = 8; layer = 4; name = "Engine Monitor"; - network = list("engine"); + network = list("singularity"); pixel_x = 30 }, /turf/open/floor/plasteel/red/side{ @@ -38367,23 +38538,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"bRY" = ( -/obj/structure/window/reinforced, -/obj/structure/table/reinforced, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/button/door{ - id = "xenobio8"; - name = "Containment Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bRZ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -39532,7 +39686,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bUN" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel, /area/engine/atmos) "bUO" = ( @@ -40072,23 +40226,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/science/xenobiology) -"bWm" = ( -/obj/structure/window/reinforced, -/obj/structure/table/reinforced, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/button/door{ - id = "xenobio7"; - name = "Containment Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bWn" = ( /obj/structure/cable{ icon_state = "0-2" @@ -40339,9 +40476,6 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bWV" = ( @@ -41546,23 +41680,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/science/xenobiology) -"bZW" = ( -/obj/structure/window/reinforced, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio6"; - name = "Containment Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bZX" = ( /obj/structure/cable{ icon_state = "0-2" @@ -42017,7 +42134,7 @@ /turf/open/floor/engine, /area/science/misc_lab) "caY" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/engine, /area/science/misc_lab) "caZ" = ( @@ -42803,14 +42920,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"ccP" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"ccQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/xenobiology) "ccR" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/bot{ @@ -43716,20 +43825,6 @@ /obj/item/caution, /turf/open/floor/plating, /area/maintenance/aft) -"cfr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 2; - external_pressure_bound = 140; - pressure_checks = 0; - name = "killroom vent" - }, -/obj/machinery/camera{ - c_tag = "Xenobiology Kill Room"; - dir = 4; - network = list("ss13","rd") - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cfs" = ( /obj/machinery/door/airlock/maintenance/abandoned{ name = "Air Supply Maintenance"; @@ -43767,15 +43862,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/maintenance/solars/port/aft) -"cfy" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cfz" = ( /obj/structure/cable{ icon_state = "4-8" @@ -43827,16 +43913,6 @@ dir = 5 }, /area/crew_quarters/heads/chief) -"cfI" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/yellow/side{ - dir = 4 - }, -/area/engine/engineering) "cfJ" = ( /obj/machinery/light/small{ dir = 1 @@ -44021,9 +44097,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"cgi" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cgj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/barricade/wooden, @@ -44032,19 +44105,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cgk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/biohazard, -/turf/open/floor/plating, -/area/science/xenobiology) -"cgl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 2; - external_pressure_bound = 120; - name = "killroom vent" - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cgm" = ( /obj/structure/cable{ icon_state = "4-8" @@ -44054,17 +44114,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cgn" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - target_temperature = 80; - dir = 2; - on = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cgo" = ( /obj/structure/cable{ icon_state = "4-8" @@ -44139,13 +44188,13 @@ /area/engine/engineering) "cgw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cgx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/closed/wall/r_wall, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cgy" = ( /obj/machinery/light/small{ @@ -44215,32 +44264,22 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cgI" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "cgJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cgK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"cgL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cgO" = ( /obj/structure/rack, @@ -44254,16 +44293,6 @@ dir = 5 }, /area/crew_quarters/heads/chief) -"cgQ" = ( -/obj/machinery/camera{ - c_tag = "Engineering East"; - dir = 8 - }, -/obj/structure/closet/wardrobe/engineering_yellow, -/turf/open/floor/plasteel/yellow/corner{ - dir = 4 - }, -/area/engine/engineering) "cgR" = ( /turf/open/floor/plasteel, /area/engine/engineering) @@ -44462,13 +44491,6 @@ }, /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) -"cho" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "chp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44478,44 +44500,6 @@ }, /turf/closed/wall, /area/maintenance/starboard/aft) -"chq" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"chr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Kill Chamber"; - req_access_txt = "55" - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/xenobiology) -"chs" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cht" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"chu" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "chv" = ( /obj/structure/cable{ icon_state = "1-4" @@ -44624,25 +44608,24 @@ /turf/open/floor/plasteel, /area/engine/engineering) "chF" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/office/dark{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "chG" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "chH" = ( /obj/structure/closet/firecloset, @@ -44740,35 +44723,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"chV" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5 - }, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/glasses/meson/engine, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "chX" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/turf/open/floor/engine, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "chY" = ( /obj/machinery/shieldgen, @@ -44852,24 +44815,6 @@ "cig" = ( /turf/closed/wall, /area/engine/engineering) -"cii" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/device/geiger_counter, -/obj/item/device/geiger_counter, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cij" = ( /obj/machinery/modular_computer/console/preset/engineering, /obj/structure/cable{ @@ -44907,15 +44852,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) -"cip" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) "ciq" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -44925,13 +44861,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/chief) -"cir" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "cis" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, @@ -45072,14 +45001,18 @@ /turf/open/floor/plasteel, /area/engine/engineering) "ciO" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/engineering_singularity_safety{ + pixel_x = 3; + pixel_y = 3 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/engineering_particle_accelerator{ + pixel_x = -3; + pixel_y = -3 }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/turf/open/floor/plasteel, /area/engine/engineering) "ciP" = ( /obj/structure/cable{ @@ -45221,12 +45154,6 @@ }, /turf/open/floor/plasteel/vault, /area/crew_quarters/heads/chief) -"cjh" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cji" = ( /obj/structure/cable{ icon_state = "1-2" @@ -45361,18 +45288,6 @@ /obj/item/cigbutt/roach, /turf/open/floor/plating, /area/maintenance/aft) -"cjB" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/structure/table, -/obj/item/folder/white, -/obj/item/pen, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cjC" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -45459,7 +45374,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 6 + }, /area/engine/engineering) "cjP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -45480,7 +45397,7 @@ req_access = null; req_access_txt = "10;13" }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/engine/engineering) "cjS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -45647,11 +45564,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/aft) -"ckn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/science/xenobiology) "cko" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -46244,7 +46156,7 @@ /area/engine/engineering) "clS" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/rnd/protolathe/department/security, +/obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/plasteel/red/side, /area/security/main) "clT" = ( @@ -46730,16 +46642,11 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cnx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/chair/sofa/left{ + icon_state = "sofaend_left"; dir = 4 }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cny" = ( /obj/effect/landmark/start/station_engineer, @@ -46973,15 +46880,12 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cnZ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/airalarm{ - pixel_y = 23 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "coa" = ( @@ -46995,25 +46899,32 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cob" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" }, /turf/open/floor/plasteel, /area/engine/engineering) "coc" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" +/obj/structure/table, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/electronics/apc, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/engine, +/obj/item/stack/cable_coil, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cop" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ @@ -47182,38 +47093,27 @@ /turf/open/floor/plasteel, /area/engine/engineering) "coK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"coL" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"coM" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, +/obj/structure/chair/office/dark, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, +/area/engine/engineering) +"coL" = ( +/obj/structure/chair/office/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "coS" = ( /obj/structure/rack, @@ -47379,50 +47279,37 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cpt" = ( -/obj/structure/table, +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, +/area/engine/engineering) +"cpu" = ( +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_construction, /obj/item/clothing/gloves/color/yellow, -/obj/item/storage/toolbox/electrical{ - pixel_y = 5 +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table/glass, +/obj/item/device/flashlight, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cpx" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/engineering) -"cpu" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpv" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpx" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) "cpy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, +/obj/structure/sign/warning/radiation/rad_area, +/turf/closed/wall/r_wall, /area/engine/engineering) "cpA" = ( /obj/structure/chair/office/dark{ @@ -47437,19 +47324,17 @@ /turf/open/floor/plasteel, /area/bridge) "cpD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/closet/secure_closet/engineering_welding, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cpE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cpG" = ( /obj/structure/table/optable, @@ -47586,7 +47471,7 @@ c_tag = "Engineering Storage"; dir = 4 }, -/obj/machinery/rnd/protolathe/department/engineering, +/obj/machinery/rnd/production/protolathe/department/engineering, /turf/open/floor/plasteel, /area/engine/engineering) "cpW" = ( @@ -47606,133 +47491,72 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cpZ" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 5 - }, -/obj/item/device/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/device/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cqa" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cqb" = ( +/obj/structure/table, +/obj/machinery/cell_charger, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) -"cqc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"cqb" = ( +/obj/structure/chair/sofa/right{ + icon_state = "sofaend_right"; + dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cqd" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/green/visible{ +/obj/structure/closet/radiation, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqe" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 6 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cqf" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "cqg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Filter"; - on = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, /obj/machinery/camera{ - c_tag = "Engineering Supermatter Fore"; - dir = 1; + c_tag = "Engineering Center"; + dir = 2; network = list("ss13","engine"); pixel_x = 23 }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ +/obj/machinery/light{ dir = 1 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqi" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqj" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_y = -24; - req_access_txt = "10" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cql" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, +"cqh" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cqm" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +"cqi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/machinery/meter, -/turf/open/floor/plasteel, +/turf/open/floor/plating, +/area/engine/engineering) +"cqj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, /area/engine/engineering) "cqn" = ( /obj/structure/grille, @@ -47803,7 +47627,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /turf/open/floor/plasteel, /area/engine/engineering) "cqx" = ( @@ -47828,54 +47652,39 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cqA" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_access = null; - req_access_txt = "10;13" +"cqC" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cqD" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plating, /area/engine/engineering) -"cqB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cqE" = ( +/obj/structure/particle_accelerator/end_cap, +/turf/open/floor/plating, +/area/engine/engineering) +"cqF" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, /area/engine/engineering) -"cqC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqD" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cqE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/engine, -/area/engine/supermatter) -"cqF" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "cqG" = ( /obj/structure/rack, /obj/item/storage/box/rubbershot{ @@ -47963,70 +47772,49 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cqS" = ( -/obj/machinery/light/small{ - dir = 8 +/turf/open/floor/plasteel/yellow/side{ + dir = 10 }, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/plating, /area/engine/engineering) "cqT" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cqU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = 25; + req_access_txt = "11" }, -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "cqY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/engineering) "cqZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"cra" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Filter" - }, -/obj/machinery/airalarm/engine{ - dir = 4; - pixel_x = -23 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"crb" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - icon_state = "pump_map"; - name = "Gas to Chamber" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"crc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, +/obj/structure/particle_accelerator/fuel_chamber, +/turf/open/floor/plating, /area/engine/engineering) -"crd" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" +"cra" = ( +/obj/machinery/particle_accelerator/control_box, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/engine/engineering) +"crb" = ( +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plating, +/area/engine/engineering) +"crc" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Starboard Fore"; + dir = 2; + network = list("engine") }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "crh" = ( /obj/effect/turf_decal/stripes/line{ @@ -48089,40 +47877,38 @@ /turf/open/floor/plating, /area/engine/engineering) "crs" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/crowbar, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "crt" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/structure/particle_accelerator/power_box, +/turf/open/floor/plating, +/area/engine/engineering) "cru" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crv" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/item/screwdriver, +/turf/open/floor/plating, +/area/engine/engineering) "crw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, /area/engine/engineering) "cry" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -48210,43 +47996,34 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/aft) -"crH" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) "crI" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crK" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/turf/closed/wall/r_wall, +/obj/structure/chair/stool, +/turf/open/floor/plating, /area/engine/engineering) -"crL" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 +"crJ" = ( +/obj/machinery/light/small{ + dir = 8; + light_color = "#fff4bc" }, -/turf/open/floor/plasteel/dark, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"crK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, /area/engine/engineering) "crM" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 +/obj/machinery/light/small{ + dir = 4; + light_color = "#fff4bc" }, -/turf/open/floor/plasteel/dark, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, /area/engine/engineering) "crP" = ( /obj/machinery/light, @@ -48259,25 +48036,12 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"crT" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crU" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) "crV" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "crW" = ( /obj/machinery/light/small{ @@ -48297,38 +48061,29 @@ /obj/structure/transit_tube, /turf/open/floor/plating, /area/engine/engineering) -"crZ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "csa" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "csb" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "csc" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/space, /area/maintenance/aft) "csd" = ( -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cse" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "csg" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -48347,17 +48102,6 @@ }, /turf/open/space, /area/space/nearstation) -"csj" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"csk" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating/airless, -/area/space/nearstation) "csl" = ( /obj/structure/transit_tube/curved{ dir = 4 @@ -48414,26 +48158,22 @@ /turf/open/floor/plasteel/floorgrime, /area/maintenance/disposal/incinerator) "css" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) -"csu" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"csv" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "csx" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) "csy" = ( /obj/structure/table, /obj/item/weldingtool, @@ -48442,19 +48182,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"csA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "csD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -48466,24 +48193,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/aft) -"csH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"csI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "csM" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible, @@ -48501,27 +48210,9 @@ /area/ai_monitored/turret_protected/aisat_interior) "csP" = ( /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 1 }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"csR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "csT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -50258,7 +49949,7 @@ /area/shuttle/pod_1) "cxG" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; name = "Escape Pod Three"; req_access_txt = "0" }, @@ -50268,15 +49959,21 @@ /turf/open/floor/plating, /area/security/main) "cxJ" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 8; +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ name = "Labor Camp Shuttle Airlock"; req_access_txt = "2" }, +/obj/machinery/button/door{ + id = "prison release"; + name = "Labor Camp Shuttle Lockdown"; + pixel_y = -25; + req_access_txt = "2" + }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/security/processing) "cxN" = ( /obj/structure/cable{ @@ -50292,16 +49989,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) -"cxP" = ( -/obj/machinery/door/airlock/external{ - cyclelinkeddir = 8; - name = "Labor Camp Shuttle Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/processing) "cxR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, @@ -50551,18 +50238,14 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"czE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "czF" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/meter, -/turf/open/floor/plasteel/dark, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plating, /area/engine/engineering) "czG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -50644,11 +50327,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) -"czQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "czR" = ( /obj/structure/cable{ icon_state = "1-2" @@ -50796,97 +50474,40 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cAl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cAm" = ( +/obj/item/wirecutters, /obj/structure/cable/yellow{ - icon_state = "1-4" + icon_state = "2-8" }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) +"cAo" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cAm" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) -"cAo" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAp" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Cooling Loop to Gas"; - on = 1 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAr" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Gas to Mix"; - on = 0 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAu" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 - }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/engine/engineering) "cAy" = ( /obj/structure/closet/secure_closet/freezer/kitchen/maintenance, @@ -51001,9 +50622,17 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "cAP" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = 25; + req_access_txt = "11" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "cAQ" = ( /obj/structure/chair, /turf/open/floor/plating, @@ -51417,10 +51046,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cBS" = ( /obj/structure/cable{ @@ -51596,89 +51222,6 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) -"cCB" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCC" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCD" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine"; - on = 0 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCE" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cCF" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"cCG" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"cCH" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCI" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"cCP" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"cCQ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"cCS" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "cCT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -51698,77 +51241,33 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cDe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/closet/radiation, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) -"cDg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cDh" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/device/flashlight, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/pipe_dispenser, -/turf/open/floor/engine, -/area/engine/engineering) -"cDi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDj" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "cDk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cDl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -51785,90 +51284,39 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cDo" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/pen, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, +/obj/item/paper_bin{ + layer = 2.9 + }, +/obj/structure/table/glass, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cDt" = ( +/obj/structure/table, +/obj/item/twohanded/rcl/pre_loaded, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cDw" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plasteel, /area/engine/engineering) -"cDp" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDs" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDv" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cDx" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/chair/sofa{ + icon_state = "sofamiddle"; + dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Atmos to Loop"; - on = 0 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "cDy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDz" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, /turf/open/floor/plasteel, /area/engine/engineering) "cDB" = ( @@ -51878,102 +51326,23 @@ /obj/effect/landmark/start/station_engineer, /turf/open/floor/plasteel, /area/engine/engineering) -"cDC" = ( -/obj/item/wrench, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDD" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDE" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "cDF" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cDH" = ( -/obj/structure/rack, -/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 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDI" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "cDK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ +/turf/open/floor/plasteel/yellow/side{ dir = 4 }, -/turf/open/floor/plasteel, /area/engine/engineering) -"cDL" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cDN" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/closed/wall, -/area/engine/engineering) -"cDY" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ +"cDO" = ( +/obj/effect/turf_decal/stripes/line{ dir = 9 }, -/turf/open/space, +/turf/open/floor/plating/airless, /area/space/nearstation) "cDZ" = ( /obj/structure/cable{ @@ -51983,824 +51352,139 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cEa" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cEd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Port"; - dir = 4; - network = list("ss13","engine") - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) -"cEe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEf" = ( -/obj/machinery/ai_status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cEg" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cEh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Starboard"; - dir = 8; - network = list("ss13","engine") - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEk" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cEl" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "cEm" = ( /obj/machinery/vending/autodrobe, /turf/open/floor/wood, /area/maintenance/bar) -"cEr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cEs" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Gas to Cooling Loop"; - on = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEt" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEu" = ( -/obj/machinery/camera{ - c_tag = "Supermatter Chamber"; - dir = 2; - network = list("engine"); - pixel_x = 23 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEv" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEy" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEz" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEC" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Gas"; - on = 0 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cED" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEE" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"cEK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cEL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEM" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/engine/supermatter) -"cET" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEW" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/turf/open/floor/engine, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cFc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +"cEv" = ( /obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - icon_state = "pump_map"; - name = "Cooling Loop Bypass" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cFh" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cFj" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" + icon_state = "1-2" }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plating, -/area/engine/supermatter) -"cFk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix Bypass" - }, -/turf/open/floor/engine, /area/engine/engineering) -"cFm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cFn" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +"cEw" = ( +/obj/structure/particle_accelerator/particle_emitter/left, +/turf/open/floor/plating, +/area/engine/engineering) +"cEx" = ( +/obj/structure/particle_accelerator/particle_emitter/right, +/turf/open/floor/plating, +/area/engine/engineering) +"cEy" = ( +/obj/effect/turf_decal/stripes/line{ dir = 6 }, -/turf/open/space, -/area/space/nearstation) -"cFo" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cFu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"cFw" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cFy" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +"cEK" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/floor/engine, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access = null; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, /area/engine/engineering) -"cFz" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +"cFb" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Port Fore"; + dir = 2; + network = list("engine") }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cFA" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel/dark, +"cFn" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "cFI" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/engine, +/turf/open/floor/plating/airless, /area/engine/engineering) "cFK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/field/generator{ + anchored = 1; + state = 2 }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Aft"; - dir = 2; - network = list("ss13","engine"); - pixel_x = 23 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFT" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "cFU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGd" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGe" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGf" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8; - filter_type = "n2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGg" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGh" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine, -/area/engine/engineering) -"cGi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/engine, -/area/engine/engineering) -"cGj" = ( -/obj/structure/table, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGk" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGl" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGt" = ( -/obj/structure/closet/wardrobe/engineering_yellow, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, -/obj/machinery/meter, -/turf/open/floor/engine, -/area/engine/engineering) -"cGC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "Output Release"; - open = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGE" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGH" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGI" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGK" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cGR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGS" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGT" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGU" = ( -/obj/structure/reflector/double/anchored{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGV" = ( -/obj/structure/reflector/box/anchored{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGZ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1; - volume_rate = 200 - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cHa" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHb" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHc" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHd" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHe" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHg" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHj" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/power/emitter/anchored{ dir = 8; state = 2 }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHn" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-4" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/engine/engineering) -"cHo" = ( -/obj/structure/reflector/single/anchored{ - dir = 9 +"cGh" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHp" = ( -/obj/structure/reflector/single/anchored{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHr" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ icon_state = "1-8" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGr" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGE" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"cGU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cGV" = ( +/obj/machinery/the_singularitygen/tesla, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cGZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, /area/engine/engineering) "cHD" = ( /obj/structure/cable{ @@ -53139,8 +51823,13 @@ /turf/open/floor/plating, /area/security/brig) "cMm" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "cMC" = ( /obj/machinery/computer/security/telescreen{ @@ -53148,7 +51837,7 @@ dir = 8; layer = 4; name = "Engine Monitor"; - network = list("engine"); + network = list("singularity"); pixel_x = 30 }, /obj/effect/turf_decal/stripes/line{ @@ -53159,15 +51848,24 @@ }, /area/engine/engineering) "cMD" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cMH" = ( -/turf/open/floor/engine, -/area/engine/supermatter) -"cMN" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, -/area/engine/supermatter) +/area/engine/engineering) +"cMH" = ( +/obj/structure/particle_accelerator/particle_emitter/center, +/turf/open/floor/plating, +/area/engine/engineering) +"cMN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cMQ" = ( /obj/structure/cable{ icon_state = "0-2" @@ -53375,6 +52073,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cQZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cSz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -53400,41 +52104,23 @@ /turf/open/floor/plasteel/dark/telecomms/mainframe, /area/tcommsat/server) "cSG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/engine/engineering) "cSH" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/cable/yellow{ + icon_state = "0-8" }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cSI" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cSJ" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "cSK" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "cSL" = ( /obj/machinery/button/door{ id = "atmos"; @@ -53744,18 +52430,6 @@ }, /turf/open/floor/plating, /area/science/xenobiology) -"cTY" = ( -/obj/structure/sign/poster/official/safety_internals{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"cTZ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "cVb" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -53823,6 +52497,9 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/maintenance/fore/secondary) +"dBk" = ( +/turf/open/floor/plasteel/dark, +/area/security/processing) "dLQ" = ( /turf/open/floor/plasteel/red/corner{ dir = 1 @@ -53865,6 +52542,13 @@ }, /turf/open/floor/plating, /area/security/brig) +"ejb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) "ejX" = ( /obj/machinery/light{ dir = 1 @@ -53920,6 +52604,13 @@ icon_state = "wood-broken5" }, /area/maintenance/bar) +"eHD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) "eRz" = ( /obj/structure/lattice, /obj/structure/grille, @@ -53935,6 +52626,11 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"fdi" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space) "fgi" = ( /turf/closed/wall, /area/crew_quarters/cryopod) @@ -53978,9 +52674,16 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) -"fsQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, +"fFB" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/engine/engineering) "fIx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -54045,6 +52748,9 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/showroomfloor, /area/space) +"gre" = ( +/turf/open/floor/plating/airless, +/area/engine/engineering) "gtB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54148,18 +52854,61 @@ /obj/structure/closet/bombcloset/security, /turf/open/floor/plasteel/showroomfloor, /area/space) +"hmW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"hyz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) "hCi" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space) +"hDa" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"hMa" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access = null; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"hQd" = ( +/turf/open/space/basic, +/area/engine/engineering) "hSW" = ( /turf/open/floor/plasteel/red/side, /area/security/brig) -"ijc" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +"ieW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "ilg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood{ @@ -54176,6 +52925,14 @@ /obj/machinery/droneDispenser, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"iqO" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Port Aft"; + dir = 1; + network = list("engine") + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "itG" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -54256,11 +53013,11 @@ /turf/open/floor/plasteel, /area/science/circuit) "jlm" = ( -/obj/machinery/rnd/protolathe/department/cargo, +/obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/plasteel, /area/quartermaster/office) "jrE" = ( -/obj/machinery/rnd/protolathe/department/science, +/obj/machinery/rnd/production/protolathe/department/science, /obj/structure/sign/poster/official/random{ pixel_x = 32 }, @@ -54289,6 +53046,10 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/maintenance/bar) +"jyX" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/engineering) "jAD" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -54333,15 +53094,6 @@ dir = 9 }, /area/security/brig) -"jMY" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/stack/cable_coil, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "jSO" = ( /obj/machinery/light{ dir = 4 @@ -54360,6 +53112,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"jZh" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "khb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -54370,7 +53129,7 @@ /area/hallway/secondary/service) "khB" = ( /obj/machinery/door/airlock/external{ - cyclelinkeddir = 4; + cyclelinkeddir = 0; req_access_txt = "13" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -54440,6 +53199,12 @@ icon_state = "wood-broken7" }, /area/maintenance/bar) +"kNw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "kPd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable{ @@ -54455,13 +53220,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"kQq" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "kSb" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -54628,27 +53386,44 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"mBv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "Output to Waste" - }, -/turf/open/floor/engine, +"mzz" = ( +/obj/structure/grille, +/turf/open/floor/plating/airless, /area/engine/engineering) "mHd" = ( /obj/structure/falsewall, /turf/open/floor/plating, /area/maintenance/bar) +"mLm" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"mMg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) "mNi" = ( /obj/machinery/light_switch{ pixel_x = -20 }, /turf/open/floor/plasteel/white, /area/science/circuit) +"mQs" = ( +/obj/machinery/power/emitter/anchored{ + dir = 4; + state = 2 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "mRe" = ( /obj/machinery/light{ dir = 8 @@ -54662,6 +53437,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/fore/secondary) +"mWO" = ( +/turf/open/floor/plating/airless, +/area/space) "mXj" = ( /turf/open/floor/plasteel/showroomfloor, /area/space) @@ -54671,10 +53449,6 @@ "nnM" = ( /turf/closed/wall/r_wall, /area/security/armory) -"noK" = ( -/obj/structure/girder, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "nsq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54708,10 +53482,6 @@ }, /turf/open/floor/plasteel/floorgrime, /area/security/brig) -"nzh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "nAv" = ( /obj/structure/table, /obj/item/grenade/barrier{ @@ -54783,6 +53553,13 @@ /obj/item/device/electropack/shockcollar, /turf/open/floor/plating, /area/maintenance/bar) +"oaS" = ( +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "obC" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -54853,10 +53630,19 @@ dir = 10 }, /area/security/brig) -"oDF" = ( -/obj/machinery/light, +"oAQ" = ( +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) +"oHi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "oHU" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54880,6 +53666,21 @@ /obj/machinery/disposal/bin, /turf/open/floor/plasteel/white, /area/science/circuit) +"oUs" = ( +/obj/machinery/button/door{ + id = "Singularity"; + name = "Shutters Control"; + pixel_x = -25; + req_access_txt = "11" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "oZl" = ( /turf/open/floor/plasteel/purple/side{ tag = "icon-purple (NORTH)"; @@ -54923,6 +53724,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"pmD" = ( +/turf/open/space/basic, +/area/space/nearstation) "pzG" = ( /obj/structure/sign/poster/random{ pixel_x = -32 @@ -55089,6 +53893,14 @@ /obj/item/device/assembly/signaler, /turf/open/floor/plating, /area/maintenance/bar) +"riY" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Engine Containment Starboard Aft"; + dir = 1; + network = list("engine") + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "rmX" = ( /obj/structure/table, /obj/item/reagent_containers/food/drinks/beer, @@ -55131,11 +53943,22 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"rNn" = ( +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) "rWu" = ( /turf/open/floor/wood{ icon_state = "wood-broken6" }, /area/maintenance/bar) +"rZV" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "saK" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -55148,6 +53971,20 @@ /obj/item/gun/energy/laser/practice, /turf/open/floor/plasteel/white, /area/science/circuit) +"spp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Singularity"; + name = "radiation shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) "srd" = ( /turf/open/floor/plasteel/red/corner{ dir = 4 @@ -55170,6 +54007,12 @@ /obj/item/shovel/spade, /turf/open/floor/plasteel/hydrofloor, /area/hallway/secondary/service) +"sAz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "sGJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood{ @@ -55236,6 +54079,12 @@ /obj/structure/chair/office/light, /turf/open/floor/plasteel/white, /area/science/circuit) +"sWi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "sXy" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -55299,6 +54148,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/space/nearstation) +"tHc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "tMl" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/showroomfloor, @@ -55329,21 +54184,14 @@ /obj/item/storage/box/drinkingglasses, /turf/open/floor/wood, /area/maintenance/bar) -"udp" = ( -/obj/item/crowbar/large, -/obj/structure/rack, -/obj/item/device/flashlight, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"uhH" = ( -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 +"ugZ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/obj/structure/rack, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, /area/engine/engineering) "ujc" = ( /obj/machinery/vending/cigarette, @@ -55401,6 +54249,20 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"uuA" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -2 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "uvc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, @@ -55408,6 +54270,12 @@ "uvy" = ( /turf/closed/wall/r_wall, /area/space) +"uAt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/yellow/side, +/area/engine/engineering) "uMX" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -55487,6 +54355,12 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) +"vie" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "vxh" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -55510,13 +54384,20 @@ /turf/open/floor/plating, /area/maintenance/bar) "vCb" = ( -/obj/machinery/rnd/protolathe/department/service, +/obj/machinery/rnd/production/techfab/department/service, /turf/open/floor/plasteel/hydrofloor, /area/hallway/secondary/service) "vCt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/white, /area/science/circuit) +"vHQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/engine/engineering) "vNJ" = ( /obj/machinery/vending/clothing, /turf/open/floor/wood, @@ -55740,6 +54621,22 @@ /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"xJs" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"xMh" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xTa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -55768,6 +54665,14 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"yam" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/plasteel, +/area/engine/atmos) +"yck" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) "ycu" = ( /obj/structure/cable{ icon_state = "2-4" @@ -78747,10 +77652,10 @@ abc abc afu abc -aaa -aaa -aaa -aaa +abc +abc +abc +abc aaa aaa aaa @@ -79016,7 +77921,7 @@ aln aiU aaa aiU -anN +aln aiU aaa aaa @@ -79124,8 +78029,8 @@ aaa aaa aaa aaa -aaT -aaT +aaa +aaa aaa aaa aaa @@ -79269,11 +78174,11 @@ aaf aaf aaf aiU -alp +dBk aiU aaa aiU -alp +dBk aiU aaf aaf @@ -79369,21 +78274,21 @@ cjJ aaa aaa crn -aaf -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -aaf -ctv -aaT -aaT aaa aaa aaa @@ -79530,7 +78435,7 @@ cxJ aiU aiT aiU -cxP +cxJ aiU aiV aiT @@ -79626,21 +78531,21 @@ cjJ aaa aaa crn -aaf -aaT -ctv -ctv -ctv -ctv -ctv -ctv -ctv -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -aaf -ctv -ctv -aaT aaa aaa aaa @@ -79883,20 +78788,20 @@ cjJ aaf aaf cig -aaf -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaT -aaf -aaf -aaf -aaf +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80141,17 +79046,17 @@ ccw ccw ccw aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaf aaa aaa aaa -aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80398,19 +79303,19 @@ cqw cqO crp aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaf aaa aaa aaa -aaT -aaT -aaT +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80654,20 +79559,20 @@ cgR cgR cqN cro -cEl -cEE -cEl -cFm -csx -cFm -cFm -csx -csv +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa -aaT -ctv -aaT aaa aaa aaa @@ -80911,20 +79816,20 @@ ciN cji cDZ crr -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -81164,24 +80069,24 @@ ccw cfL coH cBO -cgR +cnv cDB cqP crq -crZ -crT -crZ -cFo -css -cFm -cFm -css -csv +pmD +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa -aaT -ctv -aaT aaa aaa aaa @@ -81425,21 +80330,21 @@ cgR cqx cqR crp -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT -aaa +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +hCi aaa aaa aaa @@ -81682,25 +80587,25 @@ cpX cqz cqQ ccw -crH -crT -crZ -cFo -css -cFm -cFm -css -csv +pmD aaa aaa -aaT -ctv -aaT +uvy +uvy +uvy aaa aaa aaa aaa aaa +uvy +uvy +uvy +hCi +hCi +aaa +aaa +aaa aaa aaa aaa @@ -81939,24 +80844,24 @@ clJ cig cig ccw -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT -aaa +pmD +pmD +uvy +uvy +uvy +uvy +uvy aaa aaa aaa +uvy +uvy +uvy +uvy +uvy +hCi +hCi +hCi aaa aaa aaa @@ -82190,30 +81095,30 @@ ccw ccw ccw cnZ -coH +oHi +cpt +cpt cpt -cpZ -cig cqS ccw -crH -crT -crZ -cFo -css -cFm -cFm -css -csv -aaa -aaa -aaT -ctv -aaT -aaa -aaa -aaf -aaa +ccw +ccw +ccw +ccw +ccw +ccw +ccw +ccw +cpy +ccw +ccw +ccw +ccw +ccw +ccw +ccw +uvy +hCi aaa aaa aaa @@ -82449,28 +81354,28 @@ cnt cob coL cDo +oaS cgR -cqA cqT -csg +ccw crJ -crU +ccw csb cFn css +cFn csx -csx -css -csb -aaf -aaf -aaT -aaT -aaT -gXs -aaf -aaf -aaf +ccw +ccw +ccw +cGE +cFn +jZh +mzz +mzz +ccw +uvy +yck aaa aaa aaa @@ -82707,27 +81612,27 @@ cgw coK cpu cMm -ccw -ccw -ccw +ckH +uAt +hMa crK cEK csa -csj -csa -csa +gre +mQs +gre cGr -aaa -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa +vHQ +hDa +vHQ +mLm +gre +mQs +gre +gre +ccw +uvy +hCi aaa aaa aaa @@ -82960,31 +81865,31 @@ ckG clJ cmF cgR -cgI +cnZ chF ciO -cqc -cqc -cqc -cEd -cEr -cEL +oaS +cgR +cqT +ccw +cig +ccw cFb -cFu +gre cFI -cGd -cGs -cGr +gre +gre +gre +gre +gre +gre +gre +cFI +gre +iqO ccw -ccw -ccw -ccw -ccw -ccw -aaa -eRz -aaT -eRz +uvy +fdi aaa aaa aaa @@ -83217,30 +82122,30 @@ cTa ceZ clQ cgR -cgx -coM -cpv -cqb -cqb -cqb -cqb +cnZ +oHi +cgR +cgR +cgR +cqT +fFB cEs -cqb -cqb +gre +rNn cAp -cqb +xJs cAo -cGt -cgx -jMY -csd -cHa -csd -uhH +xJs +cAo +xJs +cAo +xJs +cQZ +gre +gre +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -83475,29 +82380,29 @@ cTd ckF ckF cgK -cDg -cDp -cqe -cqB -cqB -cEe +oHi +cgR +cgR +cgR +cqT +fFB csP -cAl -cFc +gre +gre cAq -cFJ +mWO cSH -cGu -cGH -fsQ -fsQ -cGR -csd -csd +mWO +cSH +mWO +cSH +mWO +cSH +mWO +gre +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -83735,26 +82640,26 @@ cgJ chG cpx cqd -cDC +cjc cqU -cEf -cEt -cEM -csA -cEg +fFB +csP +gre +rNn +cAq cFK -cGe -cGv -cGI -cGS -cHb -cHg -cHn -oDF +aoV +aoV +cFK +gXs +aaa +aoV +aoV +cFK +mWO +gre ccw -aaf -aaT -ctv +uvy aaT aaf aaa @@ -83988,30 +82893,30 @@ cig cig cTf cgR -ccw +cnZ cDh cpy -cDv -cDD -cqU -cMD -cEu -cEz -cEz -cMD -cFL -cGf -kQq -cMm -ciZ -cHc -cAu -cAu -ciZ ccw +hyz +ccw +ccw +cqY +cqY +cqY +cAq +aoV +aoV +aoV +hCi +aaf aaa -aaT -ctv +aoV +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -84245,30 +83150,30 @@ ckI clJ cmL cBO +cnZ +cDh ccw -chV -cpx cqf cqD -cMD +oUs crs cEv -cEv -cFe -cMD -cFM -czE -kQq -ccw -cGT -csd -csd -csd -csd -ccw +ugZ +cqY +cAq +aoV +aoV +aaa +aaa aaf -aaT -ctv +aaa +aaa +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -84502,30 +83407,30 @@ ckK clJ cmL cgR -cgL +cnZ chX -cpx +spp cqh cqF cra crI cEw -cEw -cEw -cFw -cFN -csH -csR -cMm -cGU -csd -csd -cHo -csd -ccw +ejb +cqY +cAq aaa -aaT -ctv +aaa +aaa +cDO +cGU +sWi +aaa +hCi +cFK +mWO +gre +ccw +uvy aaT aaa aaa @@ -84759,30 +83664,30 @@ ckI clJ cmL cnv -cMm -chX -cpx +cnZ +eHD +ccw cqg cqE cqZ crt cMH cAm -cMH +mMg cMN -cFO -cSI -cSI -cMm +gXs +aaf +aaf +kNw cGV -csd -cGV -noK -csd +tHc +aaf +aaf +gXs +mWO +gre ccw -aaa -aaT -ctv +uvy aaT aaa aaa @@ -85016,30 +83921,30 @@ cfb ccw cmN cgR -cgL -chX -cpx +cnZ +eHD +hyz cqj cSG crb cru cEx -cEx -cEx -cAP -cFP -csI -cAt -cMm -csd -csd -csd -cHp -csd +oAQ +cqY +cAq +cFK +hCi +aaa +hmW +sAz +ieW +aaa +aaa +aaa +mWO +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -85273,30 +84178,30 @@ cfb clM cfz cgR +cnZ +eHD ccw -cii -cpx cqi cMD cAP -crv -cEy -cEy -cFh cMD -cFM -czE -kQq -ccw -cGT -csd -csd -csd -csd -ccw +cMD +cEy +cqY +cAq +aoV +aoV +aaa +aaa aaf -aaT -ctv +aaa +aaa +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -85530,30 +84435,30 @@ cfb cfa cje cgR +cnZ +eHD +cpy ccw -cDi -cDr -cDw -cDE -cEa -cMD -cEz -cEz -cEz -cMD -cFR -cSJ -kQq -cMm -ciZ -cHd -cHj -cHd -ciZ +hyz ccw +ccw +cqY +cqY +cqY +cAq +aoV +aoV aaa -aaT -ctv +aaa +aaf +hCi +aaa +aoV +aoV +mWO +gre +ccw +uvy aaT aaa aaa @@ -85787,30 +84692,30 @@ ckL cmF cje cgR -cMm -chX +cnZ +cjS cpD cDw cDF cEa -cEg -cEA -cET -cFj -cEf -cFS -cGg -mBv -cGI -cGS -cHe -cHe -cHr -oDF +fFB +csP +gre +rNn +cAq +cFK +aoV +aaa +aaa +gXs +cFK +aoV +aoV +cFK +mWO +gre ccw -aaf -aaT -ctv +uvy aaT aaf aaa @@ -86044,30 +84949,30 @@ ceq clQ cje cgR -cMm -cDj -cDs -cql -cDG -cDG -cEh -cEB -cEU -cFk -cAs -cFT +cnZ +cjS +cgR +cgR +cgR +cqT +fFB +csP +gre +gre +cAq +mWO cSK -cGx -cGK -nzh -nzh -cGY -csd -csd +mWO +cSK +mWO +cSK +mWO +cSK +mWO +gre +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -86301,30 +85206,30 @@ ckO ckH cja cny -ccw -cip +cnZ +cjS cnx cDx cqb -cqb -cqb -cEC -cqb -cqb +cqT +fFB +cEs +gre +rNn cAr -cqb +xJs cGh -cGC -cey -ijc -csd -cEk -csd -udp +xJs +cGh +xJs +cGh +xJs +vie +gre +gre +gre ccw -aaf -aaT -ctv +uvy aaT aaa aaa @@ -86558,30 +85463,30 @@ cfb clR cgR cgR -cMm -cir +cnZ +cjS cDt cDy cqC +cqT +ccw +ccw +ccw crc -cEi -cED -crc -crc -cFy +gre cBR -cGi -cGD -cGL +gre +gre +gre +gre +gre +gre +gre +cBR +gre +riY ccw -ccw -ccw -ccw -ccw -ccw -aaa -aaT -aaT +uvy aaT aaa aaa @@ -86819,27 +85724,27 @@ cDe cDk coc cqa -cig -ccw -ccw +uuA +uAt +hMa czF +cEK csd -csd -cFz +gre cFU -cGj +gre cGE -cGM +vHQ cGZ -aag -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa +vHQ +csx +gre +cFU +gre +gre +ccw +uvy +hCi aaa aaa aaa @@ -87075,28 +85980,28 @@ cgU cgU cis cjN -cDz -cDH -cMm -csd -crM -crV -crV -cFA -csd -cGk +cgR +cgR +cqT ccw -aag -aag -aag -aaf -aaf -aaf -aaf -gXs -aaf -aaf -aaf +crM +ccw +crV +cFn +xMh +cFn +mLm +ccw +ccw +ccw +cGr +cFn +rZV +mzz +mzz +ccw +uvy +yck aaf aaa aaa @@ -87328,32 +86233,32 @@ ccw cet cfd cfB -cfI -cgQ +cfB +cfB cjS cjN -cqm cgR -crd -cEk -crL -cEW -cse -cse -csu -cGl +cgR +cqT ccw -aaa -aaa -aaf -aaa -aaf -ctv -aaT -aaa -aaa -aaf -aaa +ccw +ccw +ccw +ccw +ccw +ccw +ccw +ccw +cpy +ccw +ccw +ccw +ccw +ccw +ccw +jyX +uvy +hCi aaa aaa aaa @@ -87589,28 +86494,28 @@ ccw ccw cDl cjN -cjh -cDI +cgR +cgR +cgR +cqS ccw ccw ccw ccw ccw -cMm -cMm -cMm ccw -aaf -aaf -aaf -aaf -aaf -ctv -aaT -aaa -aaa -aaf +hQd +pmD +pmD +pmD +uvy +uvy +uvy +uvy +uvy aaa +yck +hCi aaa aaa aaa @@ -87847,7 +86752,7 @@ ccw cDm cjP ckF -cDJ +ckF ckF cpE cjR @@ -87860,13 +86765,13 @@ aaa aaa aaa aaa -ctv -ctv -ctv -aaT -aaa -aaa -aaa +pmD +uvy +uvy +uvy +hCi +hCi +hCi aaa aaa aaa @@ -88089,7 +86994,7 @@ caE cbA ccy bOd -bOd +yam bQu cfO cgW @@ -88111,17 +87016,17 @@ ccw crX cfK aag -aaa -aaa -aaa -aaa -aaa -aaa -aaT -aaT -aaT -aaT -aaa +hCi +hCi +hCi +hCi +hCi +hCi +gXs +gXs +gXs +gXs +hCi aaa aaa aae @@ -88334,7 +87239,7 @@ bIF bOZ bQp bRA -bOd +yam bTO bUL bVU @@ -88361,7 +87266,7 @@ ccw cpa cjc cqo -cDL +ccw cjk cjm ccw @@ -88377,7 +87282,7 @@ aaa aaa aaa aaa -eRz +gXs aaa aaa aaa @@ -88618,7 +87523,7 @@ ccw ccw cpI ccw -cDL +ccw cjl cjQ cjV @@ -88875,7 +87780,7 @@ cig cpb ciZ cqp -cDN +cig cjT cgR crP @@ -89132,7 +88037,7 @@ cig cig czg cig -cDN +cig crh crA crR @@ -89389,7 +88294,7 @@ cig cpc cpJ cpc -cDN +cig cqY cqY cqY @@ -89622,7 +88527,7 @@ bRF bSM bTS bUQ -agd +bWa bUO bVZ bVZ @@ -89646,7 +88551,7 @@ cig cpd czM cpd -cDN +cig aaa aaa aaa @@ -89879,8 +88784,8 @@ bRE bSJ bPe bOd -cCB -cCC +bOd +bOd bXT bXT bXT @@ -89903,7 +88808,7 @@ ccw cpd czL cpd -cDL +ccw aaf aaa aaa @@ -90137,7 +89042,7 @@ bSM bTU bUS bUS -cCD +bUS bXU bUS bUS @@ -90160,7 +89065,7 @@ aaa cpd cpM cpd -cCQ +aaf aaf aaa aaa @@ -90394,7 +89299,7 @@ bSN bTT bUR bWb -cCE +bUR bTT bUR bZJ @@ -90417,7 +89322,7 @@ aaa aaa czN aaa -cCQ +aaf aaf aaa aaa @@ -90674,7 +89579,7 @@ aaa aaa aaa aaa -cCQ +aaf aaf aaa aaa @@ -90908,7 +89813,7 @@ bSP bPh bQy bRI -cCF +bQy bPh bQy bRI @@ -90931,7 +89836,7 @@ aaa aaa aaa aaa -cCQ +aaf aaf aaa aaa @@ -91165,16 +90070,16 @@ aaf bRK aaf bVv -cCG -cCH -cCI -cCJ -cCI -cCH -cCI -cCJ -cCI -cCP +aaf +bRK +aaf +bVv +aaf +bRK +aaf +bVv +aaf +aaf bLK chg bLK @@ -91188,7 +90093,7 @@ aoV aoV aoV aoV -cCQ +aaf aoV aaa aaa @@ -91431,7 +90336,7 @@ bPj bQA bPj bOh -cCQ +aaf bLK cyG bLK @@ -91445,7 +90350,7 @@ aoV aoV aoV aoV -cCQ +aaf aoV aaa aaa @@ -91688,21 +90593,21 @@ cbI ccC cdD bOh -cCG -cCS -cCS -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cDY +aaf +aah +aah +aaf +aaf +aaf +aaf +aaf +aah +aah +aah +aah +aah +aah +aaf aaf aaf aaf @@ -98111,8 +97016,8 @@ bRT bEm bEm bDb -cfr -cho +aco +agd bDb aaa cNW @@ -98353,8 +97258,8 @@ bJJ bKY bMi bNo -bIP -bPA +aab +aad bJN bRU bEm @@ -98368,9 +97273,9 @@ bRU bEm bEm bDb -cgi -chq -ccQ +acq +age +ajC aaa cOT cQB @@ -98625,9 +97530,9 @@ bRU bEm cBz bDb -cgi -chq -ccQ +acq +age +ajC aaa cOT cQB @@ -98867,8 +97772,8 @@ bJL bLa bMi bNo -bPy -bPA +aac +aad bJN bRW bTb @@ -98882,8 +97787,8 @@ bZV caV cbS bDb -cgl -chs +acw +ago bDb aaa cNW @@ -99139,8 +98044,8 @@ bRV bTa cbR bDb -cgk -chr +adr +agv bDb aaa cNW @@ -99395,10 +98300,10 @@ bZa bMi bMi bRZ -cTY -cTZ -chu -ccQ +abI +aeF +ahw +ajC aaf cOT cQB @@ -99652,12 +98557,12 @@ bTc bRX bTc cbT -ccP -ccP -cht -ckn -csk -czQ +abJ +abJ +ahR +ajG +ajX +ajY czU czZ cOT @@ -99909,10 +98814,10 @@ bZb bRZ bMi bMi -cfy -cgn -cjB -ccQ +abP +afQ +aiN +ajC aaf cOT cgm @@ -100155,15 +99060,15 @@ bIv bIR bPE bLe -bRY +abm bTd bUg bVi -bWm +abn bTd bUg bVi -bZW +abH bTd bUg bDb @@ -101181,7 +100086,7 @@ bJN bMp bNp bOx -bPI +aaR bJN bEm bEm diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 87d5aaf2c0..5d97acd0c0 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -112,6 +112,30 @@ /obj/structure/cable, /turf/open/space, /area/solar/starboard/fore) +"aap" = ( +/turf/open/floor/plasteel/vault/killroom, +/area/science/xenobiology) +"aaq" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Killroom Chamber"; + dir = 2; + name = "xenobiology camera"; + network = list("ss13","xeno","rd") + }, +/turf/open/floor/plasteel/vault/killroom, +/area/science/xenobiology) +"aar" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 2; + external_pressure_bound = 140; + name = "killroom vent"; + pressure_checks = 0 + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "aas" = ( /obj/docking_port/stationary/random{ id = "pod_lavaland1"; @@ -131,6 +155,35 @@ /obj/effect/landmark/xeno_spawn, /turf/open/space, /area/solar/starboard/fore) +"aav" = ( +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) +"aaw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 2; + external_pressure_bound = 120; + name = "server vent" + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) +"aax" = ( +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/vault/killroom, +/area/science/xenobiology) +"aay" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/vault/killroom, +/area/science/xenobiology) +"aaz" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/vault/killroom, +/area/science/xenobiology) "aaA" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/pod_1) @@ -149,6 +202,52 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/fore) +"aaF" = ( +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plating, +/area/science/xenobiology) +"aaG" = ( +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Xenobiology Kill Room"; + req_access_txt = "47" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"aaH" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1; + min_temperature = 80; + on = 1; + target_temperature = 80 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"aaI" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, +/obj/machinery/status_display{ + pixel_x = 32 + }, +/turf/open/floor/circuit/green, +/area/science/xenobiology) "aaO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -1312,7 +1411,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "afV" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -9182,10 +9281,6 @@ }, /turf/open/floor/circuit/green, /area/engine/supermatter) -"ayK" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) "ayL" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 @@ -9764,7 +9859,7 @@ }, /obj/machinery/door/airlock/highsecurity{ name = "Emergency Access"; - req_access_txt = "24;10" + req_one_access_txt = "24;10" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -26368,7 +26463,7 @@ icon_state = "1-8" }, /obj/effect/turf_decal/stripes/box, -/obj/machinery/rnd/protolathe/department/security, +/obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/plasteel/red/side{ dir = 1 }, @@ -35708,7 +35803,7 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -45272,7 +45367,7 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, @@ -46324,7 +46419,7 @@ /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -47109,7 +47204,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bXz" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -49919,6 +50014,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, +/obj/item/storage/secure/safe{ + pixel_x = 32 + }, /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/captain/private) "ccT" = ( @@ -50251,6 +50349,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/power/emitter{ + anchored = 1; + state = 2 + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cdE" = ( @@ -51319,6 +51421,7 @@ dir = 8; network = list("singularity") }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/engine/engineering) "cfC" = ( @@ -51608,6 +51711,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, +/obj/item/storage/secure/safe{ + pixel_x = 32 + }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "cgi" = ( @@ -52290,7 +52396,6 @@ /turf/open/space, /area/space/nearstation) "chu" = ( -/obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) @@ -53055,10 +53160,10 @@ "cjb" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, /turf/open/space, /area/space/nearstation) @@ -53074,28 +53179,11 @@ /turf/open/floor/plating, /area/engine/engineering) "cje" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plating, /area/engine/engineering) -"cjf" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "cjg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -53427,7 +53515,7 @@ /turf/open/floor/plasteel, /area/security/courtroom) "cjY" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/neutral/side{ dir = 8 }, @@ -53660,13 +53748,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"ckx" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "cky" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -53682,6 +53763,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/space/nearstation) "ckA" = ( @@ -53690,35 +53772,11 @@ id = "engpa"; name = "Engineering Chamber Shutters" }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plating, /area/engine/engineering) -"ckB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"ckC" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/neutral, -/area/engine/engineering) "ckD" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral, @@ -54289,20 +54347,9 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "clS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"clT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/field/generator{ - anchored = 1 + anchored = 1; + state = 2 }, /turf/open/floor/plating/airless, /area/space/nearstation) @@ -54315,19 +54362,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"clV" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "clW" = ( /obj/structure/rack, /obj/item/crowbar, @@ -54337,9 +54371,6 @@ /turf/open/floor/plasteel, /area/engine/engineering) "clX" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/engineering) @@ -55205,9 +55236,6 @@ id = "engpa"; name = "Engineering Chamber Shutters" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line{ dir = 2 }, @@ -55893,9 +55921,6 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -56455,6 +56480,10 @@ /turf/open/floor/plating, /area/engine/engineering) "cqr" = ( +/obj/structure/particle_accelerator/particle_emitter/left{ + icon_state = "emitter_left"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "cqs" = ( @@ -56463,6 +56492,7 @@ /area/engine/engineering) "cqt" = ( /obj/structure/cable, +/obj/machinery/particle_accelerator/control_box, /turf/open/floor/plating, /area/engine/engineering) "cqu" = ( @@ -57024,7 +57054,7 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "crJ" = ( -/obj/item/wrench, +/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "crK" = ( @@ -57065,7 +57095,10 @@ /turf/open/floor/plating, /area/engine/engineering) "crO" = ( -/obj/item/weldingtool/largetank, +/obj/structure/particle_accelerator/fuel_chamber{ + icon_state = "fuel_chamber"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "crP" = ( @@ -57843,7 +57876,10 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "ctp" = ( -/obj/item/wrench, +/obj/structure/particle_accelerator/particle_emitter/right{ + icon_state = "emitter_right"; + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "ctq" = ( @@ -58285,7 +58321,7 @@ /obj/structure/cable/white{ icon_state = "1-8" }, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -58656,9 +58692,6 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) @@ -58713,6 +58746,7 @@ dir = 8 }, /obj/effect/turf_decal/bot, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, /area/engine/engineering) "cva" = ( @@ -59870,24 +59904,6 @@ dir = 4 }, /area/crew_quarters/fitness/recreation) -"cxA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"cxB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/field/generator{ - anchored = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "cxD" = ( /obj/structure/rack, /obj/item/crowbar, @@ -60707,13 +60723,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"czp" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/space/nearstation) "czq" = ( /obj/structure/cable{ icon_state = "0-2" @@ -60727,33 +60736,9 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/corner, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/space/nearstation) -"czs" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"czt" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/neutral, -/area/engine/engineering) "czu" = ( /obj/structure/cable/white{ icon_state = "0-2" @@ -61006,7 +60991,7 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "czU" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/neutral, /area/ai_monitored/storage/eva) "czV" = ( @@ -61355,10 +61340,10 @@ "cAI" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-4" }, /turf/open/space, /area/space/nearstation) @@ -61370,18 +61355,14 @@ /turf/open/space, /area/space/nearstation) "cAK" = ( -/obj/machinery/power/rad_collector/anchored, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plating, /area/engine/engineering) "cAL" = ( -/obj/machinery/rnd/protolathe/department/engineering, +/obj/machinery/rnd/production/protolathe/department/engineering, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -62960,6 +62941,7 @@ dir = 8; network = list("singularity") }, +/obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/engine/engineering) "cDW" = ( @@ -63843,6 +63825,12 @@ icon_state = "0-2" }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/power/emitter{ + anchored = 1; + dir = 1; + icon_state = "emitter"; + state = 2 + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cFI" = ( @@ -67649,21 +67637,6 @@ dir = 5 }, /area/science/xenobiology) -"cNh" = ( -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) -"cNi" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Xenobiology - Killroom Chamber"; - dir = 2; - name = "xenobiology camera"; - network = list("ss13","xeno","rd") - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) "cNj" = ( /obj/structure/closet/crate{ icon_state = "crateopen" @@ -68378,26 +68351,6 @@ "cON" = ( /turf/open/floor/circuit/green, /area/science/xenobiology) -"cOO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 2; - external_pressure_bound = 140; - name = "killroom vent"; - pressure_checks = 0 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cOP" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"cOQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 2; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cOR" = ( /turf/closed/wall/r_wall, /area/science/research) @@ -69153,24 +69106,6 @@ dir = 1 }, /area/science/xenobiology) -"cQw" = ( -/obj/machinery/atmospherics/pipe/manifold/general/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) -"cQx" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) -"cQy" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/vault/killroom, -/area/science/xenobiology) "cQz" = ( /obj/structure/closet/wardrobe/science_white, /obj/machinery/light/small{ @@ -69388,8 +69323,8 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/rnd/protolathe/department/medical, /obj/effect/turf_decal/stripes/box, +/obj/machinery/rnd/production/techfab/department/medical, /turf/open/floor/plasteel/neutral/side{ dir = 4 }, @@ -69869,33 +69804,6 @@ }, /turf/open/floor/plating, /area/science/xenobiology) -"cSf" = ( -/obj/structure/cable/white{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/general/hidden, -/turf/open/floor/plating, -/area/science/xenobiology) -"cSg" = ( -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/obj/machinery/door/airlock/research/glass{ - name = "Xenobiology Kill Room"; - req_access_txt = "47" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cSh" = ( /obj/structure/cable/white{ icon_state = "0-8" @@ -70674,16 +70582,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/xenobiology) -"cTR" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - min_temperature = 80; - on = 1; - target_temperature = 80 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/science/xenobiology) "cTS" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -72376,15 +72274,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/science/xenobiology) -"cXm" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, -/obj/machinery/status_display{ - pixel_x = 32 - }, -/turf/open/floor/circuit/green, -/area/science/xenobiology) "cXn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ @@ -72567,13 +72456,6 @@ dir = 8 }, /area/medical/medbay/central) -"cXG" = ( -/obj/structure/table, -/obj/item/folder/white, -/turf/open/floor/plasteel/whiteblue/corner{ - dir = 8 - }, -/area/medical/medbay/central) "cXH" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -73378,12 +73260,11 @@ id = "chemisttop"; name = "Chemistry Lobby Shutters" }, -/obj/machinery/door/window/southleft{ +/obj/item/folder/yellow, +/obj/machinery/door/window/northleft{ name = "Chemistry Desk"; req_access_txt = "5; 33" }, -/obj/item/folder/yellow, -/obj/machinery/door/window/northleft, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/medical/medbay/central) @@ -75018,7 +74899,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/machinery/rnd/protolathe/department/science, +/obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/plasteel, /area/science/lab) "dcL" = ( @@ -75672,7 +75553,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/machinery/rnd/circuit_imprinter/department/science, +/obj/machinery/rnd/production/circuit_imprinter/department/science, /turf/open/floor/plasteel, /area/science/lab) "dek" = ( @@ -76245,7 +76126,6 @@ pixel_y = 7; req_access_txt = "33" }, -/obj/machinery/smoke_machine, /turf/open/floor/plasteel/whiteyellow/corner{ dir = 8 }, @@ -77410,7 +77290,7 @@ /turf/open/floor/plasteel/neutral, /area/science/research) "dhZ" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -77648,7 +77528,7 @@ /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/whiteblue, /area/medical/medbay/central) @@ -77980,7 +77860,7 @@ /area/science/circuit) "djq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/rnd/protolathe/department/science, +/obj/machinery/rnd/production/protolathe/department/science, /obj/machinery/light{ dir = 1 }, @@ -88924,7 +88804,7 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "dGe" = ( -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /obj/item/reagent_containers/glass/beaker/sulphuric, /obj/machinery/airalarm{ dir = 8; @@ -89981,7 +89861,7 @@ icon_state = "1-2" }, /obj/effect/landmark/blobstart, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -91671,7 +91551,7 @@ /turf/open/floor/plating/airless, /area/science/test_area) "dLF" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/science/test_area) @@ -94041,7 +93921,7 @@ /turf/open/floor/plasteel/neutral, /area/hallway/primary/aft) "dQR" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/neutral, /area/hallway/primary/aft) "dQU" = ( @@ -100775,7 +100655,7 @@ /turf/open/floor/plasteel/caution, /area/engine/engineering) "ehw" = ( -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -100796,8 +100676,8 @@ name = "Station Intercom"; pixel_x = -26 }, -/obj/machinery/rnd/protolathe/department/service, /obj/effect/turf_decal/stripes/box, +/obj/machinery/rnd/production/techfab/department/service, /turf/open/floor/plasteel/neutral/corner{ dir = 1 }, @@ -100827,7 +100707,7 @@ /area/hallway/secondary/service) "ehJ" = ( /obj/effect/turf_decal/stripes/box, -/obj/machinery/rnd/protolathe/department/cargo, +/obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/plasteel/brown, /area/quartermaster/office) "ehK" = ( @@ -100913,6 +100793,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/circuit) +"gsR" = ( +/turf/open/space, +/area/space) "gKr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -100972,6 +100855,25 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/aft) +"htt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/extinguisher, +/obj/item/extinguisher{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "hGT" = ( /obj/machinery/door/firedoor, /obj/structure/cable/white{ @@ -101003,6 +100905,9 @@ dir = 9 }, /area/science/circuit) +"hRG" = ( +/turf/open/space/basic, +/area/space/nearstation) "iQh" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -101050,7 +100955,7 @@ }, /obj/machinery/door/airlock/highsecurity{ name = "Emergency Access"; - req_access_txt = "24;10" + req_one_access_txt = "24;10" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -101061,6 +100966,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral, /area/medical/morgue) +"jKb" = ( +/turf/open/space, +/area/space/nearstation) "kwx" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/whitepurple/corner, @@ -101086,6 +100994,9 @@ dir = 5 }, /area/crew_quarters/locker) +"lkn" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) "loI" = ( /obj/machinery/autolathe, /obj/machinery/door/window/southleft{ @@ -101101,6 +101012,10 @@ dir = 4 }, /area/science/lab) +"lxv" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "lEl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -101145,6 +101060,13 @@ dir = 1 }, /area/science/circuit) +"mqk" = ( +/obj/structure/particle_accelerator/end_cap{ + icon_state = "end_cap"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "mvm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -101156,6 +101078,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit/green, /area/science/research/abandoned) +"nJG" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "oZC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -101169,6 +101095,13 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) +"pfd" = ( +/obj/structure/particle_accelerator/particle_emitter/center{ + icon_state = "emitter_center"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "pmQ" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster{ @@ -101232,6 +101165,12 @@ "saw" = ( /turf/closed/wall, /area/science/circuit) +"tdp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "tmi" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -101270,6 +101209,9 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel/whitepurple/side, /area/science/misc_lab) +"uDN" = ( +/turf/open/floor/plating/airless, +/area/space) "uYS" = ( /obj/machinery/door/airlock/atmos/glass{ heat_proof = 1; @@ -101327,6 +101269,13 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"xwB" = ( +/obj/structure/particle_accelerator/power_box{ + icon_state = "power_box"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) "xwK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -101352,6 +101301,13 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) +"xJl" = ( +/obj/structure/table, +/obj/item/folder/white, +/turf/open/floor/plasteel/whiteblue/corner{ + dir = 8 + }, +/area/medical/medbay/central) "xMn" = ( /obj/structure/disposalpipe/trunk, /obj/machinery/disposal/bin, @@ -121812,14 +121768,14 @@ aaa cja ckw clS -aad -aad -clR -aaa -abj -aad -aad -cxA +jKb +jKb +clS +nJG +hRG +jKb +jKb +clS ctn cja aaa @@ -122067,17 +122023,17 @@ cdC cfA aad cjb -ckx +cky +jKb +gsR +gsR +lxv aad -aaa -aaa -abj -aad -abj -aaa -aaa -aad -czp +hRG +gsR +gsR +jKb +czq cAI aad cDT @@ -122325,15 +122281,15 @@ cfA aaa cja ckw +jKb +gsR +hRG +hRG aad -aaa -abj -abj -abj -abj -abj -aaa -aad +hRG +hRG +gsR +jKb ctn cja aaa @@ -122580,19 +122536,19 @@ car cbP cfA abj -cja -ckw -ckw -abj -abj +cjb +cky +hRG +hRG +hRG cqo clR ctm -abj -abj -abj -ctn -cja +hRG +lxv +clS +czq +cAI abj cDT cFJ @@ -122837,19 +122793,19 @@ car cbP cdC aad -cjb -cky -aaa +cja +ckw +nJG +aad aad -abj ckw crJ -ctn -abj +tdp aad -aaa -czq -cAI +aad +nJG +ctn +cja aad cdC cFJ @@ -123094,19 +123050,19 @@ car cbP cfA abj -cja -ckw -abj -abj -abj +cjb +cky +clS +lxv +hRG cqp crK cto -abj -abj -ctn -ctn -cja +hRG +hRG +hRG +czq +cAI abj cDT cFJ @@ -123353,15 +123309,15 @@ cfA aaa cja ckw +jKb +gsR +hRG +hRG aad -aaa -abj -abj -abj -abj -abj -aaa -aad +hRG +hRG +gsR +jKb ctn cja aaa @@ -123609,17 +123565,17 @@ cdC cfA aad cjb -ckx +cky +jKb +gsR +aaa +hRG aad +lxv aaa -aaa -abj -aad -abj -aaa -aaa -aad -czp +gsR +jKb +czq cAI aad cDU @@ -123867,15 +123823,15 @@ cfA aaa cja ckw -clT -aad -aad -abj -aaa -crK -aad -aad -cxB +clS +jKb +hRG +hRG +nJG +clS +jKb +jKb +clS ctn cja aaa @@ -124378,8 +124334,8 @@ car cbT cdG cfB -aaa -aad +uDN +lkn aaa aad cjd @@ -124391,8 +124347,8 @@ cjd cjd aad aaa -aad -aaa +lkn +uDN cDV cFL cHg @@ -124899,7 +124855,7 @@ cje cjd cpa cqr -cqr +pfd ctp cuQ cjd @@ -125150,19 +125106,19 @@ cbV cdJ car chv -cjf +chv ckA -clV +chv cnC cpa cqs -cqr +xwB ctq cuR cnC -cjf -czs -clV +chv +chv +chv chv car cFO @@ -125408,7 +125364,7 @@ cdK cfD chw cjg -ckB +chw clW cnD cpb @@ -125418,7 +125374,7 @@ ctr cuS cnD cxD -ckB +chw chw chw cDW @@ -125665,17 +125621,17 @@ cdL cfE chx cjh -ckC +cjn clX cnE cpc cqu -cqr +mqk cts cuT cnE clX -czt +cjn cAL cCs cDX @@ -127152,7 +127108,7 @@ atS avb awh axz -ayK +axz axz aAW axz @@ -128523,7 +128479,7 @@ das dcd cMY deX -dgo +htt dhR lKu tmi @@ -132623,9 +132579,9 @@ cHA cjp cKl cLI -cNh -cNh -cNh +aap +aap +aap cNc cTQ cVI @@ -132880,11 +132836,11 @@ cHB cjp cKj cLI -cNh -cOO -cQw -cSf -cTR +aap +aar +aax +aaF +aaH cVP cXi cYX @@ -133137,10 +133093,10 @@ cHD caE cKm cLI -cNi -cOP -cQx -cSg +aaq +aav +aay +aaG cTS cVQ cXj @@ -133394,9 +133350,9 @@ cHB cjp cKk cLI -cNh -cOQ -cQy +aap +aaw +aaz cSh cTT cVR @@ -133651,9 +133607,9 @@ cHA ceb cKk cLI -cNh -cNh -cNh +aap +aap +aap cNc cTU cVS @@ -133914,9 +133870,9 @@ cMY cMY cTV cVT -cXm +aaI cZb -cXm +aaI dcu ddV cMY @@ -141367,7 +141323,7 @@ cQT cSE cUt cWj -cXG +xJl cZt dbc dcO diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index a2e2d840b5..972ad7dd6c 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2,10 +2,48 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aab" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/computer/camera_advanced/xenobio, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "aac" = ( /obj/effect/landmark/carpspawn, /turf/open/space, /area/space) +"aad" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/machinery/computer/camera_advanced/xenobio, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"aae" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "aaf" = ( /obj/structure/lattice, /turf/open/space, @@ -298,9 +336,46 @@ }, /turf/open/floor/plasteel/floorgrime, /area/security/prison) +"aaU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "aaV" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/pod_2) +"aaW" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/extinguisher{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/extinguisher, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"aaX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/science/xenobiology) "aaY" = ( /obj/structure/cable{ icon_state = "1-2" @@ -335,6 +410,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/security/prison) +"abd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/science/xenobiology) "abe" = ( /turf/closed/wall, /area/security/prison) @@ -754,6 +838,24 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/prison) +"acd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/door/airlock/research{ + glass = 1; + name = "Slime Euthanization Chamber"; + opacity = 0; + req_access_txt = "55" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "ace" = ( /obj/machinery/vending/sustenance{ desc = "A vending machine normally reserved for work camps."; @@ -2007,6 +2109,17 @@ }, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) +"aeD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/chair, +/obj/item/cigbutt, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "aeE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -2733,6 +2846,15 @@ dir = 1 }, /area/security/prison) +"afQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "afR" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -3700,6 +3822,12 @@ icon_state = "platingdmg1" }, /area/maintenance/fore) +"ahT" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "ahU" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/table, @@ -4296,6 +4424,18 @@ /obj/item/restraints/handcuffs/cable/pink, /turf/open/floor/plating, /area/maintenance/port/fore) +"ajk" = ( +/obj/machinery/door/airlock/research{ + glass = 1; + name = "Slime Euthanization Chamber"; + opacity = 0; + req_access_txt = "55" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "ajl" = ( /obj/item/soap/deluxe, /obj/item/storage/secure/safe{ @@ -4384,6 +4524,15 @@ dir = 4 }, /area/security/warden) +"aju" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1; + name = "euthanization chamber freezer"; + on = 1; + target_temperature = 80 + }, +/turf/open/floor/plating, +/area/science/xenobiology) "ajv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -5316,8 +5465,9 @@ /area/maintenance/starboard) "alr" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plating, -/area/maintenance/starboard) +/area/science/xenobiology) "als" = ( /obj/machinery/light{ dir = 8 @@ -6124,6 +6274,17 @@ icon_state = "platingdmg2" }, /area/maintenance/port) +"amV" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + glass = 1; + name = "Slime Euthanization Chamber"; + opacity = 0; + req_access_txt = "55" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "amW" = ( /obj/structure/table/reinforced, /obj/item/folder, @@ -6369,6 +6530,9 @@ /obj/item/paper, /turf/open/floor/plasteel, /area/security/main) +"anz" = ( +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "anA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, @@ -6805,6 +6969,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/security/warden) +"aov" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1; + external_pressure_bound = 140; + name = "server vent"; + pressure_checks = 0 + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "aow" = ( /obj/machinery/door/firedoor, /obj/structure/cable/yellow{ @@ -7489,6 +7662,10 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"apP" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "apQ" = ( /obj/structure/reagent_dispensers/peppertank{ pixel_x = 32 @@ -7541,6 +7718,14 @@ /obj/item/device/assembly/flash/handheld, /turf/open/floor/plasteel, /area/security/main) +"apX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 1; + external_pressure_bound = 120; + name = "server vent" + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "apY" = ( /obj/structure/table, /obj/item/folder/red, @@ -7584,6 +7769,11 @@ /obj/item/clothing/head/soft/red, /turf/open/floor/plasteel/vault, /area/crew_quarters/fitness/recreation) +"aqe" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "aqf" = ( /obj/structure/closet/lasertag/blue, /turf/open/floor/plasteel/vault, @@ -8042,6 +8232,15 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"arh" = ( +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Kill Chamber"; + dir = 1; + network = list("ss13","rd","xeno"); + start_active = 1 + }, +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "ari" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -8234,6 +8433,10 @@ dir = 4 }, /area/crew_quarters/dorms) +"arF" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/science/xenobiology) "arG" = ( /obj/structure/closet, /obj/item/storage/box/lights/mixed, @@ -8888,7 +9091,7 @@ /turf/open/floor/plasteel/red/side, /area/security/main) "asL" = ( -/obj/machinery/rnd/protolathe/department/security, +/obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/plasteel/red/side{ dir = 6 }, @@ -9300,6 +9503,13 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"atC" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/turf/open/floor/plating/airless, +/area/science/xenobiology) "atD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -11251,6 +11461,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "axN" = ( @@ -11354,17 +11567,21 @@ req_one_access_txt = "0" }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "axV" = ( /obj/structure/sign/warning/securearea{ pixel_y = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axW" = ( /obj/structure/disposalpipe/segment, @@ -11374,10 +11591,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axX" = ( /obj/machinery/light_switch{ @@ -11393,41 +11609,21 @@ /obj/structure/sign/warning/securearea{ pixel_y = 32 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 5 }, -/turf/open/floor/plasteel, /area/engine/engineering) "axY" = ( /turf/closed/wall/r_wall, /area/engine/engineering) -"axZ" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"aya" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "ayc" = ( -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/mask/breath{ - pixel_x = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-4" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) -"aye" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) "ayf" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/glass{ @@ -11770,46 +11966,59 @@ dir = 1; pixel_y = 2 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, /area/engine/engineering) "ayT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "ayV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "ayW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"ayX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) -"aza" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +"ayX" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aza" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, /area/engine/engineering) "azb" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, @@ -11821,13 +12030,18 @@ }, /area/security/brig) "azd" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aze" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-22" @@ -12266,6 +12480,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -12455,13 +12672,20 @@ "aAo" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "aAp" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/item/clothing/suit/hooded/wintercoat/engineering, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, /area/engine/engineering) "aAr" = ( /obj/item/device/radio/intercom{ @@ -12474,15 +12698,12 @@ c_tag = "Engineering - Fore"; dir = 2 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aAt" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, @@ -12496,27 +12717,21 @@ sortType = 4 }, /obj/effect/landmark/start/station_engineer, +/obj/structure/cable/white{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/engine/engineering) "aAv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/engineering) -"aAw" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "aAx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, /area/engine/engineering) "aAz" = ( /obj/structure/table/wood, @@ -12540,7 +12755,7 @@ id = "mining_home"; name = "mining shuttle bay"; width = 7; - roundstart_template = /datum/map_template/shuttle/mining/box; + roundstart_template = /datum/map_template/shuttle/mining/box }, /turf/open/space/basic, /area/space) @@ -12743,7 +12958,7 @@ id = "laborcamp_home"; name = "fore bay 1"; width = 9; - roundstart_template = /datum/map_template/shuttle/labour/box; + roundstart_template = /datum/map_template/shuttle/labour/box }, /turf/open/space/basic, /area/space) @@ -13134,18 +13349,14 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aBK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBL" = ( @@ -13155,11 +13366,8 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBM" = ( @@ -13167,11 +13375,8 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/machinery/rnd/protolathe/department/engineering, +/obj/machinery/rnd/production/protolathe/department/engineering, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBN" = ( @@ -13180,21 +13385,10 @@ dir = 1 }, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aBO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"aBQ" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) "aBS" = ( /obj/item/stack/ore/silver, @@ -13707,9 +13901,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aCV" = ( @@ -13719,38 +13910,29 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "aCW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"aCX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel, /area/engine/engineering) "aCY" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/space) "aCZ" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "aDa" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -14352,10 +14534,9 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aEo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -14378,31 +14559,16 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aEq" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aEr" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Fore Port"; + dir = 4; + network = list("singularity") }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, /area/engine/engineering) "aEt" = ( /obj/structure/table, @@ -14940,10 +15106,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 2 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aFw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -14961,52 +15126,26 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aFz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) "aFA" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFB" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/rack, +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = -26; + req_access_txt = "11" }, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/black, +/obj/item/wrench, +/obj/item/clothing/glasses/meson/engine, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aFD" = ( -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/meter, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/turf/open/floor/engine, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aFE" = ( /obj/structure/table/wood, @@ -15392,7 +15531,7 @@ }, /area/hallway/primary/fore) "aGo" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/red/corner{ dir = 2 }, @@ -15753,10 +15892,9 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aGW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -15767,31 +15905,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) -"aGY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "aGZ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "External Gas to Loop" +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"aHa" = ( -/obj/structure/cable/white, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "aHb" = ( /obj/machinery/camera{ @@ -16196,6 +16317,9 @@ lootcount = 2; name = "2maintenance loot spawner" }, +/obj/machinery/light/small{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aHW" = ( @@ -16212,42 +16336,21 @@ dir = 8; pixel_x = -24 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aHY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"aHZ" = ( -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/effect/turf_decal/delivery, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aIc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating, -/area/engine/engineering) "aIe" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering) +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space) "aIf" = ( /obj/machinery/camera{ c_tag = "Auxillary Base Construction"; @@ -16924,34 +17027,13 @@ /obj/structure/table, /obj/item/airlock_painter, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aJp" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/machinery/light{ - dir = 4 +/turf/open/floor/plasteel/yellow/side{ + dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel, /area/engine/engineering) "aJu" = ( /turf/open/floor/plating, /area/engine/engineering) -"aJv" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "aJB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -17398,12 +17480,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"aKA" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aKB" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -17417,53 +17493,26 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/engine/engineering) -"aKF" = ( -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_x = 24; - req_access_txt = "10" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "aKG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +/obj/structure/particle_accelerator/end_cap{ + icon_state = "end_cap"; dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "aKH" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Gas to Chamber"; - on = 0 +/obj/structure/particle_accelerator/fuel_chamber{ + icon_state = "fuel_chamber"; + dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "aKI" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 +/obj/structure/particle_accelerator/power_box{ + icon_state = "power_box"; + dir = 4 }, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"aKL" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Mix Bypass"; - on = 0 - }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "aKN" = ( /obj/machinery/door/poddoor{ @@ -18014,12 +18063,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/engine/engineering) -"aMc" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aMd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -18040,62 +18083,52 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aMg" = ( -/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine"; - req_access_txt = "10" +/turf/open/floor/plasteel/yellow/side{ + dir = 4 }, -/turf/open/floor/plating, /area/engine/engineering) "aMh" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aMi" = ( /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "1-8" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) -"aMi" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Gas to Filter" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aMj" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) "aMk" = ( -/turf/open/floor/engine, -/area/engine/supermatter) -"aMm" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel/dark, +/obj/machinery/particle_accelerator/control_box, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, /area/engine/engineering) "aMo" = ( -/obj/structure/reflector/box/anchored{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "aMq" = ( /obj/structure/window/reinforced, /turf/open/space, @@ -18542,7 +18575,9 @@ maxcharge = 15000 }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 10 + }, /area/engine/engineering) "aNr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -18552,17 +18587,27 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aNu" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Gas to Filter"; - on = 0 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Particle Accelerator"; + dir = 1; + network = list("singularity") + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) "aNv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) "aNw" = ( /obj/structure/window/reinforced{ dir = 4 @@ -18923,7 +18968,7 @@ /turf/open/floor/plasteel/neutral/side, /area/security/courtroom) "aOj" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/neutral/side, /area/security/courtroom) "aOk" = ( @@ -19226,10 +19271,9 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aOP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -19252,26 +19296,12 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aOR" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ +"aOS" = ( +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aOS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_y = 21 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space) "aOT" = ( /obj/structure/window/reinforced{ dir = 4 @@ -19815,41 +19845,32 @@ icon_state = "2-8" }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 9 + }, /area/engine/engineering) "aPZ" = ( /obj/machinery/vending/tool, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aQa" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/turf/open/floor/plasteel/yellow/side{ + dir = 1 }, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/open/floor/plasteel, /area/engine/engineering) "aQd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/rack, +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = 26; + req_access_txt = "11" }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ +/obj/item/storage/belt/utility, +/obj/item/weldingtool, +/obj/item/clothing/head/welding, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/turf/open/floor/engine, -/area/engine/engineering) -"aQe" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, /area/engine/engineering) "aQf" = ( /obj/structure/chair{ @@ -20454,19 +20475,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aRo" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, /area/engine/engineering) "aRp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -20478,9 +20489,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aRq" = ( @@ -20507,13 +20515,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"aRv" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "aRy" = ( /turf/closed/wall/r_wall, /area/aisat) @@ -20930,10 +20931,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plasteel/yellow/side{ dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aSu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -20962,9 +20962,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) "aSx" = ( @@ -20975,36 +20973,39 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/engineering) "aSz" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/pen, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, +/obj/item/paper_bin{ + layer = 2.9 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/table/glass, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) "aSA" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 3; + pixel_y = 3 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 5 - }, -/turf/open/floor/engine, +/obj/item/book/manual/wiki/engineering_construction, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/obj/item/device/flashlight, +/turf/open/floor/plasteel, /area/engine/engineering) "aSB" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aSD" = ( @@ -21489,10 +21490,9 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/turf/open/floor/plasteel/yellow/side{ + dir = 8 }, -/turf/open/floor/plasteel, /area/engine/engineering) "aTG" = ( /obj/structure/disposalpipe/segment{ @@ -21504,26 +21504,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aTH" = ( /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, +/obj/machinery/light, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aTI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -21534,9 +21526,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -21549,31 +21538,6 @@ /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aTM" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"aTN" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"aTO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "aTQ" = ( @@ -21744,7 +21708,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/rnd/protolathe/department/cargo, +/obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/plasteel, /area/quartermaster/storage) "aUj" = ( @@ -22178,7 +22142,9 @@ "aUY" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/wardrobe/engineering_yellow, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side{ + dir = 10 + }, /area/engine/engineering) "aUZ" = ( /obj/structure/disposalpipe/segment, @@ -22189,8 +22155,8 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/turf/open/floor/plasteel{ - dir = 1 +/turf/open/floor/plasteel/yellow/side{ + dir = 6 }, /area/engine/engineering) "aVa" = ( @@ -22227,31 +22193,13 @@ dir = 4 }, /obj/structure/closet/secure_closet/engineering_electrical, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aVe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"aVf" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/engineering{ - name = "Supermatter Engine"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"aVh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "aVk" = ( /obj/structure/window/reinforced{ @@ -22791,8 +22739,10 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aWu" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/airlock/external{ + name = "Escape Pod Four"; + req_access = null; + req_access_txt = "32" }, /turf/open/floor/plating, /area/maintenance/starboard) @@ -22880,18 +22830,16 @@ dir = 1 }, /area/engine/engineering) -"aWH" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) "aWK" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 +/obj/structure/cable/white{ + icon_state = "2-4" }, -/turf/open/space, -/area/space/nearstation) +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aWL" = ( /obj/machinery/ai_status_display{ pixel_x = -32 @@ -23788,12 +23736,15 @@ /turf/closed/wall, /area/security/checkpoint/engineering) "aYx" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "aYy" = ( /obj/machinery/camera{ c_tag = "AI Chamber - Port"; @@ -29762,7 +29713,7 @@ }, /area/bridge) "bkF" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/structure/cable/yellow{ icon_state = "1-2" }, @@ -32033,9 +31984,6 @@ dir = 6 }, /area/security/checkpoint/customs) -"bpu" = ( -/turf/closed/wall/r_wall, -/area/space/nearstation) "bpv" = ( /obj/structure/sign/warning/securearea{ pixel_y = 32 @@ -32205,7 +32153,7 @@ icon_state = "4-8" }, /obj/machinery/holopad, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) "bpL" = ( @@ -33636,7 +33584,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bsm" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -35366,15 +35314,6 @@ dir = 5 }, /area/hallway/primary/port) -"bvT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/science/xenobiology) "bvU" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -36744,7 +36683,7 @@ /area/ai_monitored/storage/satellite) "byP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/caution{ dir = 8 }, @@ -38467,7 +38406,6 @@ /obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/space, /area/space/nearstation) "bCA" = ( @@ -41032,7 +40970,7 @@ "bIe" = ( /obj/structure/table, /obj/item/hand_tele, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/machinery/airalarm{ dir = 4; pixel_x = -23 @@ -41243,12 +41181,6 @@ }, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) -"bIv" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bIw" = ( /obj/machinery/light, /obj/machinery/camera{ @@ -41843,7 +41775,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/neutral/side{ dir = 2 }, @@ -42156,7 +42088,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bKy" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, @@ -42921,10 +42853,6 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) -"bMi" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) "bMj" = ( /obj/machinery/holopad, /turf/open/floor/plasteel, @@ -46279,10 +46207,10 @@ /turf/closed/wall, /area/maintenance/solars/port/aft) "bTq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel, /area/engine/engineering) "bTr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -46858,8 +46786,12 @@ }, /area/maintenance/starboard) "bUw" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/dark, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, /area/engine/engineering) "bUx" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -47346,7 +47278,6 @@ /turf/closed/wall, /area/hallway/secondary/service) "bVA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock{ name = "Service Hall"; req_access_txt = "null"; @@ -48106,6 +48037,9 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "bXc" = ( @@ -51196,7 +51130,7 @@ }, /area/medical/storage) "cdv" = ( -/obj/machinery/rnd/protolathe/department/medical, +/obj/machinery/rnd/production/techfab/department/medical, /turf/open/floor/plasteel/whiteblue/side{ dir = 5 }, @@ -53679,7 +53613,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/rnd/protolathe/department/science, +/obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/plasteel, /area/science/lab) "ciE" = ( @@ -53832,7 +53766,7 @@ /turf/open/floor/engine, /area/science/explab) "ciT" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -54258,7 +54192,6 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "cjV" = ( -/obj/machinery/smoke_machine, /turf/open/floor/plasteel/whiteyellow/side{ dir = 4 }, @@ -54315,7 +54248,7 @@ "cjZ" = ( /obj/item/reagent_containers/glass/beaker/sulphuric, /obj/effect/turf_decal/stripes/line, -/obj/machinery/rnd/circuit_imprinter/department/science, +/obj/machinery/rnd/production/circuit_imprinter/department/science, /turf/open/floor/plasteel, /area/science/lab) "cka" = ( @@ -56450,7 +56383,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/rnd/protolathe/department/service, +/obj/machinery/rnd/production/techfab/department/service, /turf/open/floor/plasteel, /area/hallway/secondary/service) "cox" = ( @@ -57167,23 +57100,23 @@ }, /area/maintenance/port/aft) "cpR" = ( +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = -26; + req_access_txt = "11" + }, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 10 }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Port"; - dir = 8; - network = list("ss13","engine") +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/machinery/airalarm/engine{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "cpS" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -63907,7 +63840,7 @@ /turf/open/floor/plating/airless, /area/science/test_area) "cDx" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plating/airless, /area/science/test_area) "cDy" = ( @@ -65778,7 +65711,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/robotics/lab) @@ -68169,15 +68102,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/aft) -"cLE" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - name = "euthanization chamber freezer"; - on = 1; - target_temperature = 80 - }, -/turf/open/floor/plating, -/area/science/xenobiology) "cLF" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -70136,7 +70060,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -71852,10 +71776,6 @@ /obj/effect/landmark/xmastree, /turf/open/floor/wood, /area/crew_quarters/bar) -"cTT" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/science/xenobiology) "cUH" = ( /obj/structure/table/optable, /turf/open/floor/plasteel/white, @@ -72101,6 +72021,12 @@ }, /turf/open/floor/plating, /area/shuttle/auxillary_base) +"cWu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "cWA" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -72137,18 +72063,6 @@ /obj/structure/easel, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"cXz" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Aft"; - dir = 1; - network = list("ss13","engine") - }, -/turf/open/floor/engine, -/area/engine/engineering) "cXA" = ( /turf/closed/wall/r_wall, /area/security/checkpoint/engineering) @@ -72161,7 +72075,12 @@ }, /area/construction/mining/aux_base) "cXI" = ( -/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cXR" = ( @@ -72173,11 +72092,12 @@ }, /area/construction/mining/aux_base) "cXZ" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/window/reinforced{ - dir = 8 +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/starboard) "cYc" = ( @@ -72197,8 +72117,9 @@ }, /area/science/robotics/lab) "cYj" = ( -/obj/structure/closet/firecloset, -/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard) "cYE" = ( @@ -72326,9 +72247,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"cZv" = ( -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "cZR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -72406,7 +72324,7 @@ /turf/open/floor/engine, /area/science/xenobiology) "daH" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/engine, /area/science/xenobiology) "daI" = ( @@ -72470,49 +72388,20 @@ }, /turf/open/floor/plating, /area/maintenance/department/science/xenobiology) -"daP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/science/xenobiology) -"daQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"daR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1; - external_pressure_bound = 140; - name = "server vent"; - pressure_checks = 0 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"daS" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "daW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/button/door{ + id = "engpa"; + name = "Engineering Chamber Shutters Control"; + pixel_y = 26; + req_access_txt = "11" }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) "daX" = ( /obj/structure/cable/yellow{ @@ -72522,27 +72411,20 @@ icon_state = "platingdmg2" }, /area/maintenance/port/fore) -"daY" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter) "daZ" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 +/obj/structure/particle_accelerator/particle_emitter/right{ + icon_state = "emitter_right"; + dir = 4 }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "dbb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/structure/particle_accelerator/particle_emitter/center{ + icon_state = "emitter_center"; + dir = 4 }, -/turf/open/floor/engine, -/area/engine/supermatter) +/turf/open/floor/plating, +/area/engine/engineering) "dbd" = ( /obj/structure/sink/kitchen{ pixel_y = 28 @@ -72555,30 +72437,6 @@ }, /turf/open/floor/carpet, /area/crew_quarters/heads/hop) -"dbg" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dbh" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "dbj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -72661,20 +72519,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"dbv" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/small, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"dbw" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Kill Chamber"; - dir = 1; - network = list("ss13","rd","xeno"); - start_active = 1 - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) "dbE" = ( /obj/machinery/plantgenes, /obj/effect/turf_decal/stripes/line{ @@ -73080,19 +72924,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"dcm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/computer/camera_advanced/xenobio, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "dcn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -73109,19 +72940,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"dco" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/machinery/computer/camera_advanced/xenobio, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "dcp" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -73179,18 +72997,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"dcv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/chair/comfy/black{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "dcw" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -73198,16 +73004,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/xenobiology) -"dcx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/chair/comfy/black{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "dcy" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/white, @@ -73279,21 +73075,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"dcJ" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/item/extinguisher{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/extinguisher, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "dcK" = ( /obj/machinery/disposal/bin, /obj/structure/sign/warning/deathsposal{ @@ -73711,53 +73492,11 @@ }, /turf/open/floor/plating, /area/maintenance/department/science/xenobiology) -"ddx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/chair, -/obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "ddy" = ( /turf/open/floor/plating{ icon_state = "platingdmg1" }, /area/maintenance/department/science/xenobiology) -"ddz" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plating, -/area/science/xenobiology) -"ddA" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - glass = 1; - name = "Slime Euthanization Chamber"; - opacity = 0; - req_access_txt = "55" - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"ddB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 1; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/killroom, -/area/science/xenobiology) -"ddC" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/disposaloutlet, -/turf/open/floor/plating/airless, -/area/science/xenobiology) "ddE" = ( /obj/effect/landmark/start/cook, /obj/machinery/holopad, @@ -73775,16 +73514,12 @@ /turf/open/floor/plating, /area/shuttle/auxillary_base) "ddO" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, /area/engine/engineering) "ddP" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engineering) @@ -73798,41 +73533,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"ddS" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Fore"; - dir = 4; - network = list("ss13","engine") - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -26 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddT" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddU" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/obj/machinery/meter, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ddV" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "ddW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, @@ -73845,28 +73549,14 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel, -/area/engine/engineering) -"ddY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engineering) "ddZ" = ( -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dea" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - volume_rate = 200 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, /turf/open/floor/plating/airless, -/area/engine/engineering) +/area/space) "deb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -73874,644 +73564,153 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"ded" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"dee" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "def" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"deh" = ( -/obj/structure/cable/white{ +/obj/structure/lattice/catwalk, +/obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"dei" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dej" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dek" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 2; - name = "Mix to Gas" - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"del" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/space, +/area/space) "dem" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Mix" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"den" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dep" = ( -/obj/machinery/firealarm{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"deq" = ( -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_y = 21 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"der" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"des" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deu" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dev" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dew" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dex" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dey" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"deA" = ( -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"deB" = ( +/obj/structure/lattice/catwalk, /obj/structure/cable{ icon_state = "1-2" }, +/turf/open/space, +/area/space) +"den" = ( /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deC" = ( -/obj/effect/turf_decal/bot{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"der" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) -"deD" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"deI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"deJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, -/area/engine/engineering) -"deK" = ( -/obj/structure/cable/white, -/obj/machinery/power/emitter/anchored{ - dir = 2; +"dev" = ( +/obj/machinery/field/generator{ + anchored = 1; state = 2 }, -/turf/open/floor/plating, -/area/engine/engineering) -"deL" = ( -/obj/structure/cable/white, -/obj/machinery/light{ - dir = 4 +/turf/open/floor/plating/airless, +/area/space/nearstation) +"dew" = ( +/turf/open/space, +/area/space/nearstation) +"deB" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engpa"; + name = "Engineering Chamber Shutters" }, -/turf/open/floor/plating, -/area/engine/engineering) -"deM" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"deN" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"deO" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engine/engineering) -"deS" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/engine, -/area/engine/supermatter) -"deU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"deD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" }, +/turf/open/floor/plating/airless, +/area/space) +"deM" = ( +/obj/structure/table, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, /area/engine/engineering) "deV" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"deW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Starboard"; - dir = 4; - network = list("ss13","engine") +/obj/structure/cable{ + icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"deX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space) "deY" = ( -/obj/structure/reflector/single/anchored{ - dir = 9 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plating, -/area/engine/engineering) +/turf/open/floor/plating/airless, +/area/space/nearstation) "dfa" = ( -/obj/machinery/power/supermatter_shard/crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) -"dfb" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfc" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical, -/turf/open/floor/engine, -/area/engine/engineering) -"dff" = ( -/obj/structure/reflector/double/anchored{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfg" = ( -/obj/structure/reflector/single/anchored{ - dir = 10 +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plating, /area/engine/engineering) "dfh" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dfi" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/table, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = 10 + }, +/turf/open/floor/plasteel/yellow/side{ dir = 4 }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, /area/engine/engineering) -"dfj" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dfk" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"dfm" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/window/plasma/reinforced{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) "dfp" = ( -/obj/effect/turf_decal/bot{ +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/yellow/side{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfq" = ( -/obj/machinery/camera{ - c_tag = "Supermatter Chamber"; - dir = 4; - network = list("engine") - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"dft" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - filter_type = "n2" - }, -/turf/open/floor/engine, /area/engine/engineering) "dfz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dfA" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfB" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfC" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/space) "dfD" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/item/book/manual/engineering_singularity_safety{ + pixel_x = 3; + pixel_y = 3 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/engineering_particle_accelerator{ + pixel_x = -3; + pixel_y = -3 }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/meter, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/table/glass, +/turf/open/floor/plasteel, /area/engine/engineering) "dfI" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Cooling Loop Bypass" +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfJ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfM" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"dfO" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/space) "dfP" = ( /obj/structure/cable/white{ - icon_state = "4-8" + icon_state = "2-8" }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Atmos to Loop" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfQ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/engine, -/area/engine/engineering) -"dfR" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Gas to Cold Loop"; - on = 1 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfS" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfT" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/engine/engineering) -"dfU" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Cold Loop to Gas"; - on = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"dfV" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dfW" = ( -/obj/item/wrench, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) "dfX" = ( /obj/structure/disposalpipe/segment, @@ -74529,137 +73728,82 @@ }, /area/engine/engineering) "dfY" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "1-4" }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dfZ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel/yellow/side, /area/engine/engineering) "dga" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "2-8" }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dgb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, +/turf/open/floor/plating/airless, /area/engine/engineering) "dgc" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 +/obj/item/clothing/gloves/color/rainbow, +/obj/item/clothing/head/soft/rainbow, +/obj/item/clothing/shoes/sneakers/rainbow, +/obj/item/clothing/under/color/rainbow, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/turf/open/floor/plating, /area/maintenance/starboard) "dgd" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dge" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgf" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/cable/white{ + icon_state = "0-2" }, -/turf/open/space, -/area/space/nearstation) +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/emitter{ + anchored = 1; + dir = 1; + icon_state = "emitter"; + state = 2 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgg" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgh" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"dgi" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/plating, -/area/maintenance/starboard) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgj" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/structure/grille, +/obj/structure/cable/white{ + icon_state = "1-4" }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgk" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/obj/structure/cable/white{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"dgo" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"dgp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"dgr" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"dgt" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgu" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) -"dgv" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"dgw" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/engine/engineering) "dgz" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/delivery, @@ -74667,134 +73811,13 @@ /turf/open/floor/plasteel, /area/engine/engineering) "dgA" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgB" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 +/obj/machinery/light{ + dir = 4 }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) +/turf/open/floor/plasteel, +/area/engine/engineering) "dgI" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"dgJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgK" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dgM" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"dgN" = ( -/obj/structure/lattice, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgO" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dgS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/transit_tube/horizontal, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dha" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dhc" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/space, -/area/space/nearstation) -"dhe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhg" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhh" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine"; - on = 0 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhi" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/door/window/northleft{ - dir = 8; - icon_state = "left"; - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"dhj" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"dhk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"dhl" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 - }, -/turf/open/space, +/turf/closed/wall/mineral/plastitanium, /area/space/nearstation) "dhn" = ( /obj/structure/table, @@ -75813,26 +74836,18 @@ /turf/open/space, /area/science/xenobiology) "djt" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/engine/supermatter) +/area/engine/engineering) "djx" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Aft Port"; + dir = 4; + network = list("singularity") }, -/obj/item/crowbar, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) "djz" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -75870,7 +74885,7 @@ id = "arrivals_stationary"; name = "arrivals"; width = 7; - roundstart_template = /datum/map_template/shuttle/arrival/box; + roundstart_template = /datum/map_template/shuttle/arrival/box }, /turf/open/space/basic, /area/space) @@ -75892,45 +74907,14 @@ /turf/open/floor/plating, /area/chapel/main) "dlI" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dlN" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/supermatter) +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "dlV" = ( /turf/closed/wall/r_wall, /area/maintenance/department/science/xenobiology) -"dmq" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/door/airlock/research{ - glass = 1; - name = "Slime Euthanization Chamber"; - opacity = 0; - req_access_txt = "55" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"dmr" = ( -/obj/machinery/door/airlock/research{ - glass = 1; - name = "Slime Euthanization Chamber"; - opacity = 0; - req_access_txt = "55" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "dmD" = ( /obj/structure/displaycase/trophy, /turf/open/floor/wood, @@ -76108,6 +75092,14 @@ icon_state = "platingdmg2" }, /area/maintenance/port/fore) +"drT" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "dsg" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76148,6 +75140,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"dtL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space, +/area/space) "dtP" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76481,46 +75480,24 @@ /turf/closed/wall, /area/engine/gravity_generator) "dBw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBx" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"dBy" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"dBz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"dBB" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/engine/engineering) +"dBy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) +"dBB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space) "dBC" = ( /obj/machinery/meter, /obj/structure/grille, @@ -77200,6 +76177,23 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"dPf" = ( +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"dPp" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engineering) "dYu" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Airlock" @@ -77209,6 +76203,19 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"dZD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space) +"eln" = ( +/turf/open/space/basic, +/area/engine/engineering) +"enN" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/engineering) "eoK" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -77241,6 +76248,17 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"esV" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "evy" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -77251,6 +76269,25 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"eEu" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "eFN" = ( /obj/structure/bodycontainer/crematorium{ id = "crematoriumChapel"; @@ -77281,12 +76318,48 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/engine/engineering) +"fjy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space) +"foU" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching the Engine."; + dir = 8; + layer = 4; + name = "Engine Monitor"; + network = list("singularity"); + pixel_x = 30 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) "fDD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, /area/science/circuit) +"fGs" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"fWO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space) "gfh" = ( /obj/machinery/libraryscanner, /turf/open/floor/plasteel/white, @@ -77309,6 +76382,14 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"goZ" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "gEk" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -77334,6 +76415,14 @@ /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating, /area/engine/atmos) +"gKb" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Fore Starboard"; + dir = 8; + network = list("singularity") + }, +/turf/open/floor/plating/airless, +/area/space) "gLC" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel, @@ -77366,6 +76455,9 @@ }, /turf/open/floor/plating, /area/security/prison) +"hWU" = ( +/turf/open/floor/plating/airless, +/area/space) "ioI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -77393,6 +76485,37 @@ }, /turf/open/floor/plasteel/whitepurple, /area/science/lab) +"iOa" = ( +/turf/closed/wall/mineral/plastitanium, +/area/maintenance/starboard) +"iTS" = ( +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) +"iYY" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/engine/engineering) +"jjF" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "jwW" = ( /turf/closed/wall/mineral/plastitanium, /area/crew_quarters/fitness/recreation) @@ -77423,6 +76546,21 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"jFx" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"jIV" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "jKK" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -77432,6 +76570,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"jYQ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) "kfu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, @@ -77537,6 +76681,14 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"lHL" = ( +/turf/open/space/basic, +/area/space/nearstation) +"lLj" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 8 + }, +/area/engine/engineering) "lMz" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -77578,6 +76730,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"moI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/space) "mvj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -77587,6 +76745,12 @@ }, /turf/closed/wall, /area/hallway/secondary/service) +"mwK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space) "mzh" = ( /obj/machinery/firealarm{ dir = 1; @@ -77615,6 +76779,30 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/circuit) +"nte" = ( +/obj/machinery/the_singularitygen/tesla, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"nwU" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "External Containment Access"; + req_access_txt = "10; 13" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) "nyo" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -77649,10 +76837,33 @@ }, /turf/open/floor/plasteel, /area/construction/storage/wing) +"nKh" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 1 + }, +/area/engine/engineering) "obb" = ( /obj/structure/target_stake, /turf/open/floor/plasteel/white, /area/science/circuit) +"obN" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space, +/area/space) +"ocj" = ( +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating/airless, +/area/engine/engineering) "ocT" = ( /obj/machinery/light{ dir = 1 @@ -77767,6 +76978,13 @@ dir = 2 }, /area/crew_quarters/locker) +"pWF" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "qnJ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -77797,6 +77015,12 @@ "qBq" = ( /turf/closed/wall/mineral/plastitanium, /area/hallway/secondary/entry) +"qJG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) "qJZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -77820,6 +77044,18 @@ dir = 1 }, /area/science/lab) +"rEi" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"rFx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/engineering) "rQK" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -77839,6 +77075,29 @@ /obj/machinery/vending/snack/random, /turf/open/floor/plasteel, /area/science/mixing) +"rTo" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"rVX" = ( +/obj/structure/particle_accelerator/particle_emitter/left{ + icon_state = "emitter_left"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"rWa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/yellow/side, +/area/engine/engineering) "sdi" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -77875,6 +77134,21 @@ "sJW" = ( /turf/closed/wall/mineral/plastitanium, /area/engine/break_room) +"sOW" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"sSU" = ( +/turf/closed/wall/r_wall, +/area/space) +"tdB" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/starboard/fore) "tjH" = ( /obj/structure/table/reinforced, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -77896,22 +77170,19 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "tDM" = ( -/obj/machinery/door/airlock/engineering/glass{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) +/obj/item/wrench, +/turf/open/floor/plating, +/area/engine/engineering) "tFJ" = ( /obj/structure/bodycontainer/morgue{ dir = 8 }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"tMT" = ( +/obj/structure/lattice, +/turf/open/space, +/area/engine/engineering) "tVY" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -77962,6 +77233,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard) +"uQo" = ( +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) "uRM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -77974,7 +77250,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/rnd/protolathe/department/science, +/obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/plasteel/white, /area/science/circuit) "uYk" = ( @@ -77990,10 +77266,30 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) +"vmz" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space) +"vAk" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "vLD" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space) +"vSl" = ( +/obj/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "wiZ" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -78044,11 +77340,39 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/misc_lab) +"xcM" = ( +/obj/structure/closet/firecloset, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/yellow/side{ + dir = 4 + }, +/area/engine/engineering) +"xfK" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/space) "xkG" = ( /obj/item/device/integrated_electronics/wirer, /obj/structure/table/reinforced, /turf/open/floor/plasteel/white, /area/science/circuit) +"xqB" = ( +/obj/structure/cable/white, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/emitter{ + anchored = 1; + state = 2 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xse" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance"; @@ -78080,6 +77404,19 @@ /obj/structure/chair/comfy, /turf/open/floor/plasteel, /area/science/misc_lab) +"xLP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space, +/area/space) +"xNI" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -78090,6 +77427,24 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"xWZ" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/grille, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"yeY" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Containment - Aft Starboard"; + dir = 8; + network = list("singularity") + }, +/turf/open/floor/plating/airless, +/area/space) "ygk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -110960,8 +110315,8 @@ cRi cRi cRi cRi -daP -cLE +aaX +aju dlV aaa aaa @@ -111217,7 +110572,7 @@ cSn daF daJ cRi -bvT +abd cRi cRi cRi @@ -111474,10 +110829,10 @@ cSn cSn cSn cRi -dmq +acd cRi -cZv -cZv +anz +anz cRi aaf aag @@ -111705,8 +111060,8 @@ aaa aaf cRe cRS -dcm -dcv +aab +aae cRC dcG cSe @@ -111731,10 +111086,10 @@ daB daG cSn cRi -ddx -ddz -daR -cZv +aeD +alr +aov +anz cRe aaa aaa @@ -111988,12 +111343,12 @@ cSn cSn daL cRi -daQ -ddA -daS -dbv -cTT -ddC +afQ +amV +apP +aqe +arF +atC aaf aaa aaa @@ -112219,8 +111574,8 @@ aaa aaf cRe cRS -dco -dcx +aad +aaU dcA dcI cRR @@ -112245,10 +111600,10 @@ cSn daH daK cRi -bIv -ddz -ddB -cZv +ahT +alr +apX +anz cRe aaa aaf @@ -112479,7 +111834,7 @@ dcb cZa dDI dcB -dcJ +aaW cRa cSm cSw @@ -112502,10 +111857,10 @@ cSn cSn daN cRi -dmr +ajk cRi -cZv -dbw +anz +arh cRi aaa aag @@ -118297,12 +117652,12 @@ aFu aBI aBI aJn -aCO -aFq +lLj +lLj aNq aBI aPZ -aRo +aSB aSu aTG aUZ @@ -118543,7 +117898,7 @@ arJ arI dnh dqu -doh +tdB axO axY aAo @@ -118553,12 +117908,12 @@ aEn aFv aGV aHX -aEi -aKA -aMc -aEi +aBO +aBO +aBO +aBO aOO -aEi +aBO aRp aSv aTH @@ -119060,7 +118415,7 @@ avt awJ axS axY -aCO +jIV ddW aCT aEp @@ -119320,18 +118675,18 @@ axY aAr ddX aCU -aEq -aTO +aCW +aBO aGX -aHZ -aJp -aTO +aBO +aBO +aBO aSB -aTO -aOR -aQa +aBO +aBO +aBO aGX -aTO +aBK aTK aVd aBI @@ -119574,23 +118929,23 @@ avv axY axU ayS -dCk -ddY +enN +ddX deb -deh -aFz -aCZ +aBO +aBO +iTS deM -axY -aCZ +uQo +foU aMg -aCZ +xcM dfh -deM -aCZ -aFz -deh -aVe +aBO +aBO +aBK +dPp +rFx axY aYu aYu @@ -119834,21 +119189,21 @@ ddP aAt aBL deb -dei +aBO aFA +axY +axY deB -deB -deB -deB +axY aMh -deB -deB -deB -deB +axY +axY +nKh +aBO aSz -aTM +aTK aVe -apc +aJu aYu aZL bbB @@ -120091,21 +119446,21 @@ aAu ddQ aBM aCV -aEr +aBO aFB -aGY +axY daW dBw -aKF +dBw aMi cpR -dfi +axY aQd -dBA +aBO aSA -aTN -aVf -apc +aTK +aVe +aJu aYu aZM bbC @@ -120348,21 +119703,21 @@ ayV aAv aBN aCW -aEr -aFC +aBO +aFA aGZ -aGZ -dlI +qJG +aJu aKG -aMj +aJu dBy -dlI -aQe -aRv +aGZ +nKh +aBO dfD -aTN -aVe -apc +aTK +rWa +aJu aYu aZN bbD @@ -120603,23 +119958,23 @@ axY axY ayW bTq +dgA +aBO aBO -aCX -dej aFC -deC -deC -dlI +axY +qJG +aJu aKH aMk aNu -dlI +axY dfp -dfp -dfE +aBO +dgA dfP dfY -dgc +axY aYu cXA cXA @@ -120857,30 +120212,30 @@ ath ajb avA axY -axZ +axY ayX -ddS -bUw -aCY -dek +axY +axY +aBO +aBO der -deD -dlI -aJv +axY +qJG +aJu aKI tDM -dfb -dfj +dBy +axY dlI -deD -dfF -aTN -aVe -aWH -dgi +aBO +axY +axY +ayX +axY +atm dgc -aqq -aqr +alq +apc aWu bif bif @@ -121114,29 +120469,29 @@ ati ajb avB axY -ddO +jYQ bUw -ddT -ddZ -ded -del -des +aJu +axY +axY +axY +axY djt -daY +qJG daZ dbb -aMk -aNv -dfk -dfq +rVX +dBy djt -dfG -dfQ -dfZ -apc -apc -dgo -apc +axY +axY +axY +aJu +bUw +iYY +axY +alq +alq cXZ atm bfZ @@ -121371,31 +120726,31 @@ ajb ajb avC axY -aya -bUw -ddU -aBQ -dee +axY +eEu +axY +axY +ddO aEr -des +ddO djt -daY -daZ -dbb +qJG +aJu +rEi dfa aNv -dfk -daY +djt +ddO djx -dfG -cXz -aVe -atm -alr -dgp +axY +axY +nwU +axY +axY +alq cXI cYj -atm +iOa bga big bga @@ -121414,7 +120769,7 @@ bFS bHy bIV bKC -bMi +bAQ bNU bMg bQV @@ -121628,31 +120983,31 @@ dps dpL avD axY +axY +xNI +ddO +ddO +ddO +ddO ddO -bUw -ddV -aBQ -dee -aEr -aKL djt -daY -deS -dbb -aMk -aNv -dfm -daY djt -dbg -dfR +djt +aRm +djt +djt +djt +ddO +ddO +ddO +ddO dga dgd dgj -dgp -alr -atm atm +alq +jFx +iOa bgb cTu bgb @@ -121671,8 +121026,8 @@ bFT bHz bIW bKD -dhe -dhg +bCi +bCi bPu bPu bPu @@ -121887,28 +121242,28 @@ avE axY ayc aza -aAw -bUw +ddO +aaa aCY dem -aFD +dem +deD +deD deD -dlI -dlI deV -dlN -dfc -dlI -dlI -deD +dem +dem +dem +dem +dem dfI -dfS -aVh -aaf +aaa +ddO +ddO aYx -dgr -dgw -dgA +sSU +lHL +lMJ dgI bgb cTi @@ -121929,7 +121284,7 @@ bHy bIX bKE bKE -dhh +bKE bPv bKE bKE @@ -122139,34 +121494,34 @@ apn aqy arT apm -dnS +vAk avB axY -axY -bTq +goZ +ddO aAx -aBO +sOW aIe aOS -deu -deI -deN -deI -deW -aMm -dfd -deN -dft +mwK +mwK +mwK +mwK +mwK +mwK +mwK +mwK +mwK dBB -dbh -dfT -aVh -aaa +aIe +sOW +cWu +ddO aYx -dgf -dgj -ack -dgJ +sSU +lMJ +lMJ +lHL bgb bij bgb @@ -122186,7 +121541,7 @@ bHA bIY bKF bMk -dhi +bNV bPw bQW bSj @@ -122399,31 +121754,31 @@ atk aux avF dqT -dqT -aaf -ack -dea -aIc -den +esV +xqB +aAx +aaa +aIe +dZD +dev +aav +aav +dev +lMJ +aaa +aav +aav dev -deJ -deO -deU -deX -dBx -dfe -dBz -dfu dfz -dfJ -dfU -dga +aIe +aaa +cWu dge azd -azd -azd -dgB -dgK +sSU +lMJ +lMJ +lHL aaa cUL aaa @@ -122443,7 +121798,7 @@ bHB bIZ bKG bMl -dhj +bKG bIZ bKG bMl @@ -122656,31 +122011,31 @@ atl auy dnS dqT -dqT -aaf -ack -ack +fGs +ddO +aAx +sOW def aCZ -dew -aCZ -axY -axY -aCZ -aCZ -aCZ -axY -axY -aCZ -dew -aCZ -aVe -dgf -dgk -dgt -dgk -dgv -dgJ +aav +aav +aav +vLD +aaf +aaa +aav +aav +aav +xfK +obN +sOW +cWu +ddO +dgg +sSU +lMJ +lHL +lHL anT aaf aaf @@ -122700,7 +122055,7 @@ bza bJa bza bFX -dhk +bza bJa bza bFX @@ -122912,52 +122267,52 @@ apm apm dnh dnS -dnz dqT +xWZ +dPf +aAx +aaa +aIe +dZD +aav +aav +aaa +aaa aaf -aaf -aaf -def -ddZ -dex -aJu -ddZ -ddZ -ddZ -aMo -dff -ddZ -ddZ -aJu -dex -ddZ -aVe +aaa +aaa +aav +aav +dfz +aIe +aaa +cWu aWK dgk -dgt -dgk -dgB -dgM -dgN -dgO -dgO -dgw -dgO -dgS -dgO -dgO -dgw -dgw -dgw -dgw +sSU +lMJ +lHL +lHL +anT +dew +dew +aaf +dew +bpw +dew +dew +aaf +aaf +aaf +aaf bCz -dgw -dha -dgw -dhc -dgw -dha -dhl +aaf +bFY +aaf +bJb +aaf +bFY +aaf bJb aaf bFY @@ -123170,31 +122525,31 @@ dnh auz dqp dqT -dqT +axY +fGs +aAx +vmz +def +aCZ aaa aaa aaa -bTq -dep -dey -aHa ddZ -ddZ -ddZ -ddZ -ddZ -ddZ -ddZ -dfA -dfM -dfV -dgb +cDu +fWO +aaa +vLD +dev +xfK +obN +vmz +cWu dgg -azd -azd -azd -dgv -aaf +axY +sSU +lMJ +lHL +lHL anT aaa aaa @@ -123427,30 +122782,30 @@ dni auA dnS dqT -aaa -aaa -aaa -aaa axY -deq -dey -deK -ddZ -ddZ -ddZ +fGs +ddO +sOW +aIe +dZD +lMJ +aaf +aaf +den +nte aMo -ddZ -ddZ -ddZ -dfB -dfM -dfW +aaf +aaf +lMJ +dfz +aIe +sOW +ddO +dgg axY -aWK -dgk -dgt -dgk -dgB +sSU +lMJ +lHL aaa anT aaa @@ -123684,31 +123039,31 @@ dnh auB avG dqT -aaa -aaa -aaa -aaa axY -aJu -deA -deL -aJu -aJu +fGs +aAx +vmz +def +aCZ +dev +vLD +aaa +fjy deY +moI +aaa +aaa +aaa +xfK +obN +vmz +cWu +dgg axY -dfg -aJu -aJu -dfC -dfO -ddZ -axY -dgh -dgk -dgk -dgk -dgv -aaf +sSU +lMJ +lHL +lHL anT aaa aaa @@ -123941,30 +123296,30 @@ dnh dnh jKK dqT +ocj +rTo +aAx +aaa +aIe +dZD +aav +aav +aaa +aaa aaf aaa aaa +aav +aav +dfz +aIe aaa -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -axY -aWK +cWu +jjF dgm -dgu -dgm -dgB +sSU +lMJ +lHL aaa anT aaa @@ -124198,31 +123553,31 @@ atn bOY avG dqT -aaf -aaa -aaa +fGs +ddO +aAx +sOW +dtL +aCZ +aav +aav aaa aaa aaf +vLD aaa -aaf -aaa -aaa -aaf -aaa -aaf -aaa -aaf -aaa -aaf -aaf -ack -ack -aye -dgv -aye -dgv -aaf +aav +aav +xfK +xLP +sOW +pWF +ddO +dgg +sSU +lMJ +lHL +lHL anT aaf aaf @@ -124455,29 +123810,29 @@ dnh dnh lNZ dqT -aaf +drT +xqB +aAx +aaa +vmz +dZD +dev +aav aaa aaa +lMJ +dev +aav +aav +dev +dfz +vmz aaa -aaa -aaf -aaa -aaf -aaa -aaa -aaf -aaa -aaf -aaa -aaf -aaa -aaa -aaf -aaf -aaf -aaa -aaa -aaf +cWu +dge +vSl +sSU +lMJ aaa aaa aaf @@ -124712,29 +124067,29 @@ aaa aaf ack dqT -aaf -anT -anT -anT -anT -aaf -anT -anT -anT -anT -anT -anT -aqB -anT -anT -anT -anT -anT -anT -aaf -aaa -aaa -aaf +axY +axY +ddO +hWU +hWU +gKb +hWU +hWU +hWU +hWU +hWU +hWU +hWU +hWU +hWU +yeY +hWU +hWU +ddO +axY +axY +sSU +lMJ aaa aaa aaf @@ -124969,29 +124324,29 @@ aaf aaf ack aaf -aaa -aaa -aaa -aaf -aaa -aaa -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -bpu -aaa -aaa -aaa -aaf -aaf -aaf -aaf +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +sSU +lMJ aaa aaa aaa @@ -125225,30 +124580,30 @@ aaa aaa aaa aaa +vLD aaa +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +axY +eln +tMT aaa -aaa -aaa -aaf -aaf -aaf -anT -anT -anT -anT -aqB -anT -anT -anT -anT -aqB -aaf -aaf -aaf -aaf -aaa -aaf -aaf +lHL +lMJ aaa aaa aaa @@ -125482,7 +124837,7 @@ aaa aaa aaa aaa -aaa +vLD aaa aaa aaa @@ -125739,26 +125094,26 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD +vLD aaf aai aaa diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index c860dc1a96..b6b157dafb 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -587,7 +587,7 @@ /turf/open/floor/plating, /area/mine/production) "bO" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/purple/corner{ dir = 8 }, diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index ccef5665e1..89be043c5d 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -4464,7 +4464,7 @@ /turf/open/floor/plating, /area/security/brig) "aiV" = ( -/obj/machinery/rnd/protolathe/department/security, +/obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/plasteel/red/side{ dir = 8 }, @@ -6004,7 +6004,7 @@ /obj/structure/cable/white{ icon_state = "0-8" }, -/obj/machinery/rnd/protolathe/department/cargo, +/obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/plasteel/brown{ dir = 4 }, @@ -8288,8 +8288,8 @@ "apX" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/turf_decal/delivery, -/obj/machinery/rnd/protolathe/department/service, /obj/effect/turf_decal/stripes/box, +/obj/machinery/rnd/production/techfab/department/service, /turf/open/floor/plasteel, /area/crew_quarters/bar/atrium) "apY" = ( @@ -18864,7 +18864,7 @@ /obj/structure/cable/white{ icon_state = "1-4" }, -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/yellow/side{ dir = 4 @@ -19261,7 +19261,7 @@ network = list("engine"); pixel_y = -32 }, -/obj/machinery/rnd/protolathe/department/engineering, +/obj/machinery/rnd/production/protolathe/department/engineering, /obj/effect/turf_decal/stripes/box, /turf/open/floor/plasteel, /area/engine/engineering) @@ -22628,7 +22628,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/machinery/rnd/protolathe/department/science, +/obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/plasteel/vault/side{ dir = 4 }, @@ -23035,7 +23035,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/machinery/rnd/circuit_imprinter/department/science, +/obj/machinery/rnd/production/circuit_imprinter/department/science, /turf/open/floor/plasteel/vault/side{ dir = 4 }, @@ -25492,8 +25492,8 @@ dir = 5 }, /obj/effect/turf_decal/bot, -/obj/machinery/rnd/protolathe/department/medical, /obj/effect/turf_decal/stripes/box, +/obj/machinery/rnd/production/techfab/department/medical, /turf/open/floor/plasteel, /area/medical/medbay/zone3) "bav" = ( @@ -30295,7 +30295,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bkC" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/entry) diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index d1ba08b910..5743767070 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2,6 +2,12 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aau" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/darkpurple, +/area/crew_quarters/cryopod) "aby" = ( /obj/structure/lattice, /obj/structure/grille, @@ -1449,7 +1455,7 @@ /area/ai_monitored/turret_protected/aisat_interior) "afy" = ( /obj/effect/landmark/start/cyborg, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "afz" = ( @@ -2385,6 +2391,10 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 6 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -27 + }, /turf/open/floor/plasteel/showroomfloor, /area/security/main) "ahN" = ( @@ -3256,6 +3266,10 @@ pixel_y = -3 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -27 + }, /turf/open/floor/plasteel/dark, /area/security/armory) "ajQ" = ( @@ -3823,6 +3837,10 @@ /obj/structure/cable{ icon_state = "0-2" }, +/obj/machinery/door/poddoor/preopen{ + id = "hos_spess_shutters"; + name = "Space shutters" + }, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "ala" = ( @@ -4111,6 +4129,10 @@ icon_state = "0-2" }, /obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "hos_spess_shutters"; + name = "Space shutters" + }, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "alO" = ( @@ -4415,6 +4437,7 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "amu" = ( @@ -4682,6 +4705,10 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28 + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "ana" = ( @@ -5019,6 +5046,11 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/machinery/button/door{ + id = "hos_spess_shutters"; + pixel_y = -26; + req_access_txt = "1" + }, /turf/open/floor/plasteel/darkred/side{ dir = 1 }, @@ -5070,6 +5102,10 @@ icon_state = "0-8" }, /obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "hos_spess_shutters"; + name = "Space shutters" + }, /turf/open/floor/plating, /area/crew_quarters/heads/hos) "anX" = ( @@ -5210,6 +5246,7 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "aot" = ( @@ -5799,6 +5836,7 @@ }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apN" = ( @@ -7258,9 +7296,6 @@ "atq" = ( /turf/open/floor/circuit/green, /area/maintenance/department/security/brig) -"atu" = ( -/turf/open/space, -/area/security/brig) "atv" = ( /obj/structure/cable{ icon_state = "0-4" @@ -7358,6 +7393,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/red/side{ dir = 8 }, @@ -7380,6 +7416,7 @@ req_access_txt = "63" }, /obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/red/side{ dir = 4 }, @@ -7390,6 +7427,7 @@ req_access_txt = "1" }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "atI" = ( @@ -7477,7 +7515,7 @@ }, /area/bridge) "atU" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/darkblue/side{ dir = 1 }, @@ -8281,6 +8319,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -8533,10 +8572,10 @@ /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "awx" = ( -/obj/structure/closet/athletic_mixed, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/vending/kink, /turf/open/floor/plasteel/arrival{ dir = 1 }, @@ -8740,6 +8779,7 @@ name = "brig shutters" }, /obj/item/device/radio, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "awP" = ( @@ -8761,6 +8801,7 @@ /obj/item/folder/red{ layer = 2.9 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "awQ" = ( @@ -8779,6 +8820,7 @@ name = "Brig Desk"; req_access_txt = "1" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) "awR" = ( @@ -8806,7 +8848,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/maintenance/fore) +/area/crew_quarters/heads/captain) "awU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -8891,16 +8933,6 @@ dir = 4 }, /area/bridge) -"axf" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "bridgespace"; - name = "bridge external shutters" - }, -/turf/open/floor/plasteel/vault{ - dir = 8 - }, -/area/bridge) "axg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/dark, @@ -9040,7 +9072,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/security/brig) +/area/hallway/primary/fore) "axF" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-10" @@ -9225,10 +9257,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/bridge) "ayf" = ( -/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -9505,7 +9537,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "ayQ" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel, /area/hallway/primary/fore) "ayR" = ( @@ -9545,6 +9577,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "ayX" = ( @@ -10580,6 +10613,10 @@ /area/crew_quarters/heads/hop) "aBB" = ( /obj/machinery/computer/cargo/request, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "aBC" = ( @@ -12187,11 +12224,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aEY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aEZ" = ( /obj/structure/sink{ dir = 8; @@ -12654,7 +12686,6 @@ /area/storage/primary) "aGk" = ( /obj/machinery/vending/boozeomat{ - products = list(/obj/item/reagent_containers/food/drinks/bottle/rum = 1, /obj/item/reagent_containers/food/drinks/bottle/wine = 1, /obj/item/reagent_containers/food/drinks/ale = 1, /obj/item/reagent_containers/food/drinks/drinkingglass = 6, /obj/item/reagent_containers/food/drinks/ice = 1, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 4); req_access_txt = "20" }, /turf/open/floor/plasteel/vault{ @@ -14422,6 +14453,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/art) "aKM" = ( @@ -14460,6 +14492,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/auxiliary) "aKS" = ( @@ -14896,7 +14929,7 @@ }, /obj/structure/disposalpipe/trunk, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMh" = ( /obj/machinery/conveyor{ dir = 4; @@ -14904,7 +14937,7 @@ }, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMi" = ( /obj/machinery/conveyor{ dir = 4; @@ -14916,7 +14949,7 @@ supply_display = 1 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMj" = ( /obj/machinery/conveyor{ dir = 4; @@ -14930,7 +14963,7 @@ pixel_y = 32 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMk" = ( /obj/machinery/conveyor{ dir = 4; @@ -14941,14 +14974,14 @@ pixel_y = 32 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMl" = ( /obj/machinery/conveyor{ dir = 4; id = "packageSort2" }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMm" = ( /obj/machinery/conveyor{ dir = 4; @@ -14959,7 +14992,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMn" = ( /obj/machinery/disposal/deliveryChute{ dir = 8 @@ -14971,7 +15004,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aMo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14982,6 +15015,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMq" = ( @@ -14989,6 +15025,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMr" = ( @@ -14996,6 +15035,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMs" = ( @@ -15005,6 +15047,9 @@ /obj/structure/sign/poster/official/random{ pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMt" = ( @@ -15019,6 +15064,9 @@ c_tag = "Cargo Warehouse"; dir = 2 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMu" = ( @@ -15026,6 +15074,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMv" = ( @@ -15039,6 +15090,9 @@ pixel_x = 26 }, /obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aMw" = ( @@ -15537,20 +15591,20 @@ dir = 1 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNH" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNI" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNJ" = ( /obj/machinery/conveyor_switch/oneway{ id = "packageSort2" @@ -15559,7 +15613,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNK" = ( /obj/structure/table, /obj/item/device/destTagger, @@ -15567,7 +15621,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNL" = ( /obj/item/stack/wrapping_paper{ pixel_x = 3; @@ -15582,7 +15636,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNM" = ( /obj/item/storage/box, /obj/item/storage/box, @@ -15599,12 +15653,15 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aNN" = ( /obj/structure/closet/crate/freezer, /obj/structure/sign/poster/official/random{ pixel_x = -32 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aNO" = ( @@ -16055,14 +16112,14 @@ /turf/open/floor/plasteel/red/side{ dir = 8 }, -/area/quartermaster/office) +/area/quartermaster/sorting) "aOS" = ( /obj/structure/disposalpipe/segment{ dir = 5 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aOT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16076,7 +16133,7 @@ }, /obj/effect/landmark/start/cargo_technician, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aOV" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -16095,7 +16152,7 @@ }, /obj/machinery/light/small, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aOX" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -16107,10 +16164,13 @@ dir = 4 }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aOY" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aOZ" = ( @@ -16384,7 +16444,7 @@ /area/storage/eva) "aPM" = ( /obj/structure/table, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/darkblue/side{ dir = 10 @@ -16456,14 +16516,14 @@ "aPX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aPY" = ( /turf/open/floor/plasteel, /area/quartermaster/office) "aPZ" = ( /obj/machinery/holopad, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aQa" = ( /obj/structure/disposalpipe/sorting/wrap{ dir = 1 @@ -16472,7 +16532,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aQb" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -16484,8 +16544,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28 + }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aQc" = ( /obj/machinery/button/door{ id = "qm_warehouse"; @@ -16494,6 +16558,9 @@ req_access_txt = "31" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/floorgrime, /area/quartermaster/warehouse) "aQd" = ( @@ -16972,11 +17039,11 @@ /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRi" = ( /obj/structure/chair/stool, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRj" = ( /obj/structure/table/reinforced, /obj/item/folder/yellow, @@ -16985,15 +17052,23 @@ layer = 2.9 }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRk" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/power/apc/highcap/fifteen_k{ + dir = 4; + name = "Delivery Office APC"; + pixel_x = 28 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRm" = ( /obj/structure/closet/crate, /obj/item/reagent_containers/food/snacks/donut, @@ -17001,7 +17076,7 @@ /obj/item/reagent_containers/food/snacks/donut, /obj/item/reagent_containers/food/snacks/donut, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aRn" = ( /obj/machinery/door/poddoor/shutters{ id = "qm_warehouse"; @@ -17009,6 +17084,9 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "aRo" = ( @@ -17361,7 +17439,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aSf" = ( /obj/machinery/door/firedoor, /obj/structure/table/reinforced, @@ -17372,7 +17450,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aSg" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/mining/glass{ @@ -17380,13 +17458,17 @@ req_access_txt = "0"; req_one_access_txt = "48;50" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/quartermaster/office) +/area/quartermaster/sorting) "aSh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating, -/area/quartermaster/office) +/area/quartermaster/sorting) "aSi" = ( /obj/machinery/button/door{ id = "qm_warehouse"; @@ -17398,6 +17480,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aSj" = ( @@ -17776,6 +17861,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/quartermaster/office) "aTi" = ( @@ -17790,6 +17878,9 @@ departmentType = 2; pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aTj" = ( @@ -17802,6 +17893,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aTl" = ( @@ -18276,6 +18370,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aUp" = ( @@ -18771,6 +18866,7 @@ id = "cargodeliver" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) "aVt" = ( @@ -19911,9 +20007,7 @@ }, /area/crew_quarters/theatre) "aYn" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, +/obj/machinery/computer/cargo, /obj/machinery/requests_console{ department = "Cargo Bay"; departmentType = 2; @@ -20209,6 +20303,7 @@ pixel_x = 5; pixel_y = -2 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/darkred/side{ dir = 8 }, @@ -20630,6 +20725,10 @@ /obj/machinery/light{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -28 + }, /turf/open/floor/plasteel/green/side{ dir = 8 }, @@ -20703,6 +20802,7 @@ name = "kitchen shutters" }, /obj/item/storage/fancy/donut_box, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/darkred/side{ dir = 8 }, @@ -21156,6 +21256,7 @@ id = "kitchenshutters"; name = "kitchen shutters" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/darkred/side{ dir = 8 }, @@ -21301,6 +21402,7 @@ }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/brown, /area/quartermaster/qm) "bbH" = ( @@ -21975,8 +22077,7 @@ }, /area/maintenance/department/cargo) "bdA" = ( -/obj/item/cigbutt, -/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/droneDispenser, /turf/open/floor/plating, /area/maintenance/department/cargo) "bdB" = ( @@ -22693,10 +22794,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) -"bfq" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/crew_quarters/kitchen) "bfr" = ( /obj/structure/sign/barsign, /turf/closed/wall, @@ -24609,7 +24706,6 @@ /turf/open/floor/plating, /area/science/robotics/lab) "bkw" = ( -/obj/machinery/door/firedoor, /obj/structure/cable{ icon_state = "1-2" }, @@ -25144,7 +25240,7 @@ /area/science/server) "blP" = ( /obj/effect/landmark/event_spawn, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/machinery/light{ dir = 8 }, @@ -25715,7 +25811,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bnq" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, @@ -25894,7 +25990,7 @@ /turf/open/floor/plasteel, /area/science/research/lobby) "bnO" = ( -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /obj/machinery/light{ dir = 8 }, @@ -26516,12 +26612,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"bpp" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bpq" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, @@ -27522,6 +27612,9 @@ "bru" = ( /obj/item/storage/toolbox/mechanical, /obj/machinery/holopad, +/obj/machinery/light_switch{ + pixel_x = 25 + }, /turf/open/floor/plasteel/whitepurple/side{ dir = 1 }, @@ -28322,7 +28415,7 @@ /turf/open/floor/plasteel/white, /area/science/explab) "btj" = ( -/obj/machinery/droneDispenser, +/obj/structure/table, /turf/open/floor/plasteel/white, /area/science/explab) "btk" = ( @@ -28810,7 +28903,7 @@ /area/science/lab) "bur" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/rnd/protolathe/department/science, +/obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/plasteel, /area/science/lab) "bus" = ( @@ -28826,6 +28919,9 @@ dir = 4; pixel_x = 28 }, +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/lab) "but" = ( @@ -28859,6 +28955,7 @@ req_one_access_txt = "0" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/science/robotics/lab) "buw" = ( @@ -28869,14 +28966,14 @@ /turf/open/floor/plasteel/darkpurple/side{ dir = 8 }, -/area/science/server) +/area/science/research) "bux" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ icon_state = "1-2" }, /turf/open/floor/plasteel/dark, -/area/science/server) +/area/science/research) "buy" = ( /obj/item/twohanded/required/kirbyplants/photosynthetic{ pixel_y = 10 @@ -28885,7 +28982,7 @@ icon_state = "darkpurple"; dir = 4 }, -/area/science/server) +/area/science/research) "buz" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -29257,6 +29354,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bvr" = ( @@ -29307,7 +29405,7 @@ name = "Shutters Control Button"; pixel_x = -28; pixel_y = -7; - req_access_txt = "7; 29" + req_access_txt = "47" }, /turf/open/floor/plasteel/white, /area/science/lab) @@ -29328,7 +29426,7 @@ "bvy" = ( /obj/item/reagent_containers/glass/beaker/sulphuric, /obj/effect/turf_decal/delivery, -/obj/machinery/rnd/circuit_imprinter/department/science, +/obj/machinery/rnd/production/circuit_imprinter/department/science, /turf/open/floor/plasteel, /area/science/lab) "bvz" = ( @@ -29421,13 +29519,13 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, -/area/science/research/lobby) +/area/science/research) "bvH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/science/research/lobby) +/area/science/research) "bvI" = ( /obj/structure/closet/emcloset, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -30237,7 +30335,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, -/area/science/research/lobby) +/area/science/research) "bxq" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -30253,7 +30351,7 @@ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/science/research/lobby) +/area/science/research) "bxr" = ( /obj/structure/cable{ icon_state = "4-8" @@ -30830,6 +30928,10 @@ /area/crew_quarters/heads/cmo) "byv" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "cmoshutters"; + name = "Privacy shutters" + }, /turf/open/floor/plating, /area/crew_quarters/heads/cmo) "byw" = ( @@ -30949,13 +31051,25 @@ /turf/open/floor/plasteel/white, /area/science/lab) "byH" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel/white, +/obj/structure/table, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/scanning_module, +/obj/item/stock_parts/scanning_module, +/obj/item/device/multitool, +/turf/open/floor/plasteel/whitepurple/side, /area/science/lab) "byI" = ( -/obj/structure/chair/stool, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, +/turf/open/floor/plasteel/whitepurple/side, /area/science/lab) "byJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -31023,13 +31137,13 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, -/area/science/research/lobby) +/area/science/research) "byP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/science/research/lobby) +/area/science/research) "byQ" = ( /obj/structure/sink{ dir = 8; @@ -31652,6 +31766,13 @@ /obj/machinery/keycard_auth{ pixel_x = 26 }, +/obj/machinery/button/door{ + dir = 4; + id = "cmoshutters"; + name = "Privacy shutters"; + pixel_x = 38; + req_access_txt = "40" + }, /turf/open/floor/plasteel/cmo, /area/crew_quarters/heads/cmo) "bAe" = ( @@ -31755,63 +31876,65 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdprivacy"; + name = "Privacy shutters" + }, +/turf/open/floor/plasteel/darkpurple/side{ + icon_state = "darkpurple"; + dir = 9 + }, +/area/crew_quarters/heads/hor) "bAp" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/door/window{ - name = "Research Director's Office"; - req_access_txt = "30" - }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/obj/machinery/door/airlock/research{ + name = "Research Director's Office"; + req_access_txt = "30"; + req_one_access_txt = "0" + }, +/turf/open/floor/plasteel/darkpurple/side{ + dir = 1 + }, +/area/crew_quarters/heads/hor) "bAq" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/scanning_module, -/obj/item/stock_parts/scanning_module, -/obj/item/device/multitool, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdprivacy"; + name = "Privacy shutters" + }, +/turf/open/floor/plasteel/darkpurple/side{ + dir = 1 + }, +/area/crew_quarters/heads/hor) "bAr" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/plus, -/obj/item/stock_parts/cell/high/plus, -/obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdprivacy"; + name = "Privacy shutters" + }, +/turf/open/floor/plasteel/darkpurple/side{ + dir = 1 + }, +/area/crew_quarters/heads/hor) "bAs" = ( -/obj/structure/table, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/machinery/light_switch{ - pixel_x = 25 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdprivacy"; + name = "Privacy shutters" }, -/obj/machinery/light{ - dir = 4 +/turf/open/floor/plasteel/darkpurple/side{ + icon_state = "darkpurple"; + dir = 5 }, -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/whitepurple/side, -/area/science/lab) +/area/crew_quarters/heads/hor) "bAt" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -32169,8 +32292,7 @@ icon_state = "0-4" }, /turf/open/floor/plasteel/darkpurple/side{ - icon_state = "darkpurple"; - dir = 9 + dir = 8 }, /area/crew_quarters/heads/hor) "bBr" = ( @@ -32181,26 +32303,20 @@ dir = 5 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/darkpurple/side{ - dir = 1 - }, +/turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bBs" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/darkpurple/side{ - dir = 1 - }, +/turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bBt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/darkpurple/side{ - dir = 1 - }, +/turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hor) "bBu" = ( /obj/item/twohanded/required/kirbyplants/dead, @@ -32208,19 +32324,27 @@ dir = 10 }, /obj/machinery/button/door{ - id = "rndshutters"; - name = "Research Lockdown"; - pixel_x = 28; + desc = "A switch that controls privacy shutters."; + id = "rdprivacy"; + name = "Privacy Shutters"; + pixel_x = 40; pixel_y = -5; - req_access_txt = "47" + req_access_txt = "30" }, /obj/machinery/keycard_auth{ pixel_x = 28; pixel_y = 6 }, +/obj/machinery/button/door{ + id = "research_shutters_2"; + name = "Research Lockdown"; + pixel_x = 28; + pixel_y = -5; + req_access_txt = "47" + }, /turf/open/floor/plasteel/darkpurple/side{ icon_state = "darkpurple"; - dir = 5 + dir = 4 }, /area/crew_quarters/heads/hor) "bBv" = ( @@ -32228,6 +32352,9 @@ /area/crew_quarters/heads/hor) "bBw" = ( /obj/machinery/computer/security, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel/red/side{ dir = 8 }, @@ -32616,6 +32743,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/barber, /area/crew_quarters/heads/cmo) "bCr" = ( @@ -32770,6 +32898,10 @@ /obj/machinery/computer/robotics{ dir = 4 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, /turf/open/floor/plasteel/darkpurple/side{ dir = 8 }, @@ -32805,8 +32937,8 @@ "bCJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ - id = "research_shutters_2"; - name = "research shutters" + id = "rdprivacy"; + name = "Privacy shutters" }, /turf/open/floor/plating, /area/crew_quarters/heads/hor) @@ -33496,7 +33628,7 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -26 }, -/obj/machinery/rnd/protolathe/department/medical, +/obj/machinery/rnd/production/techfab/department/medical, /turf/open/floor/plasteel/whiteblue/side{ dir = 1 }, @@ -33625,6 +33757,10 @@ /obj/item/folder/blue, /obj/item/stamp/cmo, /obj/structure/table, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, /turf/open/floor/plasteel/cmo, /area/crew_quarters/heads/cmo) "bEH" = ( @@ -33657,8 +33793,7 @@ dir = 1 }, /obj/machinery/vending/wallmed{ - pixel_y = 28; - products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 1, /obj/item/reagent_containers/pill/patch/silver_sulf = 1, /obj/item/reagent_containers/spray/medical/sterilizer = 1) + pixel_y = 28 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/landmark/blobstart, @@ -34399,6 +34534,10 @@ dir = 8; network = list("ss13","rd") }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28 + }, /turf/open/floor/engine, /area/science/storage) "bGj" = ( @@ -35314,8 +35453,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/vending/wallmed{ - pixel_y = 28; - products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 1, /obj/item/reagent_containers/pill/patch/silver_sulf = 1, /obj/item/reagent_containers/spray/medical/sterilizer = 1) + pixel_y = 28 }, /turf/open/floor/plasteel/whiteblue/side{ dir = 1 @@ -35679,6 +35817,10 @@ /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 4 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, /turf/open/floor/plasteel/white, /area/medical/virology) "bJo" = ( @@ -35714,6 +35856,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/freezer, /area/medical/surgery) "bJr" = ( @@ -36187,8 +36330,7 @@ /area/medical/medbay/central) "bKw" = ( /obj/machinery/vending/wallmed{ - pixel_y = 28; - products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 1, /obj/item/reagent_containers/pill/patch/silver_sulf = 1, /obj/item/reagent_containers/spray/medical/sterilizer = 1) + pixel_y = 28 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -36228,7 +36370,7 @@ dir = 4 }, /obj/effect/landmark/event_spawn, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bKA" = ( @@ -36256,6 +36398,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, /turf/open/floor/plasteel/whiteblue/side{ dir = 8 }, @@ -36311,11 +36457,19 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/hallway/primary/aft) +"bKN" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "prison release"; + name = "prisoner processing blast door" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) "bKO" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/machinery/door/firedoor/heavy, /turf/open/floor/plasteel/dark, @@ -36324,7 +36478,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/machinery/door/firedoor/heavy, /obj/structure/disposalpipe/segment, @@ -38000,6 +38154,7 @@ }, /obj/item/stack/sheet/glass, /obj/item/stack/rods/fifty, +/obj/item/pipe_dispenser, /turf/open/floor/plasteel/yellow/side, /area/engine/atmos) "bOY" = ( @@ -38438,6 +38593,10 @@ dir = 4 }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "bQp" = ( @@ -38494,6 +38653,10 @@ pixel_y = 5 }, /obj/item/stock_parts/cell/high/plus, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, /turf/open/floor/plasteel/darkgreen, /area/storage/tech) "bQv" = ( @@ -38612,7 +38775,7 @@ }, /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -38943,7 +39106,7 @@ }, /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -39074,6 +39237,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bRI" = ( @@ -39102,6 +39266,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/storage/tech) "bRL" = ( @@ -39196,6 +39361,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/storage/tech) "bRV" = ( @@ -39248,6 +39414,11 @@ dir = 4; id = "atmosdeliver" }, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "atmospherics security door" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bSb" = ( @@ -39464,7 +39635,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/dark, /area/storage/tech) "bSG" = ( @@ -39580,7 +39751,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bSS" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel, /area/engine/atmos) "bST" = ( @@ -39910,11 +40081,11 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bTG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, -/area/engine/engineering) +/area/engine/break_room) "bTH" = ( /turf/open/floor/plasteel/yellow/side{ dir = 1 @@ -40101,6 +40272,7 @@ req_access_txt = "19;23" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/storage/tech) "bUh" = ( @@ -40139,16 +40311,19 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = 28 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + dir = 1; + name = "Engineering Foyer APC"; + pixel_y = 24 + }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bUm" = ( /obj/structure/cable{ icon_state = "1-2" @@ -40157,8 +40332,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bUn" = ( /obj/machinery/light{ dir = 1 @@ -40178,11 +40356,11 @@ dir = 5 }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bUo" = ( /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/machinery/door/firedoor/heavy, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -40190,7 +40368,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/atmos) "bUp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 6 @@ -40488,12 +40666,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bVa" = ( /obj/structure/cable{ icon_state = "1-2" @@ -40509,7 +40687,7 @@ dir = 4 }, /turf/open/floor/goonplaque, -/area/engine/engineering) +/area/engine/break_room) "bVb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40521,11 +40699,11 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bVc" = ( /obj/machinery/door/poddoor/preopen{ id = "atmos"; - name = "Atmospherics Blast Door" + name = "atmospherics security door" }, /obj/machinery/door/firedoor/heavy, /obj/structure/disposalpipe/segment{ @@ -40536,9 +40714,8 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/atmos) "bVd" = ( -/obj/machinery/door/firedoor/heavy, /obj/machinery/door/airlock/atmos{ name = "Atmospherics"; req_access_txt = "24" @@ -40786,9 +40963,6 @@ /obj/structure/table/reinforced, /obj/item/clipboard, /obj/item/lighter, -/obj/item/clothing/glasses/meson{ - pixel_y = 4 - }, /obj/item/stamp/ce, /obj/item/stock_parts/cell/high/plus, /obj/machinery/keycard_auth{ @@ -40803,6 +40977,7 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel/yellow/side{ dir = 4 }, @@ -40922,7 +41097,7 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bVT" = ( /obj/structure/cable{ icon_state = "1-2" @@ -40933,7 +41108,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bVU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -40941,8 +41116,18 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/firealarm{ + dir = 1; + pixel_x = 27; + pixel_y = -39 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_x = 27; + pixel_y = -25 + }, /turf/open/floor/plasteel, -/area/engine/engineering) +/area/engine/break_room) "bVV" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 0; @@ -41266,6 +41451,10 @@ }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, /turf/open/floor/plasteel, /area/engine/engineering) "bWF" = ( @@ -41299,7 +41488,7 @@ dir = 9 }, /turf/closed/wall, -/area/engine/engineering) +/area/engine/break_room) "bWI" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, @@ -42706,10 +42895,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/item/airlock_painter, -/obj/item/clothing/glasses/meson{ - pixel_x = 3; - pixel_y = -4 - }, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cap" = ( @@ -43044,11 +43230,11 @@ "cbe" = ( /obj/item/pen, /obj/item/storage/belt/utility, -/obj/item/clothing/glasses/meson, /obj/item/paper_bin{ layer = 2.9 }, /obj/structure/table/glass, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cbf" = ( @@ -43135,7 +43321,7 @@ /obj/structure/table, /obj/item/clothing/gloves/color/yellow, /obj/item/storage/belt/utility, -/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/engineering) "cbo" = ( @@ -43584,6 +43770,9 @@ /obj/item/stack/sheet/mineral/plasma{ amount = 30 }, +/obj/item/device/gps{ + gpstag = "ENG0" + }, /turf/open/floor/plating, /area/engine/engineering) "ccS" = ( @@ -44985,9 +45174,6 @@ icon_state = "0-8" }, /obj/machinery/power/tesla_coil, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, /turf/open/floor/plating/airless, /area/engine/engineering) "chz" = ( @@ -44995,9 +45181,6 @@ icon_state = "0-4" }, /obj/machinery/power/tesla_coil, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, /turf/open/floor/plating/airless, /area/engine/engineering) "chA" = ( @@ -45105,16 +45288,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/engine/engineering) -"chQ" = ( -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) "chR" = ( /obj/structure/cable{ icon_state = "2-4" @@ -45268,14 +45441,13 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "cit" = ( -/obj/machinery/the_singularitygen, +/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "ciu" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/the_singularitygen/tesla, /turf/open/floor/plating/airless, /area/space/nearstation) "civ" = ( @@ -45582,7 +45754,7 @@ pixel_y = 26 }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cjQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, @@ -45592,8 +45764,11 @@ icon_state = "1-4" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/carpet, -/area/library) +/area/library/lounge) "cjT" = ( /obj/structure/grille, /obj/structure/cable{ @@ -45710,7 +45885,7 @@ }, /obj/machinery/photocopier, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/carpet, @@ -45725,7 +45900,7 @@ icon_state = "cobweb2" }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckq" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -45812,8 +45987,12 @@ /area/maintenance/department/chapel/monastery) "ckD" = ( /obj/structure/chair/wood/normal, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -28 + }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckE" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -45830,14 +46009,17 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/carpet, -/area/library) +/area/library/lounge) "ckG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckH" = ( /turf/open/floor/plasteel/dark, /area/library) @@ -45846,7 +46028,7 @@ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckJ" = ( /obj/structure/sign/warning/securearea, /turf/closed/wall/r_wall, @@ -45855,7 +46037,7 @@ /turf/closed/mineral/random/low_chance, /area/asteroid/nearstation/bomb_site) "ckL" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plating/airless, /area/asteroid/nearstation/bomb_site) "ckM" = ( @@ -45905,22 +46087,23 @@ network = list("ss13","monastery") }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckT" = ( /obj/machinery/door/airlock/centcom{ name = "Library" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckU" = ( /obj/machinery/bookbinder, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckV" = ( /obj/structure/bookcase/random/reference, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "ckW" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/plasteel/dark, @@ -45928,7 +46111,7 @@ "ckX" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "clb" = ( /obj/machinery/door/poddoor{ id = "chapelgun"; @@ -45963,7 +46146,7 @@ dir = 1 }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cli" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -45982,15 +46165,15 @@ }, /obj/machinery/libraryscanner, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "clm" = ( /obj/structure/closet/crate/bin, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cln" = ( /obj/structure/bookcase/random/adult, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "clp" = ( /obj/structure/table/wood, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -46004,7 +46187,7 @@ /obj/machinery/camera{ c_tag = "Telecomms External Fore"; dir = 1; - network = list("SS13", "tcomm"); + network = list("SS13","tcomm"); start_active = 1 }, /turf/open/space, @@ -46133,7 +46316,7 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel, /area/tcommsat/computer) "clS" = ( @@ -47002,7 +47185,7 @@ /turf/open/floor/plasteel/neutral/corner, /area/hallway/secondary/exit/departure_lounge) "coT" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "coV" = ( @@ -47156,7 +47339,7 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "cpt" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/vault{ dir = 5 }, @@ -48821,7 +49004,7 @@ /area/maintenance/department/chapel/monastery) "cwe" = ( /turf/closed/wall/mineral/iron, -/area/library) +/area/library/lounge) "cwg" = ( /obj/machinery/door/airlock/centcom{ name = "Library" @@ -48830,8 +49013,9 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cwj" = ( /obj/item/storage/box/matches{ pixel_x = -3; @@ -48913,14 +49097,14 @@ }, /obj/machinery/power/apc{ dir = 4; - name = "Library APC"; + name = "Library Lounge APC"; pixel_x = 24 }, /obj/machinery/airalarm{ pixel_y = 22 }, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cww" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/grown/poppy, @@ -48992,7 +49176,7 @@ dir = 8 }, /turf/open/floor/carpet, -/area/library) +/area/library/lounge) "cwM" = ( /obj/structure/window/reinforced{ dir = 4; @@ -49019,13 +49203,16 @@ /obj/structure/table/wood, /obj/machinery/computer/libraryconsole, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cxe" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/carpet, -/area/library) +/area/library/lounge) "cxg" = ( /obj/structure/window/reinforced{ dir = 1; @@ -49062,21 +49249,25 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, -/area/library) +/area/library/lounge) "cxz" = ( /obj/machinery/door/airlock/centcom{ name = "Library" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, -/area/library) +/area/library/lounge) "cxB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/closed/wall, -/area/library) +/area/library/lounge) "cxC" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -49087,7 +49278,7 @@ /turf/open/floor/plasteel/vault{ dir = 4 }, -/area/library) +/area/library/lounge) "cxD" = ( /obj/effect/turf_decal/stripes/corner{ dir = 2 @@ -49095,21 +49286,24 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/vault{ dir = 1 }, -/area/library) +/area/library/lounge) "cxE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, /turf/closed/wall, -/area/library) +/area/library/lounge) "cxJ" = ( /obj/structure/window/reinforced/fulltile, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/library) +/area/library/lounge) "cxK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49120,20 +49314,23 @@ /turf/open/floor/plasteel/vault{ dir = 4 }, -/area/library) +/area/library/lounge) "cxL" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/vault{ dir = 1 }, -/area/library) +/area/library/lounge) "cxM" = ( /obj/structure/window/reinforced/fulltile, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/library) +/area/library/lounge) "cxX" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49146,7 +49343,7 @@ /turf/open/floor/plasteel/vault{ dir = 4 }, -/area/library) +/area/library/lounge) "cxY" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -49154,10 +49351,13 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/vault{ dir = 1 }, -/area/library) +/area/library/lounge) "cyl" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49165,22 +49365,37 @@ /turf/open/floor/plasteel/vault{ dir = 4 }, -/area/library) +/area/library/lounge) "cym" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/vault{ dir = 1 }, -/area/library) +/area/library/lounge) +"cyr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, +/turf/open/floor/plasteel/red/side{ + dir = 1 + }, +/area/security/brig) "cyy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, /turf/closed/wall, -/area/library) +/area/library/lounge) "cyz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -49191,7 +49406,7 @@ /turf/open/floor/plasteel/vault{ dir = 4 }, -/area/library) +/area/library/lounge) "cyA" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -49199,16 +49414,19 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/vault{ dir = 1 }, -/area/library) +/area/library/lounge) "cyB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, /turf/closed/wall, -/area/library) +/area/library/lounge) "cyL" = ( /obj/structure/lattice, /obj/structure/lattice, @@ -49234,6 +49452,10 @@ dir = 2; network = list("ss13","monastery") }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 29 + }, /turf/open/floor/plasteel/dark, /area/library) "cyR" = ( @@ -49606,7 +49828,6 @@ /area/maintenance/department/engine) "cBk" = ( /obj/machinery/vending/boozeomat{ - products = list(/obj/item/reagent_containers/food/drinks/bottle/whiskey = 1, /obj/item/reagent_containers/food/drinks/bottle/absinthe = 1, /obj/item/reagent_containers/food/drinks/bottle/limejuice = 1, /obj/item/reagent_containers/food/drinks/bottle/cream = 1, /obj/item/reagent_containers/food/drinks/soda_cans/tonic = 1, /obj/item/reagent_containers/food/drinks/drinkingglass = 10, /obj/item/reagent_containers/food/drinks/ice = 3, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 6, /obj/item/reagent_containers/food/drinks/flask = 1); req_access_txt = "0" }, /turf/closed/wall, @@ -49763,33 +49984,12 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "cBP" = ( -/obj/machinery/smoke_machine, /turf/open/floor/plasteel/white, /area/medical/chemistry) "cBQ" = ( -/obj/machinery/power/rad_collector/anchored, +/obj/machinery/power/rad_collector, /turf/open/floor/plating, /area/engine/engineering) -"cBR" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cBS" = ( -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) "cBT" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating/airless, @@ -49813,7 +50013,7 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "cCD" = ( -/obj/machinery/rnd/protolathe/department/service, +/obj/machinery/rnd/production/techfab/department/service, /turf/open/floor/plating, /area/crew_quarters/kitchen) "cCF" = ( @@ -49862,19 +50062,19 @@ /turf/open/floor/plating/airless, /area/maintenance/department/chapel/monastery) "cCS" = ( -/obj/machinery/rnd/protolathe/department/security, +/obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/plasteel/dark, /area/security/main) "cCT" = ( -/obj/machinery/rnd/protolathe/department/cargo, +/obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/plasteel, /area/quartermaster/storage) "cCU" = ( -/obj/machinery/rnd/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter, /turf/open/floor/plasteel, /area/engine/engineering) "cCV" = ( -/obj/machinery/rnd/protolathe/department/engineering, +/obj/machinery/rnd/production/protolathe/department/engineering, /turf/open/floor/plasteel, /area/engine/engineering) "cCW" = ( @@ -49912,26 +50112,81 @@ "cDa" = ( /turf/closed/wall, /area/quartermaster/warehouse) -"cDX" = ( +"dTw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/carpet, +/area/library) +"ecV" = ( +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"eHp" = ( +/turf/closed/wall, +/area/crew_quarters/cryopod) +"eIE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"eJt" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/darkpurple, +/area/crew_quarters/cryopod) +"fic" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ icon_state = "0-2" }, /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"gfg" = ( +"fki" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"frt" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"fyh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel/darkpurple, -/area/crew_quarters/cryopod) -"gHc" = ( -/turf/open/floor/plasteel/darkpurple, -/area/crew_quarters/cryopod) -"gOG" = ( -/obj/machinery/cryopod, -/turf/open/floor/plasteel/darkpurple, -/area/crew_quarters/cryopod) +/turf/open/floor/carpet, +/area/library) +"fID" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"gFV" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"izp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "Engineering"; + name = "engineering security door" + }, +/turf/open/floor/plating, +/area/security/checkpoint/engineering) "izB" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod" @@ -49941,6 +50196,22 @@ }, /turf/open/floor/plating, /area/crew_quarters/dorms) +"iCc" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"iVb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "jgr" = ( /obj/machinery/door/airlock/centcom{ name = "Library" @@ -49949,8 +50220,27 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) +"jZg" = ( +/obj/machinery/cryopod, +/turf/open/floor/plasteel/darkpurple, +/area/crew_quarters/cryopod) +"kdc" = ( +/obj/machinery/cryopod, +/obj/machinery/light/small/built{ + dir = 4 + }, +/turf/open/floor/plasteel/darkpurple, +/area/crew_quarters/cryopod) +"khx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/stairs, +/area/crew_quarters/cryopod) "kjK" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "MiniSat Maintenance"; @@ -49964,53 +50254,94 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAP) -"kls" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/cryopod{ - tag = "icon-cryopod-open (EAST)"; - icon_state = "cryopod-open"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/prison) -"kFZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"kqj" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/quartermaster/storage) +"krG" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/library) +"let" = ( +/turf/closed/wall/r_wall, +/area/space) "lqy" = ( /obj/machinery/door/airlock/centcom{ name = "Library" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"lvl" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/cigbutt, +/turf/open/floor/plating, +/area/maintenance/department/cargo) +"mHo" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = 27 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"mLe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel/darkred/side{ + dir = 1 + }, +/area/crew_quarters/heads/hos) +"nuB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/library/lounge) +"nJY" = ( +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/plating, +/area/maintenance/department/cargo) +"opC" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/power/apc{ + dir = 4; + name = "Library APC"; + pixel_x = 24 + }, +/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/library) -"mTb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"oig" = ( -/obj/machinery/cryopod, -/obj/machinery/light/small/built{ - dir = 4 - }, -/turf/open/floor/plasteel/darkpurple, -/area/crew_quarters/cryopod) +"oJF" = ( +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/plasteel/dark, +/area/library/lounge) "oPy" = ( /obj/machinery/door/airlock/external{ name = "Mining Dock Airlock"; @@ -50031,7 +50362,36 @@ }, /turf/open/floor/plating, /area/chapel/dock) -"pCj" = ( +"pps" = ( +/turf/closed/wall, +/area/engine/break_room) +"qWK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"sHK" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"sQt" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"tap" = ( /obj/machinery/power/apc{ areastring = "/area/medical/cryo"; dir = 1; @@ -50043,31 +50403,42 @@ }, /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"sQt" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock"; - req_access_txt = "31" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +"tez" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/library/lounge) +"tjW" = ( +/obj/machinery/light{ dir = 8 }, -/turf/open/floor/plating, -/area/quartermaster/storage) -"tBM" = ( +/obj/machinery/cryopod{ + tag = "icon-cryopod-open (EAST)"; + icon_state = "cryopod-open"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"ufi" = ( +/turf/open/floor/plasteel/dark, +/area/library/lounge) +"urZ" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/open/floor/plasteel/stairs, -/area/crew_quarters/cryopod) -"tWw" = ( -/obj/machinery/computer/cryopod{ - pixel_y = 24 +/turf/open/floor/plasteel/dark, +/area/library) +"uyt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vpU" = ( /turf/open/floor/plasteel/darkpurple, /area/crew_quarters/cryopod) -"vvr" = ( -/turf/closed/wall, -/area/crew_quarters/cryopod) "vzz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -50086,8 +50457,38 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/library) +"vTA" = ( +/obj/machinery/door/poddoor/preopen{ + id = "bridgespace"; + name = "bridge external shutters" + }, +/turf/open/floor/plasteel/vault{ + dir = 8 + }, +/area/bridge) +"xzr" = ( +/turf/closed/wall, +/area/quartermaster/sorting) +"yhZ" = ( +/obj/structure/table, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/turf/open/floor/plasteel/whitepurple/side, +/area/science/lab) +"yia" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) (1,1,1) = {" aaa @@ -67753,13 +68154,13 @@ cgG cfn ckE ckT -cjQ -cjQ +tez +tez cwK -cjQ -cjQ +tez +tez cxn -cjQ +tez lqy cxC cxK @@ -68011,12 +68412,12 @@ cvw cvK cwg cjR -ckm +nuB ckF -ckm +nuB cxe -ckm -ckm +nuB +nuB cxz cxD cxL @@ -68024,8 +68425,8 @@ cxY cym cyA vOw -ckm -ckm +fyh +dTw ckm ckm ckm @@ -68271,7 +68672,7 @@ cwr clm ckG cwU -cli +eIE ckU cwe cwe @@ -68282,7 +68683,7 @@ cxM cyB cjp cyR -ckH +urZ ckH ckH ckH @@ -68525,10 +68926,10 @@ cvy cvL cwe cwe -cko -ckH +sHK +ufi ckV -ckH +ufi cln cwe cfN @@ -68539,7 +68940,7 @@ aaa aaa cjp cyS -ckH +urZ cyZ ckH czo @@ -68782,10 +69183,10 @@ cvc cvM cfm cwe -cko -ckH -ckW -ckH +sHK +ufi +oJF +ufi cln cwe caS @@ -68796,7 +69197,7 @@ aht aht cjp cko -ckH +urZ ckH ckH clp @@ -69053,7 +69454,7 @@ aaa aaa cjp cyT -ckH +urZ cyZ ckH czp @@ -69310,8 +69711,8 @@ aht aht cjp cjp -ckH -ckI +krG +opC ckH czq czw @@ -69682,7 +70083,7 @@ aem aem aeT afn -kls +tjW afZ agn agy @@ -69962,7 +70363,7 @@ apE apE ari apE -atu +bBW apE avq apE @@ -70217,9 +70618,9 @@ aok aoO apF apE -aqC +bKN apE -atu +bBW ajM avr awH @@ -73557,7 +73958,7 @@ anJ amX aoY apN -aqp +cyr arp asB atB @@ -76894,7 +77295,7 @@ akW alK amw ani -anT +mLe aiR aph ajM @@ -78803,8 +79204,8 @@ bXk bXk bXk bXk -aaa -aaa +bXk +let aaa aaa aaa @@ -79059,9 +79460,9 @@ chR cgt cjT ckq +ckq bXk -aaa -aaa +let aaa aaa aaa @@ -79316,9 +79717,9 @@ chS cfV cgS cfV +cfV bXk -aaa -aaa +let aaa aaa aaa @@ -79501,7 +79902,7 @@ aRN aWa aRN aRN -bce +mHo aYS cpn bch @@ -79572,10 +79973,10 @@ cfV cfV cfV cgT +cfV ckr bXk -aaa -aaa +let aaa aaa aaa @@ -79822,17 +80223,17 @@ cfU cgu cgU chw -cBR -chw -chw +cgU chw +cgU chw +cgU cjs cfV cfV -bTE -aaa -aaa +cfV +bXk +let aaa aaa aaa @@ -80079,17 +80480,17 @@ cfV cgv cfV chx -chQ +cfV chx -chQ +cfV chx -chQ +cfV chx cfV cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -80278,7 +80679,7 @@ baa baa baa beu -bfq +bgk bgn aJI aDZ @@ -80337,16 +80738,16 @@ cgv cgV bBW bBW -aaa cgV +aht aaa bBW bBW cgV cfV -bTE -abI -abI +cfV +bXk +let aaa aaa aaa @@ -80594,16 +80995,16 @@ cgv bBW bBW bBW -aaa +yia abI aaa bBW bBW bBW cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -80858,9 +81259,9 @@ aaa bBW bBW cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -81112,12 +81513,12 @@ cii cis ciG aaa -aaa -aaa +yia +cgV cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -81362,7 +81763,7 @@ cfd cfw cfW cgw -cgV +aht abI abI cij @@ -81370,11 +81771,11 @@ cit ciH abI abI -cgV +aht cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -81619,8 +82020,8 @@ cfe cfx cfa cgv -aaa -aaa +cgV +yia aaa cik ciu @@ -81629,9 +82030,9 @@ aaa aaa aaa cfV -bTE -aaa -aaa +cfV +bXk +let aaa aaa aaa @@ -81886,9 +82287,9 @@ aaa bBW bBW cfV -bTE -aaa -aaa +cfV +bXk +let aaa aaa aaa @@ -82138,14 +82539,14 @@ bBW aaa aaa abI -aaa +yia aaa bBW bBW cfV -bTE -aaa -aaa +cfV +bXk +let aaa aaa aaa @@ -82376,7 +82777,7 @@ bUi bUV bVO bWA -bTC +izp bYj bYQ bZA @@ -82394,15 +82795,15 @@ cgV bBW aaa aaa +aht cgV -aaa bBW bBW cgV cfV -bTE -abI -aaa +cfV +bXk +let aaa aaa aaa @@ -82633,7 +83034,7 @@ bUj bUW bVP bWB -bTC +izp bYk bYQ bZA @@ -82649,17 +83050,17 @@ cfV cgv cfV chz -cBS +cfV chz -cBS +cfV chz -cBS +cfV chz cfV cfV -bTE -abI -abI +cfV +bXk +let abI abI aaa @@ -82815,9 +83216,9 @@ ahi atY auU atY -axf +vTA ayf -axf +vTA aAF aBz aCP @@ -82890,7 +83291,7 @@ bUk bUX bVQ bWC -bTC +izp bYl bYO bZC @@ -82906,17 +83307,17 @@ cfU cgx cgU chA +cgU chA +cgU chA -chA -chA -chA +cgU cjt cfV cfV -bTE -abI -aaa +cfV +bXk +let abI aaa aaa @@ -83170,10 +83571,10 @@ cfV cfV cfV cgY +cfV cks bXk -abI -aaa +let aaa aaa aaa @@ -83399,7 +83800,7 @@ bOL bRp bRY bSM -bTE +pps bUl bUZ bVS @@ -83428,9 +83829,9 @@ chO cfV cgZ cfV +cfV bXk -abI -abI +let abI aaa aaa @@ -83685,9 +84086,9 @@ chP cgt cjU ckq +ckq bXk -abI -aaa +let aaa aaa aaa @@ -83913,7 +84314,7 @@ bmC bRo bmC bQD -bTE +pps bUn bVb bVU @@ -83942,9 +84343,9 @@ bXk bXk bXk bXk +bXk ckJ -abI -aaa +let aaa aaa aaa @@ -84664,7 +85065,7 @@ bsT bus bvz bxg -byH +yhZ bAs bBu bCI @@ -86677,12 +87078,12 @@ aaa aaa aaa aaa -vvr -pCj -gfg -tBM -kFZ -aIU +eHp +tap +aau +khx +iVb +qWK aJI aLe aMe @@ -86701,7 +87102,7 @@ aVu bat aLf bcy -aKq +lvl aEj aEj bgC @@ -86934,11 +87335,11 @@ aaa aaa aaa aaa -vvr -tWw -gHc -cDX -mTb +eHp +eJt +vpU +fic +uyt aIU aJH aLe @@ -87191,20 +87592,20 @@ apX aBL aBL apX -vvr -oig -gOG -vvr +eHp +kdc +jZg +eHp aHN aIU aJI -aLf -aLf +xzr +xzr aNG aOR -aPW -aLf -aLf +iCc +xzr +xzr aTb aOT aVp @@ -87215,7 +87616,7 @@ aPY bav aLf aFi -aFi +nJY beI bfv bgE @@ -87455,7 +87856,7 @@ aET aHN aIU aJI -aLf +xzr aMg aNH aOS @@ -87712,11 +88113,11 @@ aET aHN aJh bhe -aLf +xzr aMh aNI -aOT -aPY +fID +ecV aRi aSf aTd @@ -87969,13 +88370,13 @@ aHn aIi aJi aKe -aLf +xzr aMi aNJ -aOT +fID aPZ aRj -aLf +xzr aTe aUo aVs @@ -88226,13 +88627,13 @@ aET aHN aIU aJI -aLf +xzr aMj aNK -aOT -aPY -aPY -aPW +fID +ecV +ecV +iCc aTf aUp aVt @@ -88483,7 +88884,7 @@ aET aHN aIU aJI -aLf +xzr aMk aNL aOU @@ -88740,10 +89141,10 @@ cos coy aJj aJI -aLf +xzr aMl aNM -aOV +fki aQb aRl aSh @@ -88997,14 +89398,14 @@ aDZ aDZ aJk aJH -aLf +xzr aMm -aLf +xzr aOW -aLf -aLf -aLf -aSY +xzr +xzr +xzr +frt aUs aLf aLf @@ -89247,18 +89648,18 @@ aAP avk aDg aEc -aEY +aGW cot aBI aBI aBI aJl aKf -aLf +xzr aMn -aLf +xzr aOX -aLf +xzr aRm aLg aTi @@ -89518,7 +89919,7 @@ cDa cDa cDa aLg -aTj +kqj aUu aVx aVx @@ -92881,7 +93282,7 @@ bkE aht bnd boh -bpp +gFV bqx brQ btr diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 284898d6d9..f57bfbbb54 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -8,7 +8,7 @@ /area/space/nearstation) "ac" = ( /turf/open/space, -/area/space) +/area/space/nearstation) "ad" = ( /turf/closed/wall/r_wall, /area/maintenance/department/bridge) @@ -85,6 +85,9 @@ icon_state = "2-8" }, /obj/machinery/camera/autoname, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plating, /area/engine/engineering) "ar" = ( @@ -176,13 +179,13 @@ /turf/open/space, /area/space/nearstation) "aC" = ( -/obj/machinery/door/airlock, /obj/structure/cable{ icon_state = "4-8" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, /area/engine/engineering) "aD" = ( @@ -294,7 +297,8 @@ /obj/item/device/flashlight{ pixel_y = 5 }, -/obj/item/airlock_painter, +/obj/item/storage/toolbox/syndicate, +/obj/item/stock_parts/cell/infinite, /turf/open/floor/plating, /area/engine/engineering) "aT" = ( @@ -387,6 +391,7 @@ "bd" = ( /obj/structure/table, /obj/item/weldingtool/experimental, +/obj/item/inducer, /turf/open/floor/plating, /area/engine/engineering) "be" = ( @@ -396,7 +401,7 @@ /turf/open/floor/plating, /area/engine/engineering) "bf" = ( -/obj/structure/closet/secure_closet/engineering_chief, +/obj/machinery/suit_storage_unit/captain, /turf/open/floor/plating, /area/engine/engineering) "bg" = ( @@ -466,14 +471,14 @@ /area/engine/engineering) "bp" = ( /obj/machinery/light, -/obj/item/storage/box/lights/mixed, -/obj/item/device/lightreplacer, +/obj/structure/tank_dispenser, /turf/open/floor/plating, /area/engine/engineering) "bq" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/light, /turf/open/floor/plasteel, /area/engine/gravity_generator) "br" = ( @@ -514,7 +519,7 @@ /area/engine/engineering) "by" = ( /turf/closed/wall/r_wall, -/area/hallway/secondary/entry) +/area/medical/medbay) "bz" = ( /obj/machinery/light{ dir = 8 @@ -523,7 +528,7 @@ /area/maintenance/department/bridge) "bA" = ( /turf/closed/wall/r_wall, -/area/hallway/primary/central) +/area/science) "bB" = ( /obj/machinery/power/apc{ dir = 8; @@ -538,28 +543,32 @@ locked = 0; pixel_y = 23 }, -/obj/structure/closet/jcloset, +/obj/machinery/autolathe/hacked, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "bC" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "bD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, +/obj/machinery/robotic_fabricator, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "bE" = ( /turf/open/floor/plasteel, /area/hallway/primary/central) "bF" = ( -/obj/structure/closet/secure_closet/CMO, +/obj/machinery/computer/rdconsole/core, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "bG" = ( /obj/machinery/airalarm{ frequency = 1439; @@ -578,12 +587,6 @@ dir = 8 }, /area/bridge) -"bH" = ( -/obj/structure/table, -/obj/item/ammo_box/c10mm, -/obj/item/gun/ballistic, -/turf/open/floor/plasteel, -/area/bridge) "bI" = ( /obj/structure/table, /turf/open/floor/plasteel, @@ -624,26 +627,36 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bP" = ( -/obj/machinery/vending/cigarette, +/obj/item/storage/box/beakers, +/obj/item/storage/box/syringes, +/obj/structure/table, +/obj/item/reagent_containers/glass/beaker/bluespace, +/obj/item/reagent_containers/glass/beaker/bluespace, +/obj/item/reagent_containers/syringe, +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, /turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/area/medical/chemistry) "bQ" = ( -/obj/machinery/vending/coffee, +/obj/machinery/chem_master, /turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/area/medical/chemistry) "bR" = ( -/obj/machinery/vending/cola, /obj/machinery/camera/autoname, +/obj/machinery/chem_heater, /turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/area/medical/chemistry) "bS" = ( -/obj/machinery/vending/snack, +/obj/machinery/chem_dispenser, /turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/area/medical/chemistry) "bT" = ( -/obj/machinery/computer/arcade, +/obj/machinery/chem_dispenser/scp_294, /turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/area/medical/chemistry) "bU" = ( /obj/machinery/airalarm{ frequency = 1439; @@ -657,33 +670,33 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/structure/closet/firecloset/full, +/mob/living/carbon/human, /turf/open/floor/plasteel/arrival{ dir = 9 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "bV" = ( /obj/machinery/light{ dir = 1 }, -/obj/structure/closet/emcloset, +/mob/living/carbon/human, /turf/open/floor/plasteel/arrival{ dir = 1 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "bW" = ( -/obj/structure/closet/secure_closet/hos, /obj/machinery/camera/autoname, +/mob/living/carbon/human, /turf/open/floor/plasteel/arrival{ dir = 1 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "bX" = ( -/obj/structure/closet/emcloset, +/obj/machinery/sleeper, /turf/open/floor/plasteel/arrival{ dir = 1 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "bY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -700,25 +713,25 @@ icon_state = "2-4" }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "cb" = ( /obj/structure/cable{ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "cc" = ( /obj/structure/cable{ icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "cd" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/door/airlock, /turf/open/floor/plating, /area/bridge) "ce" = ( @@ -747,13 +760,13 @@ }, /area/bridge) "ch" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ icon_state = "4-8" }, /obj/structure/cable{ icon_state = "2-4" }, +/obj/machinery/door/airlock, /turf/open/floor/plating, /area/bridge) "ci" = ( @@ -761,8 +774,11 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/medical/chemistry) "cj" = ( /obj/structure/cable{ icon_state = "4-8" @@ -771,13 +787,14 @@ icon_state = "1-8" }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/medical/chemistry) "ck" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/closed/wall/r_wall, -/area/hallway/secondary/entry) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/medbay) "cl" = ( /obj/structure/cable{ icon_state = "1-8" @@ -785,23 +802,25 @@ /turf/open/floor/plasteel/arrival{ dir = 8 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "cm" = ( /turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/area/medical/medbay) "cn" = ( /obj/machinery/door/airlock, /turf/open/floor/plating, -/area/hallway/secondary/entry) +/area/medical/medbay) "co" = ( /obj/machinery/light{ dir = 4 }, +/obj/structure/closet/syndicate/resources/everything, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/science) "cp" = ( /obj/machinery/light, /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/closet/secure_closet/engineering_chief, /turf/open/floor/plasteel/blue/side{ dir = 10 }, @@ -811,6 +830,7 @@ /area/bridge) "cr" = ( /obj/machinery/light, +/obj/structure/closet/secure_closet/hos, /turf/open/floor/plasteel/blue/side{ dir = 6 }, @@ -827,12 +847,12 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/medical/chemistry) "cu" = ( /turf/open/floor/plasteel/arrival{ dir = 8 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "cv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -844,16 +864,16 @@ "cx" = ( /obj/machinery/door/airlock/public/glass, /turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/area/medical/medbay) "cy" = ( /obj/effect/turf_decal/loading_area{ dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/area/medical/medbay) "cz" = ( /turf/open/floor/plating, -/area/hallway/secondary/entry) +/area/medical/medbay) "cA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -893,23 +913,19 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/blue/corner{ - dir = 1 - }, -/area/hallway/primary/central) +/turf/closed/wall/r_wall, +/area/medical/chemistry) "cF" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/medical/chemistry) "cG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/hallway/secondary/entry) +/area/medical/medbay) "cH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -917,43 +933,26 @@ /turf/open/floor/plasteel/arrival{ dir = 8 }, -/area/hallway/secondary/entry) -"cI" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/plasteel/arrival{ - dir = 8 - }, -/area/hallway/secondary/entry) +/area/medical/medbay) "cJ" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, +/obj/item/gun/magic/staff/healing, +/obj/item/gun/magic/wand/resurrection, /turf/open/floor/plasteel/arrival{ dir = 10 }, -/area/hallway/secondary/entry) +/area/medical/medbay) "cK" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/obj/machinery/light, +/obj/machinery/dna_scannernew, /turf/open/floor/plasteel/arrival, -/area/hallway/secondary/entry) +/area/medical/medbay) "cL" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, +/obj/machinery/computer/cloning, /turf/open/floor/plasteel/arrival, -/area/hallway/secondary/entry) +/area/medical/medbay) "cM" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/obj/item/storage/firstaid/regular, -/obj/item/device/healthanalyzer, +/obj/machinery/clonepod, /turf/open/floor/plasteel/arrival, -/area/hallway/secondary/entry) +/area/medical/medbay) "cN" = ( /turf/closed/wall/r_wall, /area/construction) @@ -1267,29 +1266,14 @@ "dO" = ( /obj/structure/table, /obj/machinery/light, -/obj/item/twohanded/fireaxe, -/obj/item/extinguisher, -/turf/open/floor/plasteel, -/area/storage/primary) -"dP" = ( -/obj/structure/table, -/obj/item/device/lightreplacer, +/obj/item/storage/firstaid, /turf/open/floor/plasteel, /area/storage/primary) "dQ" = ( /obj/structure/table, -/obj/item/storage/box/lights/mixed, -/obj/item/storage/box/lights/tubes, /obj/machinery/light, /turf/open/floor/plasteel, /area/storage/primary) -"dR" = ( -/obj/structure/table, -/obj/item/device/flashlight{ - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/storage/primary) "dS" = ( /obj/machinery/atmospherics/components/unary/tank/air, /obj/machinery/camera/autoname, @@ -1342,32 +1326,228 @@ /obj/machinery/camera/autoname{ dir = 1 }, +/obj/item/gun/magic/wand/resurrection, /turf/open/floor/plasteel, /area/storage/primary) -"pI" = ( +"ei" = ( +/obj/machinery/light, +/obj/machinery/computer/operating, +/turf/open/floor/plasteel, +/area/maintenance/department/bridge) +"fT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/science) +"gd" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science) +"gY" = ( +/turf/open/floor/plasteel, +/area/science) +"hD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/power/apc{ + dir = 1; + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"jb" = ( /obj/machinery/door/airlock, +/turf/open/floor/plasteel, +/area/science) +"jU" = ( +/obj/structure/table, +/obj/item/melee/transforming/energy/axe, +/turf/open/floor/plasteel, +/area/storage/primary) +"kk" = ( +/obj/structure/table/optable, +/turf/open/floor/plasteel, +/area/maintenance/department/bridge) +"kn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"kQ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + dir = 1; + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lK" = ( +/obj/effect/landmark/observer_start, +/turf/open/floor/plating, +/area/storage/primary) +"ny" = ( +/obj/structure/table, +/obj/item/storage/toolbox/syndicate, +/turf/open/floor/plasteel, +/area/storage/primary) +"oV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"pA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/science) +"pI" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, -/area/hallway/secondary/entry) -"Qt" = ( +/area/medical/medbay) +"pQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"vv" = ( /obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/storage/primary) +"vP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"wb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/blue/side{ + dir = 1 + }, +/area/hallway/primary/central) +"wS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"wT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"BB" = ( +/obj/item/storage/backpack/duffelbag/syndie/surgery, +/obj/structure/table, +/obj/item/disk/surgery/debug, +/turf/open/floor/plasteel, +/area/medical/medbay) +"BD" = ( +/obj/structure/closet/secure_closet/CMO, +/turf/open/floor/plasteel/blue/side, +/area/bridge) +"BG" = ( +/obj/structure/table, +/obj/item/ammo_box/c10mm, +/obj/item/gun/ballistic/automatic/pistol, +/turf/open/floor/plasteel, +/area/bridge) +"Ce" = ( +/turf/open/floor/plasteel, +/area/medical/chemistry) +"Ct" = ( +/obj/item/disk/tech_disk/debug, +/turf/open/floor/plasteel, +/area/science) +"CV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"If" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science) +"In" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/science) +"Iy" = ( +/obj/structure/closet/secure_closet/RD, +/turf/open/floor/plasteel/blue/side, +/area/bridge) +"JE" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/hallway/primary/central) +"NZ" = ( +/obj/machinery/rnd/production/protolathe, +/turf/open/floor/plasteel, +/area/science) +"Qt" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, -/area/hallway/secondary/entry) +/area/medical/medbay) +"Ut" = ( +/obj/structure/closet/secure_closet/medical3, +/turf/open/floor/plasteel, +/area/medical/medbay) +"Vg" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "WT" = ( -/obj/machinery/door/airlock, /obj/structure/cable{ icon_state = "4-8" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, /area/engine/engineering) +"Xg" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) (1,1,1) = {" aa @@ -2038,12 +2218,12 @@ ah ah ah bA -bZ -bZ -bZ -bZ -bZ +gd +gd bA +bZ +bZ +JE cN cN cN @@ -2093,9 +2273,9 @@ bj bs bB ca -bO -bO -bO +If +In +kn bO bO cO @@ -2147,9 +2327,9 @@ bk bt bC cb -bN -bN -bC +fT +pA +kQ bN bN cP @@ -2201,8 +2381,8 @@ bl ah bD cc -bE -bE +gY +jb cA bE bE @@ -2253,10 +2433,10 @@ aO bc bm ah -bE +NZ cc -bE -bE +Ct +gd cA bE bE @@ -2310,8 +2490,8 @@ ah bF cc co -bE -cA +bA +wS bE bE cN @@ -2353,7 +2533,7 @@ aa ab ac ad -ad +bY ah ah ah @@ -2437,7 +2617,7 @@ dn dZ cN af -ad +bY ac ab aa @@ -2469,7 +2649,7 @@ aQ ai ab bv -bH +bI cf cq bv @@ -2491,7 +2671,7 @@ dn dL cN af -ad +bY ac ab aa @@ -2523,9 +2703,9 @@ aR ai ab bv -bI +BG cf -cq +BD bu dU bE @@ -2545,7 +2725,7 @@ dn dL cN af -ad +bY ac ab aa @@ -2599,7 +2779,7 @@ dn dL cN af -ad +bY ac ab aa @@ -2633,7 +2813,7 @@ ac bv bK cf -cq +Iy bu cD bE @@ -2653,7 +2833,7 @@ dn dL cN af -ad +bY ac ab aa @@ -2707,7 +2887,7 @@ do dM cN af -ad +bY ac ab aa @@ -2743,7 +2923,7 @@ bM cg cr bu -cD +wb bE bE cS @@ -2761,7 +2941,7 @@ cS cS cS af -ad +bY ac ab aa @@ -2785,7 +2965,7 @@ aa ab ac ad -ad +bY aj aj WT @@ -2815,7 +2995,7 @@ dp dl cS af -ad +bY ac ab aa @@ -2847,10 +3027,10 @@ aS bd bo bw -bN +hD ci ct -bN +wT cF bN bN @@ -2869,7 +3049,7 @@ dl dl cS af -ad +bY ac ab aa @@ -2901,11 +3081,11 @@ aT be be bx -bO +CV cj -bE -bE -cA +Ce +Ce +oV bE bE cS @@ -2923,7 +3103,7 @@ dc dc cS af -ad +bY ac ab aa @@ -2956,10 +3136,10 @@ bf bp aj bP -cc -bE -bE -cA +pQ +Ce +Ce +oV bE bE cS @@ -2974,10 +3154,10 @@ dB dl dE dJ -dN +ny cS af -ad +bY ac ab aa @@ -3010,12 +3190,12 @@ ak ak ak bQ -cc -bE -bE -cA -bE +pQ +Ce +Ce +vP bE +Vg cS de dr @@ -3031,7 +3211,7 @@ dJ dO cS af -ad +bY ac ab aa @@ -3064,10 +3244,10 @@ bg bq ak bR -cc -bE -bE -cA +pQ +Ce +Ce +oV bE bE cV @@ -3082,10 +3262,10 @@ dB dl dE dJ -dN +jU cS af -ad +bY ac ab aa @@ -3118,17 +3298,17 @@ bh br ak bS -cc -bE -bE -cA +pQ +Ce +Ce +oV bE bE cV dg dt dB -dl +lK dE dH dI @@ -3172,10 +3352,10 @@ aI aI ak bT -cc -co -bE -cA +pQ +Xg +Ce +oV bE bE cV @@ -3190,7 +3370,7 @@ dB dl dE dJ -dP +dN cS af ad @@ -3230,7 +3410,7 @@ ck by cx cG -by +cx by by di @@ -3284,7 +3464,7 @@ cl cu cu cH -cI +cu cJ by dj @@ -3298,7 +3478,7 @@ dB dl dE dJ -dR +dN cS af ad @@ -3445,7 +3625,7 @@ bX cm cm cy -cm +Ut cm cM by @@ -3500,8 +3680,8 @@ cn by Qt by -cn -by +cm +BB by cS cS @@ -3509,7 +3689,7 @@ cS cS cS cS -cS +vv cS cS cS @@ -3554,9 +3734,9 @@ af by cz by -af -af -af +kk +ei +ad af af af diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 81f933cbcb..b4c6433add 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -8538,7 +8538,8 @@ dwidth = 3; name = "steel rain"; port_direction = 4; - preferred_direction = 4 + preferred_direction = 4; + timid = 0 }, /turf/open/floor/plating, /area/shuttle/assault_pod) diff --git a/cfg/admin.txt b/cfg/admin.txt index 8b13789179..e69de29bb2 100644 --- a/cfg/admin.txt +++ b/cfg/admin.txt @@ -1 +0,0 @@ - diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 87552e5841..bb07582dae 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -44,20 +44,6 @@ //Mutations that cant be taken from genetics and are not in SE #define NON_SCANNABLE -1 - // Extra powers: -#define LASER 9 // harm intent - click anywhere to shoot lasers from eyes -#define HEAL 10 // healing people with hands -#define SHADOW 11 // shadow teleportation (create in/out portals anywhere) (25%) -#define SCREAM 12 // supersonic screaming (25%) -#define EXPLOSIVE 13 // exploding on-demand (15%) -#define REGENERATION 14 // superhuman regeneration (30%) -#define REPROCESSOR 15 // eat anything (50%) -#define SHAPESHIFTING 16 // take on the appearance of anything (40%) -#define PHASING 17 // ability to phase through walls (40%) -#define SHIELD 18 // shielding from all projectile attacks (30%) -#define SHOCKWAVE 19 // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%) -#define ELECTRICITY 20 // ability to shoot electric attacks (15%) - //DNA - Because fuck you and your magic numbers being all over the codebase. #define DNA_BLOCK_SIZE 3 @@ -81,7 +67,6 @@ #define TR_KEEPIMPLANTS 16 #define TR_KEEPSE 32 // changelings shouldn't edit the DNA's SE when turning into a monkey #define TR_DEFAULTMSG 64 -#define TR_KEEPSRC 128 #define TR_KEEPORGANS 256 @@ -94,36 +79,21 @@ #define FACEHAIR 3 #define EYECOLOR 4 #define LIPS 5 -#define RESISTHOT 6 -#define RESISTCOLD 7 -#define RESISTPRESSURE 8 -#define RADIMMUNE 9 -#define NOBREATH 10 -#define NOGUNS 11 -#define NOBLOOD 12 -#define NOFIRE 13 -#define VIRUSIMMUNE 14 -#define PIERCEIMMUNE 15 -#define NOTRANSSTING 16 -#define MUTCOLORS_PARTSONLY 17 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. -#define NODISMEMBER 18 -#define NOHUNGER 19 -#define NOCRITDAMAGE 20 -#define NOZOMBIE 21 -#define EASYDISMEMBER 22 -#define EASYLIMBATTACHMENT 23 -#define TOXINLOVER 24 -#define DIGITIGRADE 25 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi) -#define NO_UNDERWEAR 26 -#define NOLIVER 27 -#define NOSTOMACH 28 -#define NO_DNA_COPY 29 -#define DRINKSBLOOD 30 -#define SPECIES_ORGANIC 31 -#define SPECIES_INORGANIC 32 -#define SPECIES_UNDEAD 33 -#define SPECIES_ROBOTIC 34 -#define NOEYES 35 +#define NOBLOOD 6 +#define NOTRANSSTING 7 +#define MUTCOLORS_PARTSONLY 8 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. +#define NOZOMBIE 9 +#define DIGITIGRADE 10 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi) +#define NO_UNDERWEAR 11 +#define NOLIVER 12 +#define NOSTOMACH 13 +#define NO_DNA_COPY 14 +#define DRINKSBLOOD 15 +#define SPECIES_ORGANIC 16 +#define SPECIES_INORGANIC 17 +#define SPECIES_UNDEAD 18 +#define SPECIES_ROBOTIC 19 +#define NOEYES 20 #define ORGAN_SLOT_BRAIN "brain" #define ORGAN_SLOT_APPENDIX "appendix" diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 62d4b94528..b5bbcd341e 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -34,15 +34,10 @@ #define R_SOUNDS 0x800 #define R_SPAWN 0x1000 #define R_AUTOLOGIN 0x2000 +#define R_DBRANKS 0x4000 #define R_DEFAULT R_AUTOLOGIN -#if DM_VERSION > 512 -#error Remove the flag below , its been long enough -#endif -//legacy , remove post 512, it was replaced by R_POLL -#define R_REJUVINATE 2 - #define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated. #define ADMIN_QUE(user) "(?)" diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 73f2661ed5..bc95a9ddff 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -28,7 +28,6 @@ #define CELL_VOLUME 2500 //liters in a cell #define BREATH_VOLUME 0.5 //liters in a normal breath #define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile -#define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16) //Amount of air needed before pass out/suffocation commences //EXCITED GROUPS #define EXCITED_GROUP_BREAKDOWN_CYCLES 4 //number of FULL air controller ticks before an excited group breaks down (averages gas contents across turfs) @@ -46,10 +45,7 @@ //HEAT TRANSFER COEFFICIENTS //Must be between 0 and 1. Values closer to 1 equalize temperature faster //Should not exceed 0.4 else strange heat flow occur -#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4 #define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 -#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0 -#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 //a hack to partly simulate radiative heat #define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 #define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now #define HEAT_CAPACITY_VACUUM 7000 //a hack to help make vacuums "cold", sacrificing realism for gameplay @@ -59,8 +55,6 @@ #define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C #define FIRE_SPREAD_RADIOSITY_SCALE 0.85 #define FIRE_GROWTH_RATE 40000 //For small fires -#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage -#define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage #define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C //GASES @@ -74,11 +68,6 @@ #define REACTING 1 #define STOP_REACTIONS 2 -//HUMANS -//Hurty numbers -#define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin -#define AIR_DAMAGE_MODIFIER 1.025 //More means less damage from hot air scalding lungs, less = more damage //CITADEL EDIT 1.025 - // Pressure limits. #define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant) #define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE) @@ -123,7 +112,7 @@ #define SHOES_MAX_TEMP_PROTECT 1500 //For gloves #define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE -#define MAX_HIGH_PRESSURE_DAMAGE 16 // CITADEL CHANGES Max to 16, low to 8. +#define MAX_HIGH_PRESSURE_DAMAGE 16 // CITADEL CHANGES Max to 16, low to 8. #define LOW_PRESSURE_DAMAGE 8 //The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). #define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this @@ -196,4 +185,3 @@ GLOBAL_LIST_INIT(pipe_paint_colors, list( "Violet" = rgb(64,0,128), "Yellow" = rgb(255,198,0) )) - diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 017a3f8bfe..393ffce4fd 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -19,8 +19,9 @@ #define DIAG_AIRLOCK_HUD "15"//Airlock shock overlay #define DIAG_PATH_HUD "16"//Bot path indicators #define GLAND_HUD "17"//Gland indicators for abductors +#define SENTIENT_DISEASE_HUD "18" //for antag huds. these are used at the /mob level -#define ANTAG_HUD "18" +#define ANTAG_HUD "19" //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior @@ -35,23 +36,27 @@ #define DATA_HUD_DIAGNOSTIC_BASIC 5 #define DATA_HUD_DIAGNOSTIC_ADVANCED 6 #define DATA_HUD_ABDUCTOR 7 +#define DATA_HUD_SENTIENT_DISEASE 8 + //antag HUD defines -#define ANTAG_HUD_CULT 8 -#define ANTAG_HUD_REV 9 -#define ANTAG_HUD_OPS 10 -#define ANTAG_HUD_WIZ 11 -#define ANTAG_HUD_SHADOW 12 -#define ANTAG_HUD_TRAITOR 13 -#define ANTAG_HUD_NINJA 14 -#define ANTAG_HUD_CHANGELING 15 -#define ANTAG_HUD_ABDUCTOR 16 -#define ANTAG_HUD_DEVIL 17 -#define ANTAG_HUD_SINTOUCHED 18 -#define ANTAG_HUD_SOULLESS 19 -#define ANTAG_HUD_CLOCKWORK 20 -#define ANTAG_HUD_BROTHER 21 +#define ANTAG_HUD_CULT 9 +#define ANTAG_HUD_REV 10 +#define ANTAG_HUD_OPS 11 +#define ANTAG_HUD_WIZ 12 +#define ANTAG_HUD_SHADOW 13 +#define ANTAG_HUD_TRAITOR 14 +#define ANTAG_HUD_NINJA 15 +#define ANTAG_HUD_CHANGELING 16 +#define ANTAG_HUD_ABDUCTOR 17 +#define ANTAG_HUD_DEVIL 18 +#define ANTAG_HUD_SINTOUCHED 19 +#define ANTAG_HUD_SOULLESS 20 +#define ANTAG_HUD_CLOCKWORK 21 +#define ANTAG_HUD_BROTHER 22 // Notification action types #define NOTIFY_JUMP "jump" #define NOTIFY_ATTACK "attack" #define NOTIFY_ORBIT "orbit" + +#define ADD_HUD_TO_COOLDOWN 20 //cooldown for being shown the images for any particular data hud diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 1516be9fa3..99b15362c8 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -2,8 +2,16 @@ //Be sure to update the min/max of these if you do change them. //Measurements are in imperial units. Inches, feet, yards, miles. Tsp, tbsp, cups, quarts, gallons, etc -//arousal HUD location -#define ui_arousal "EAST-1:28,CENTER-3:11"//Below the health doll +//HUD stuff +#define ui_arousal "EAST-1:28,CENTER-4:8"//Below the health doll +#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button +#define ui_overridden_resist "EAST-3:24,SOUTH+1:7" +#define ui_combat_toggle "EAST-4:22,SOUTH:5" + +//1:1 HUD layout stuff +#define ui_boxcraft "EAST-4:22,SOUTH+1:6" +#define ui_boxarea "EAST-4:6,SOUTH+1:6" +#define ui_boxlang "EAST-5:22,SOUTH+1:6" //organ defines @@ -100,4 +108,10 @@ //Brainslugs #define isborer(A) (istype(A, /mob/living/simple_animal/borer)) -#define CITADEL_MENTOR_OOC_COLOUR "#ad396e" \ No newline at end of file +#define CITADEL_MENTOR_OOC_COLOUR "#ad396e" + +//stamina stuff +#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement +#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit +#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations +#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT diff --git a/code/__DEFINES/cleaning.dm b/code/__DEFINES/cleaning.dm index eed0ee5f54..c4db590e90 100644 --- a/code/__DEFINES/cleaning.dm +++ b/code/__DEFINES/cleaning.dm @@ -1,5 +1,5 @@ //Cleaning tool strength -#define CLEAN_VERY_WEAK 1 // What are you scrubbing the ground with a toothpick? +// 1 is also a valid cleaning strength but completely unused so left undefined #define CLEAN_WEAK 2 #define CLEAN_MEDIUM 3 // Acceptable tools #define CLEAN_STRONG 4 // Industrial strength diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index 9f23ba2d38..070b92acc7 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -64,8 +64,6 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define GATEWAY_RATVAR_ARRIVAL 600 //when progress is at or above this, game over ratvar's here everybody go home -#define ARK_SUMMON_COST 5 //how many of each component an Ark costs to summon - //Objective text define #define CLOCKCULT_OBJECTIVE "Construct the Ark of the Clockwork Justicar and free Ratvar." diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 10d4182b28..824f5b3e61 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -3,26 +3,26 @@ #define COLOR_INPUT_DISABLED "#F0F0F0" #define COLOR_INPUT_ENABLED "#D3B5B5" -#define COLOR_WHITE "#EEEEEE" -#define COLOR_SILVER "#C0C0C0" -#define COLOR_GRAY "#808080" +//#define COLOR_WHITE "#EEEEEE" +//#define COLOR_SILVER "#C0C0C0" +//#define COLOR_GRAY "#808080" #define COLOR_FLOORTILE_GRAY "#8D8B8B" #define COLOR_ALMOST_BLACK "#333333" -#define COLOR_BLACK "#000000" +//#define COLOR_BLACK "#000000" #define COLOR_RED "#FF0000" -#define COLOR_RED_LIGHT "#FF3333" -#define COLOR_MAROON "#800000" +//#define COLOR_RED_LIGHT "#FF3333" +//#define COLOR_MAROON "#800000" #define COLOR_YELLOW "#FFFF00" -#define COLOR_OLIVE "#808000" -#define COLOR_LIME "#32CD32" +//#define COLOR_OLIVE "#808000" +//#define COLOR_LIME "#32CD32" #define COLOR_GREEN "#008000" #define COLOR_CYAN "#00FFFF" -#define COLOR_TEAL "#008080" +//#define COLOR_TEAL "#008080" #define COLOR_BLUE "#0000FF" -#define COLOR_BLUE_LIGHT "#33CCFF" -#define COLOR_NAVY "#000080" +//#define COLOR_BLUE_LIGHT "#33CCFF" +//#define COLOR_NAVY "#000080" #define COLOR_PINK "#FFC0CB" -#define COLOR_MAGENTA "#FF00FF" +//#define COLOR_MAGENTA "#FF00FF" #define COLOR_PURPLE "#800080" #define COLOR_ORANGE "#FF9900" #define COLOR_BEIGE "#CEB689" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 8e791cfffd..b67c084e10 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -110,11 +110,7 @@ #define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) #define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) -//Gun Stuff -#define SAWN_INTACT 0 -#define SAWN_OFF 1 //Gun weapon weight -#define WEAPON_DUAL_WIELD 0 #define WEAPON_LIGHT 1 #define WEAPON_MEDIUM 2 #define WEAPON_HEAVY 3 diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 40701947b9..5b4ff7e378 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -31,7 +31,6 @@ //Positions for overrides list #define EXAMINE_POSITION_ARTICLE 1 #define EXAMINE_POSITION_BEFORE 2 - #define EXAMINE_POSITION_NAME 3 //End positions #define COMPONENT_EXNAME_CHANGED 1 #define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (/atom/movable, /atom) diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 8d77c39740..e03db1964d 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -37,12 +37,6 @@ #define FAILED_UNFASTEN 1 #define SUCCESSFUL_UNFASTEN 2 -//disposal unit mode defines, which do double time as the construction defines -#define PRESSURE_OFF 0 -#define PRESSURE_ON 1 -#define PRESSURE_MAXED 2 -#define SCREWS_OUT -1 - //ai core defines #define EMPTY_CORE 0 #define CIRCUIT_CORE 1 @@ -51,11 +45,6 @@ #define GLASS_CORE 4 #define AI_READY_CORE 5 -//field generator construction defines -#define FG_UNSECURED 0 -#define FG_SECURED 1 -#define FG_WELDED 2 - //emitter construction defines #define EM_UNSECURED 0 #define EM_SECURED 1 diff --git a/code/__DEFINES/diseases.dm b/code/__DEFINES/diseases.dm index 58d8066e9c..9f96d0374f 100644 --- a/code/__DEFINES/diseases.dm +++ b/code/__DEFINES/diseases.dm @@ -1,3 +1,7 @@ + +#define DISEASE_LIMIT 1 +#define VIRUS_SYMPTOM_LIMIT 6 + //Visibility Flags #define HIDDEN_SCANNER 1 #define HIDDEN_PANDEMIC 2 @@ -8,19 +12,18 @@ #define CAN_RESIST 4 //Spread Flags -#define VIRUS_SPREAD_SPECIAL 1 -#define VIRUS_SPREAD_NON_CONTAGIOUS 2 -#define VIRUS_SPREAD_BLOOD 4 -#define VIRUS_SPREAD_CONTACT_FLUIDS 8 -#define VIRUS_SPREAD_CONTACT_SKIN 16 -#define VIRUS_SPREAD_AIRBORNE 32 - +#define DISEASE_SPREAD_SPECIAL 1 +#define DISEASE_SPREAD_NON_CONTAGIOUS 2 +#define DISEASE_SPREAD_BLOOD 4 +#define DISEASE_SPREAD_CONTACT_FLUIDS 8 +#define DISEASE_SPREAD_CONTACT_SKIN 16 +#define DISEASE_SPREAD_AIRBORNE 32 //Severity Defines -#define VIRUS_SEVERITY_POSITIVE "Positive" //Diseases that buff, heal, or at least do nothing at all -#define VIRUS_SEVERITY_NONTHREAT "Harmless" //Diseases that may have annoying effects, but nothing disruptive (sneezing) -#define VIRUS_SEVERITY_MINOR "Minor" //Diseases that can annoy in concrete ways (dizziness) -#define VIRUS_SEVERITY_MEDIUM "Medium" //Diseases that can do minor harm, or severe annoyance (vomit) -#define VIRUS_SEVERITY_HARMFUL "Harmful" //Diseases that can do significant harm, or severe disruption (brainrot) -#define VIRUS_SEVERITY_DANGEROUS "Dangerous" //Diseases that can kill or maim if left untreated (flesh eating, blindness) -#define VIRUS_SEVERITY_BIOHAZARD "BIOHAZARD" //Diseases that can quickly kill an unprepared victim (fungal tb, gbs) +#define DISEASE_SEVERITY_POSITIVE "Positive" //Diseases that buff, heal, or at least do nothing at all +#define DISEASE_SEVERITY_NONTHREAT "Harmless" //Diseases that may have annoying effects, but nothing disruptive (sneezing) +#define DISEASE_SEVERITY_MINOR "Minor" //Diseases that can annoy in concrete ways (dizziness) +#define DISEASE_SEVERITY_MEDIUM "Medium" //Diseases that can do minor harm, or severe annoyance (vomit) +#define DISEASE_SEVERITY_HARMFUL "Harmful" //Diseases that can do significant harm, or severe disruption (brainrot) +#define DISEASE_SEVERITY_DANGEROUS "Dangerous" //Diseases that can kill or maim if left untreated (flesh eating, blindness) +#define DISEASE_SEVERITY_BIOHAZARD "BIOHAZARD" //Diseases that can quickly kill an unprepared victim (fungal tb, gbs) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index d2c88a0c1b..814120c229 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -26,7 +26,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define ON_BORDER_1 512 // item has priority to check when entering or leaving #define NOSLIP_1 1024 //prevents from slipping on wet floors, in space etc -#define _UNUSED_1 2048 // BLOCK_GAS_SMOKE_EFFECT_1 only used in masks at the moment. #define BLOCK_GAS_SMOKE_EFFECT_1 4096 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! @@ -84,7 +83,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 //Movement Types -#define IMMOBILE 0 #define GROUND 1 #define FLYING 2 diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index d2de6f9100..dc3647e1f1 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -118,22 +118,6 @@ #define NECK 2048 #define FULL_BODY 4095 -// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. -// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection() -// The values here should add up to 1. -// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30% -#define THERMAL_PROTECTION_HEAD 0.3 -#define THERMAL_PROTECTION_CHEST 0.15 -#define THERMAL_PROTECTION_GROIN 0.15 -#define THERMAL_PROTECTION_LEG_LEFT 0.075 -#define THERMAL_PROTECTION_LEG_RIGHT 0.075 -#define THERMAL_PROTECTION_FOOT_LEFT 0.025 -#define THERMAL_PROTECTION_FOOT_RIGHT 0.025 -#define THERMAL_PROTECTION_ARM_LEFT 0.075 -#define THERMAL_PROTECTION_ARM_RIGHT 0.075 -#define THERMAL_PROTECTION_HAND_LEFT 0.025 -#define THERMAL_PROTECTION_HAND_RIGHT 0.025 - //flags for female outfits: How much the game can safely "take off" the uniform without it looking weird #define NO_FEMALE_UNIFORM 0 #define FEMALE_UNIFORM_FULL 1 diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 9a43607709..b1a065822d 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -1,7 +1,5 @@ // simple is_type and similar inline helpers -#define isdatum(D) (istype(D, /datum)) - #define islist(L) (istype(L, /list)) #if DM_VERSION >= 512 @@ -64,7 +62,6 @@ #define isjellyperson(A) (is_species(A, /datum/species/jelly)) #define isslimeperson(A) (is_species(A, /datum/species/jelly/slime)) #define isluminescent(A) (is_species(A, /datum/species/jelly/luminescent)) -#define isshadowperson(A) (is_species(A, /datum/species/shadow)) #define iszombie(A) (is_species(A, /datum/species/zombie)) #define ishumanbasic(A) (is_species(A, /datum/species/human)) @@ -106,8 +103,6 @@ #define isbot(A) (istype(A, /mob/living/simple_animal/bot)) -#define iscrab(A) (istype(A, /mob/living/simple_animal/crab)) - #define isshade(A) (istype(A, /mob/living/simple_animal/shade)) #define ismouse(A) (istype(A, /mob/living/simple_animal/mouse)) @@ -118,16 +113,10 @@ #define iscat(A) (istype(A, /mob/living/simple_animal/pet/cat)) -#define isdog(A) (istype(A, /mob/living/simple_animal/pet/dog)) - #define iscorgi(A) (istype(A, /mob/living/simple_animal/pet/dog/corgi)) #define ishostile(A) (istype(A, /mob/living/simple_animal/hostile)) -#define isbear(A) (istype(A, /mob/living/simple_animal/hostile/bear)) - -#define iscarp(A) (istype(A, /mob/living/simple_animal/hostile/carp)) - #define isswarmer(A) (istype(A, /mob/living/simple_animal/hostile/swarmer)) #define isguardian(A) (istype(A, /mob/living/simple_animal/hostile/guardian)) @@ -183,14 +172,10 @@ GLOBAL_LIST_INIT(pointed_types, typecacheof(list( #define isigniter(O) (istype(O, /obj/item/device/assembly/igniter)) -#define isinfared(O) (istype(O, /obj/item/device/assembly/infra)) - #define isprox(O) (istype(O, /obj/item/device/assembly/prox_sensor)) #define issignaler(O) (istype(O, /obj/item/device/assembly/signaler)) -#define istimer(O) (istype(O, /obj/item/device/assembly/timer)) - GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( /obj/item/stack/sheet/glass, /obj/item/stack/sheet/rglass, @@ -201,4 +186,4 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define is_glass_sheet(O) (is_type_in_typecache(O, GLOB.glass_sheet_types)) -#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) \ No newline at end of file +#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 9bf44a7fbd..9350116635 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -9,7 +9,6 @@ #define GAME_PLANE -1 #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals #define SPACE_LAYER 1.8 -#define ABOVE_SPACE_LAYER 1.9 //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define #define MID_TURF_LAYER 2.02 #define HIGH_TURF_LAYER 2.03 @@ -82,6 +81,9 @@ #define ABOVE_LIGHTING_PLANE 16 #define ABOVE_LIGHTING_LAYER 16 +#define BYOND_LIGHTING_PLANE 17 +#define BYOND_LIGHTING_LAYER 17 + //HUD layer defines #define FULLSCREEN_PLANE 18 diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 819abd032f..b7cc207735 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -23,27 +23,6 @@ 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 //Some defines to generalise colours used in lighting. //Important note on colors. Colors can end up significantly different from the basic html picture, especially when saturated @@ -73,6 +52,7 @@ #define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow. #define LIGHTING_PLANE_ALPHA_VISIBLE 255 +#define LIGHTING_PLANE_ALPHA_NV_TRAIT 245 #define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192 #define LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE 128 //For lighting alpha, small amounts lead to big changes. even at 128 its hard to figure out what is dark and what is light, at 64 you almost can't even tell. #define LIGHTING_PLANE_ALPHA_INVISIBLE 0 @@ -89,4 +69,4 @@ #define LIGHTING_NO_UPDATE 0 #define LIGHTING_VIS_UPDATE 1 #define LIGHTING_CHECK_UPDATE 2 -#define LIGHTING_FORCE_UPDATE 3 \ No newline at end of file +#define LIGHTING_FORCE_UPDATE 3 diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 4665bd3b1e..ad9fcdb2dd 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -85,6 +85,3 @@ #define SUPERMATTER_DANGER 4 // Integrity < 50% #define SUPERMATTER_EMERGENCY 5 // Integrity < 25% #define SUPERMATTER_DELAMINATING 6 // Pretty obvious. - -//R&D Snowflakes -#define RD_CONSOLE_LOCKED_SCREEN 0.2 diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index c83851fd5f..1ece51d49a 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -26,7 +26,6 @@ require only minor tweaks. #define MAP_REMOVE_JOB(jobpath) /datum/job/##jobpath/map_check() { return (SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) && ..() } #define SPACERUIN_MAP_EDGE_PAD 15 -#define ZLEVEL_SPACE_RUIN_COUNT 7 // traits // boolean - marks a level as having that property if present diff --git a/code/__DEFINES/medal.dm b/code/__DEFINES/medal.dm index 5781e14f57..b5ff8eac20 100644 --- a/code/__DEFINES/medal.dm +++ b/code/__DEFINES/medal.dm @@ -10,7 +10,6 @@ #define BOSS_MEDAL_DRAKE "Drake" #define BOSS_MEDAL_HIEROPHANT "Hierophant" #define BOSS_MEDAL_LEGION "Legion" -#define BOSS_MEDAL_SWARMER "Swarmer Beacon" #define BOSS_MEDAL_TENDRIL "Tendril" // Score names diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index bee1e19a5b..199535a04e 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -20,8 +20,8 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define THIS_PROC_TYPE_STR "[THIS_PROC_TYPE]" //Because you can only obtain a string of THIS_PROC_TYPE using "[]", and it's nice to just +/+= strings #define THIS_PROC_TYPE_STR_WITH_ARGS "[THIS_PROC_TYPE]([args.Join(",")])" #define THIS_PROC_TYPE_WEIRD ...... //This one is WEIRD, in some cases (When used in certain defines? (eg: ASSERT)) THIS_PROC_TYPE will fail to work, but THIS_PROC_TYPE_WEIRD will work instead -#define THIS_PROC_TYPE_WEIRD_STR "[THIS_PROC_TYPE_WEIRD]" //Included for completeness -#define THIS_PROC_TYPE_WEIRD_STR_WITH_ARGS "[THIS_PROC_TYPE_WEIRD]([args.Join(",")])" //Ditto +//define THIS_PROC_TYPE_WEIRD_STR "[THIS_PROC_TYPE_WEIRD]" //Included for completeness +//define THIS_PROC_TYPE_WEIRD_STR_WITH_ARGS "[THIS_PROC_TYPE_WEIRD]([args.Join(",")])" //Ditto #define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day @@ -46,7 +46,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define HALLOWEEN "Halloween" #define CHRISTMAS "Christmas" #define FESTIVE_SEASON "Festive Season" -#define FRIDAY_13TH "Friday the 13th" //Human Overlays Indexes///////// //LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS @@ -86,58 +85,11 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" //IT DOESN'T OK, IT MEANS "UNDER" -#define UNDER_BODY_BEHIND_LAYER BODY_BEHIND_LAYER+1 -#define UNDER_BODY_LAYER BODY_LAYER+1 -#define UNDER_BODY_ADJ_LAYER BODY_ADJ_LAYER+1 -#define UNDER_MUTATIONS_LAYER MUTATIONS_LAYER+1 -#define UNDER_BODYPARTS_LAYER BODYPARTS_LAYER+1 -#define UNDER_DAMAGE_LAYER DAMAGE_LAYER+1 -#define UNDER_UNIFORM_LAYER UNIFORM_LAYER+1 -#define UNDER_ID_LAYER ID_LAYER+1 -#define UNDER_HANDS_PART_LAYER HANDS_PART_LAYER+1 -#define UNDER_GLOVES_LAYER GLOVES_LAYER+1 -#define UNDER_SHOES_LAYER SHOES_LAYER+1 -#define UNDER_EARS_LAYER EARS_LAYER+1 #define UNDER_SUIT_LAYER SUIT_LAYER+1 -#define UNDER_GLASSES_LAYER GLASSES_LAYER+1 -#define UNDER_BELT_LAYER BELT_LAYER+1 -#define UNDER_SUIT_STORE_LAYER SUIT_STORE_LAYER+1 -#define UNDER_BACK_LAYER BACK_LAYER+1 -#define UNDER_HAIR_LAYER HAIR_LAYER+1 -#define UNDER_FACEMASK_LAYER FACEMASK_LAYER+1 -#define UNDER_HEAD_LAYER HEAD_LAYER+1 -#define UNDER_HANDCUFF_LAYER HANDCUFF_LAYER+1 -#define UNDER_LEGCUFF_LAYER LEGCUFF_LAYER+1 -#define UNDER_HANDS_LAYER HANDS_LAYER+1 -#define UNDER_BODY_FRONT_LAYER BODY_FRONT_LAYER+1 -#define UNDER_FIRE_LAYER FIRE_LAYER+1 //AND -1 MEANS "ABOVE", OK?, OK!?! -#define ABOVE_BODY_BEHIND_LAYER BODY_BEHIND_LAYER-1 -#define ABOVE_BODY_LAYER BODY_LAYER-1 -#define ABOVE_BODY_ADJ_LAYER BODY_ADJ_LAYER-1 -#define ABOVE_MUTATIONS_LAYER MUTATIONS_LAYER-1 -#define ABOVE_BODYPARTS_LAYER BODYPARTS_LAYER-1 -#define ABOVE_DAMAGE_LAYER DAMAGE_LAYER-1 -#define ABOVE_UNIFORM_LAYER UNIFORM_LAYER-1 -#define ABOVE_ID_LAYER ID_LAYER-1 -#define ABOVE_HANDS_PART_LAYER HANDS_PART_LAYER-1 -#define ABOVE_GLOVES_LAYER GLOVES_LAYER-1 #define ABOVE_SHOES_LAYER SHOES_LAYER-1 -#define ABOVE_EARS_LAYER EARS_LAYER-1 -#define ABOVE_SUIT_LAYER SUIT_LAYER-1 -#define ABOVE_GLASSES_LAYER GLASSES_LAYER-1 -#define ABOVE_BELT_LAYER BELT_LAYER-1 -#define ABOVE_SUIT_STORE_LAYER SUIT_STORE_LAYER-1 -#define ABOVE_BACK_LAYER BACK_LAYER-1 -#define ABOVE_HAIR_LAYER HAIR_LAYER-1 -#define ABOVE_FACEMASK_LAYER FACEMASK_LAYER-1 -#define ABOVE_HEAD_LAYER HEAD_LAYER-1 -#define ABOVE_HANDCUFF_LAYER HANDCUFF_LAYER-1 -#define ABOVE_LEGCUFF_LAYER LEGCUFF_LAYER-1 -#define ABOVE_HANDS_LAYER HANDS_LAYER-1 #define ABOVE_BODY_FRONT_LAYER BODY_FRONT_LAYER-1 -#define ABOVE_FIRE_LAYER FIRE_LAYER-1 //Security levels @@ -195,7 +147,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define AI_MECH_HACK 3 //Malfunctioning AI hijacking mecha //check_target_facings() return defines -#define FACING_FAILED 0 #define FACING_SAME_DIR 1 #define FACING_EACHOTHER 2 #define FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR 3 //Do I win the most informative but also most stupid define award? @@ -213,7 +164,6 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define BLOOD_GAIN_PER_STEP 100 #define BLOOD_LOSS_PER_STEP 5 #define BLOOD_LOSS_IN_SPREAD 20 -#define BLOOD_FADEOUT_TIME 2 //Bloody shoe blood states #define BLOOD_STATE_HUMAN "blood" @@ -241,7 +191,6 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define TURF_WET_LUBE 2 #define TURF_WET_ICE 3 #define TURF_WET_PERMAFROST 4 -#define TURF_WET_SLIDE 5 //Maximum amount of time, (in approx. seconds.) a tile can be wet for. #define MAXIMUM_WET_TIME 300 @@ -309,10 +258,8 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE ///////////////////////////////////// // atom.appearence_flags shortcuts // ///////////////////////////////////// -//this was added midway thru 510, so it might not exist in some versions, but we can't check by minor verison -#ifndef TILE_BOUND -#error this version of 510 is too old, You must use byond 510.1332 or later. (TILE_BOUND is not defined) -#endif + +/* // Disabling certain features #define APPEARANCE_IGNORE_TRANSFORM RESET_TRANSFORM @@ -330,12 +277,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define APPEARANCE_CONSIDER_ALPHA ~RESET_ALPHA #define APPEARANCE_LONG_GLIDE LONG_GLIDE -#ifndef PIXEL_SCALE -#define PIXEL_SCALE 0 -#if DM_VERSION >= 512 -#error HEY, PIXEL_SCALE probably exists now, remove this gross ass shim. -#endif -#endif +*/ // Consider these images/atoms as part of the UI/HUD #define APPEARANCE_UI_IGNORE_ALPHA RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA|PIXEL_SCALE @@ -417,14 +359,6 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define CLOCK_PROSELYTIZATION 23 #define SHUTTLE_HIJACK 24 -#define TURF_DECAL_PAINT "paint" -#define TURF_DECAL_DAMAGE "damage" -#define TURF_DECAL_DIRT "dirt" - -//Error handler defines -#define ERROR_USEFUL_LEN 2 - -#define NO_FIELD 0 #define FIELD_TURF 1 #define FIELD_EDGE 2 @@ -459,7 +393,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE //Dummy mob reserve slots #define DUMMY_HUMAN_SLOT_PREFERENCES "dummy_preference_preview" - +#define DUMMY_HUMAN_SLOT_ADMIN "admintools" #define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation" #define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 21d1f88f7e..71267e272f 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -86,6 +86,25 @@ #define SCREWYHUD_DEAD 2 #define SCREWYHUD_HEALTHY 3 +//Moods levels for humans +#define MOOD_LEVEL_HAPPY4 15 +#define MOOD_LEVEL_HAPPY3 10 +#define MOOD_LEVEL_HAPPY2 6 +#define MOOD_LEVEL_HAPPY1 2 +#define MOOD_LEVEL_NEUTRAL 0 +#define MOOD_LEVEL_SAD1 -3 +#define MOOD_LEVEL_SAD2 -12 +#define MOOD_LEVEL_SAD3 -18 +#define MOOD_LEVEL_SAD4 -26 + +//Beauty levels of areas for carbons +#define BEAUTY_LEVEL_HORRID -50 +#define BEAUTY_LEVEL_BAD -25 +#define BEAUTY_LEVEL_GOOD 25 +#define BEAUTY_LEVEL_GREAT 50 + + + //Nutrition levels for humans #define NUTRITION_LEVEL_FAT 600 #define NUTRITION_LEVEL_FULL 550 @@ -118,7 +137,7 @@ //Sentience types, to prevent things like sentience potions from giving bosses sentience #define SENTIENCE_ORGANIC 1 #define SENTIENCE_ARTIFICIAL 2 -#define SENTIENCE_OTHER 3 +// #define SENTIENCE_OTHER 3 unused #define SENTIENCE_MINEBOT 4 #define SENTIENCE_BOSS 5 @@ -137,29 +156,6 @@ #define ENVIRONMENT_SMASH_WALLS 2 //walls #define ENVIRONMENT_SMASH_RWALLS 4 //rwalls - -//SNPCs -//AI defines -#define INTERACTING 2 -#define TRAVEL 4 -#define FIGHTING 8 -//Trait defines -#define TRAIT_ROBUST 2 -#define TRAIT_UNROBUST 4 -#define TRAIT_SMART 8 -#define TRAIT_DUMB 16 -#define TRAIT_MEAN 32 -#define TRAIT_FRIENDLY 64 -#define TRAIT_THIEVING 128 -//Range/chance defines -#define MAX_RANGE_FIND 32 -#define MIN_RANGE_FIND 16 -#define FUZZY_CHANCE_HIGH 85 -#define FUZZY_CHANCE_LOW 50 -#define CHANCE_TALK 1 - -#define TK_MAXRANGE 15 - #define NO_SLIP_WHEN_WALKING 1 #define SLIDE 2 #define GALOSHES_DONT_HELP 4 @@ -216,6 +212,10 @@ #define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default. #define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism +// Roundstart trait system + +#define MAX_TRAITS 6 //The maximum amount of traits one character can have at roundstart + // AI Toggles #define AI_CAMERA_LUMINOSITY 5 #define AI_VOX // Comment out if you don't want VOX to be enabled and have players download the voice sounds. diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index d7a5356f0f..b4a9f41213 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -14,8 +14,10 @@ #define SOUND_ANNOUNCEMENTS 2048 #define DISABLE_DEATHRATTLE 4096 #define DISABLE_ARRIVALRATTLE 8192 - -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS) +#define MEDIHOUND_SLEEPER 16384 //CITADEL EDITS, vore prefs. +#define EATING_NOISES 32768 +#define DIGESTION_NOISES 65536 +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|MEDIHOUND_SLEEPER|EATING_NOISES|DIGESTION_NOISES) //Chat toggles #define CHAT_OOC 1 @@ -65,4 +67,4 @@ #define EXP_TYPE_GHOST "Ghost" //Flags in the players table in the db -#define DB_FLAG_EXEMPT 1 \ No newline at end of file +#define DB_FLAG_EXEMPT 1 diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 8749218847..d9db6e89a2 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -22,3 +22,4 @@ #define QDELING(X) (X.gc_destroyed) #define QDELETED(X) (!X || QDELING(X)) #define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) + diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index e38fe9954b..897d107939 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -49,7 +49,6 @@ #define RADIO_FROM_AIRALARM "from_airalarm" #define RADIO_SIGNALER "signaler" #define RADIO_ATMOSIA "atmosia" -#define RADIO_NAVBEACONS "navbeacons" #define RADIO_AIRLOCK "airlock" #define RADIO_MAGNETS "magnets" diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index b7aac16f76..cc66e54208 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -43,15 +43,11 @@ #define RDSCREEN_UI_SNODE_CHECK if(!selected_node) { return RDSCREEN_TEXT_NO_SNODE } #define RDSCREEN_UI_SDESIGN_CHECK if(!selected_design) { return RDSCREEN_TEXT_NO_SDESIGN } -#define DEPLATHE_SCREEN_PRIMARY 1 -#define DEPLATHE_SCREEN_SEARCH 2 -#define DEPLATHE_SCREEN_MATERIALS 3 -#define DEPLATHE_SCREEN_CHEMICALS 4 - -#define DEPPRINTER_SCREEN_PRIMARY 1 -#define DEPPRINTER_SCREEN_SEARCH 2 -#define DEPPRINTER_SCREEN_MATERIALS 3 -#define DEPPRINTER_SCREEN_CHEMICALS 4 +#define RESEARCH_FABRICATOR_SCREEN_MAIN 1 +#define RESEARCH_FABRICATOR_SCREEN_CHEMICALS 2 +#define RESEARCH_FABRICATOR_SCREEN_MATERIALS 3 +#define RESEARCH_FABRICATOR_SCREEN_SEARCH 4 +#define RESEARCH_FABRICATOR_SCREEN_CATEGORYVIEW 5 #define DEPARTMENTAL_FLAG_SECURITY 1 #define DEPARTMENTAL_FLAG_MEDICAL 2 diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index e3f1731a13..306f316aa5 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -31,11 +31,9 @@ // Ripples, effects that signal a shuttle's arrival #define SHUTTLE_RIPPLE_TIME 100 -#define SHUTTLE_RIPPLE_FADEIN 50 #define TRANSIT_REQUEST 1 #define TRANSIT_READY 2 -#define TRANSIT_FULL 3 #define SHUTTLE_TRANSIT_BORDER 8 @@ -79,4 +77,4 @@ #define SHUTTLE_DEFAULT_TURF_TYPE /turf/open/space #define SHUTTLE_DEFAULT_BASETURF_TYPE /turf/open/space #define SHUTTLE_DEFAULT_SHUTTLE_AREA_TYPE /area/shuttle -#define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space \ No newline at end of file +#define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm index d756cbaf1b..e307e8dd69 100644 --- a/code/__DEFINES/sight.dm +++ b/code/__DEFINES/sight.dm @@ -4,11 +4,11 @@ #define SEE_INVISIBLE_LIVING 25 -#define SEE_INVISIBLE_LEVEL_ONE 35 //currently unused -#define INVISIBILITY_LEVEL_ONE 35 //currently unused +//#define SEE_INVISIBLE_LEVEL_ONE 35 //currently unused +//#define INVISIBILITY_LEVEL_ONE 35 //currently unused -#define SEE_INVISIBLE_LEVEL_TWO 45 //currently unused -#define INVISIBILITY_LEVEL_TWO 45 //currently unused +//#define SEE_INVISIBLE_LEVEL_TWO 45 //currently unused +//#define INVISIBILITY_LEVEL_TWO 45 //currently unused #define INVISIBILITY_OBSERVER 60 #define SEE_INVISIBLE_OBSERVER 60 diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 7766bd2319..453a02db01 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -11,12 +11,13 @@ //CIT CHANNELS - TRY NOT TO REGRESS #define CHANNEL_PRED 1015 -#define CHANNEL_PREYLOOP 1014 +#define CHANNEL_DIGEST 1014 +#define CHANNEL_PREYLOOP 1013 //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED -#define CHANNEL_HIGHEST_AVAILABLE 1013 //CIT CHANGE - COMPENSATES FOR VORESOUND CHANNELS +#define CHANNEL_HIGHEST_AVAILABLE 1012 //CIT CHANGE - COMPENSATES FOR VORESOUND CHANNELS #define SOUND_MINIMUM_PRESSURE 10 diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 96c72bcab2..d9d98219aa 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -15,6 +15,5 @@ #define EMPED 8 // temporary broken by EMP pulse //ai power requirement defines -#define POWER_REQ_NONE 0 #define POWER_REQ_ALL 1 #define POWER_REQ_CLOCKCULT 2 diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ea29e956b6..6fd9fc7818 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -7,8 +7,6 @@ #define STATUS_EFFECT_REPLACE 2 //if it allows only one, but new instances replace -#define BASIC_STATUS_EFFECT /datum/status_effect //Has no effect. - /////////// // BUFFS // /////////// @@ -32,6 +30,8 @@ #define STATUS_EFFECT_EXERCISED /datum/status_effect/exercised //Prevents heart disease +#define STATUS_EFFECT_HIPPOCRATIC_OATH /datum/status_effect/hippocraticOath //Gives you an aura of healing as well as regrowing the Rod of Asclepius if lost + ///////////// // DEBUFFS // ///////////// diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index e32d5cbcec..7925edb76a 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -1,7 +1,7 @@ //Update this whenever the db schema changes //make sure you add an update to the schema_version stable in the db changelog #define DB_MAJOR_VERSION 4 -#define DB_MINOR_VERSION 0 +#define DB_MINOR_VERSION 1 //Timing subsystem //Don't run if there is an identical unique timer active @@ -56,13 +56,14 @@ #define INIT_ORDER_RESEARCH 14 #define INIT_ORDER_EVENTS 13 #define INIT_ORDER_JOBS 12 -#define INIT_ORDER_TICKER 11 -#define INIT_ORDER_MAPPING 10 -#define INIT_ORDER_ATOMS 9 +#define INIT_ORDER_TRAITS 11 +#define INIT_ORDER_TICKER 10 +#define INIT_ORDER_MAPPING 9 #define INIT_ORDER_NETWORKS 8 -#define INIT_ORDER_LANGUAGE 7 -#define INIT_ORDER_MACHINES 6 -#define INIT_ORDER_CIRCUIT 5 +#define INIT_ORDER_ATOMS 7 +#define INIT_ORDER_LANGUAGE 6 +#define INIT_ORDER_MACHINES 5 +#define INIT_ORDER_CIRCUIT 4 #define INIT_ORDER_TIMER 1 #define INIT_ORDER_DEFAULT 0 #define INIT_ORDER_AIR -1 @@ -83,24 +84,24 @@ #define FIRE_PRIORITY_IDLE_NPC 10 #define FIRE_PRIORITY_SERVER_MAINT 10 +#define FIRE_PRIORITY_RESEARCH 10 #define FIRE_PRIORITY_GARBAGE 15 -#define FIRE_PRIORITY_RESEARCH 15 #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_NPC 20 #define FIRE_PRIORITY_PROCESS 25 #define FIRE_PRIORITY_THROWING 25 -#define FIRE_PRIORITY_FLIGHTPACKS 30 #define FIRE_PRIORITY_SPACEDRIFT 30 +#define FIRE_PRIORITY_FIELDS 30 #define FIRE_PRIOTITY_SMOOTHING 35 #define FIRE_PRIORITY_ORBIT 35 +#define FIRE_PRIORITY_NETWORKS 40 #define FIRE_PRIORITY_OBJ 40 -#define FIRE_PRIORUTY_FIELDS 40 #define FIRE_PRIORITY_ACID 40 #define FIRE_PRIOTITY_BURNING 40 #define FIRE_PRIORITY_INBOUNDS 40 #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 -#define FIRE_PRIORITY_NETWORKS 80 +#define FIRE_PRIORITY_FLIGHTPACKS 80 #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 49d185a7aa..87f5b8d293 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -21,10 +21,43 @@ #define TRAIT_SLEEPIMMUNE "sleep_immunity" #define TRAIT_PUSHIMMUNE "push_immunity" #define TRAIT_SHOCKIMMUNE "shock_immunity" +#define TRAIT_STABLEHEART "stable_heart" +#define TRAIT_RESISTHEAT "resist_heat" +#define TRAIT_RESISTCOLD "resist_cold" +#define TRAIT_RESISTHIGHPRESSURE "resist_high_pressure" +#define TRAIT_RESISTLOWPRESSURE "resist_low_pressure" +#define TRAIT_RADIMMUNE "rad_immunity" +#define TRAIT_VIRUSIMMUNE "virus_immunity" +#define TRAIT_PIERCEIMMUNE "pierce_immunity" +#define TRAIT_NODISMEMBER "dismember_immunity" +#define TRAIT_NOFIRE "nonflammable" +#define TRAIT_NOGUNS "no_guns" +#define TRAIT_NOHUNGER "no_hunger" +#define TRAIT_EASYDISMEMBER "easy_dismember" +#define TRAIT_LIMBATTACHMENT "limb_attach" +#define TRAIT_TOXINLOVER "toxinlover" +#define TRAIT_NOBREATH "no_breath" #define TRAIT_ANTIMAGIC "anti_magic" #define TRAIT_HOLY "holy" +#define TRAIT_DEPRESSION "depression" +#define TRAIT_JOLLY "jolly" +#define TRAIT_NOCRITDAMAGE "no_crit" + +#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" +#define TRAIT_AGEUSIA "ageusia" +#define TRAIT_HEAVY_SLEEPER "heavy_sleeper" +#define TRAIT_NIGHT_VISION "night_vision" +#define TRAIT_LIGHT_STEP "light_step" +#define TRAIT_SPIRITUAL "spiritual" +#define TRAIT_VORACIOUS "voracious" +#define TRAIT_SELF_AWARE "self_aware" +#define TRAIT_FREERUNNING "freerunning" +#define TRAIT_SKITTISH "skittish" +#define TRAIT_POOR_AIM "poor_aim" +#define TRAIT_PROSOPAGNOSIA "prosopagnosia" + // common trait sources #define TRAIT_GENERIC "generic" #define EYE_DAMAGE "eye_damage" @@ -33,6 +66,7 @@ #define MAGIC_TRAIT "magic" #define TRAUMA_TRAIT "trauma" #define SPECIES_TRAIT "species" +#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention // unique trait sources, still defines #define STATUE_MUTE "statue" @@ -43,3 +77,4 @@ #define TRAIT_HULK "hulk" #define STASIS_MUTE "stasis" #define GENETICS_SPELL "genetics_spell" +#define EYES_COVERED "eyes_covered" diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm index edcf4f7fd2..19830c9f72 100644 --- a/code/__DEFINES/voreconstants.dm +++ b/code/__DEFINES/voreconstants.dm @@ -5,6 +5,9 @@ #define DM_NOISY "Noisy" #define DM_DRAGON "Dragon" +#define isbelly(A) istype(A, /obj/belly) + +#define QDEL_NULL_LIST(x) if(x) { for(var/y in x) { qdel(y) } ; x = null } #define VORE_STRUGGLE_EMOTE_CHANCE 40 // Stance for hostile mobs to be in while devouring someone. @@ -60,6 +63,10 @@ GLOBAL_LIST_INIT(pred_vore_sounds, list( "Squish3" = 'sound/vore/pred/squish_03.ogg', "Squish4" = 'sound/vore/pred/squish_04.ogg', "Rustle (cloth)" = 'sound/effects/rustle5.ogg', + "rustle2(cloth)" = 'sound/effects/rustle2.ogg', + "rustle3(cloth)" = 'sound/effects/rustle3.ogg', + "rustle4(cloth)" = 'sound/effects/rustle4.ogg', + "rustle5(cloth)" = 'sound/effects/rustle5.ogg', "None" = null)) /* GLOBAL_LIST_INIT(pred_struggle_sounds, list( @@ -121,3 +128,14 @@ GLOBAL_LIST_INIT(death_prey, list( "death9" = 'sound/vore/prey/death_09.ogg', "death10" = 'sound/vore/prey/death_10.ogg')) */ + +GLOBAL_LIST_INIT(release_sound, list( + "rustle (cloth)" = 'sound/effects/rustle1.ogg', + "rustle2 (cloth)" = 'sound/effects/rustle2.ogg', + "rustle3 (cloth)" = 'sound/effects/rustle3.ogg', + "rustle4 (cloth)" = 'sound/effects/rustle4.ogg', + "rustle5 (cloth)" = 'sound/effects/rustle5.ogg', + "Stomach Move" = 'sound/vore/pred/stomachmove.ogg', + "Pred Escape" = 'sound/vore/pred/escape.ogg', + "Splatter" = 'sound/effects/splat.ogg', + "None" = null)) \ No newline at end of file diff --git a/code/citadel/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm similarity index 100% rename from code/citadel/_cit_helpers.dm rename to code/__HELPERS/_cit_helpers.dm diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 8c4d62c6a2..e09ebcb10c 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -77,4 +77,7 @@ GLOBAL_VAR_INIT(cmp_field, "name") if(A.plane != B.plane) return A.plane - B.plane else - return A.layer - B.layer \ No newline at end of file + return A.layer - B.layer + +/proc/cmp_advdisease_resistance_asc(datum/disease/advance/A, datum/disease/advance/B) + return A.totalResistance() - B.totalResistance() diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index f515668dfb..7f0b5a3c07 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -35,6 +35,7 @@ return path #define FTPDELAY 200 //200 tick delay to discourage spam +#define ADMIN_FTPDELAY_MODIFIER 0.5 //Admins get to spam files faster since we ~trust~ them! /* This proc is a failsafe to prevent spamming of file requests. It is just a timer that only permits a download every [FTPDELAY] ticks. This can be changed by modifying FTPDELAY's value above. @@ -45,9 +46,13 @@ if(time_to_wait > 0) to_chat(src, "Error: file_spam_check(): Spam. Please wait [DisplayTimeText(time_to_wait)].") return 1 - GLOB.fileaccess_timer = world.time + FTPDELAY + var/delay = FTPDELAY + if(holder) + delay *= ADMIN_FTPDELAY_MODIFIER + GLOB.fileaccess_timer = world.time + delay return 0 #undef FTPDELAY +#undef ADMIN_FTPDELAY_MODIFIER /proc/pathwalk(path) var/list/jobs = list(path) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index fd83cc0658..4a7f2fdbc1 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -13,7 +13,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, GLOB.undershirt_list, GLOB.undershirt_m, GLOB.undershirt_f) //socks init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list) - //lizard bodyparts (blizzard intensifies) + //bodypart accessories (blizzard intensifies) init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/lizard, GLOB.animated_tails_list_lizard) @@ -29,7 +29,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, GLOB.animated_spines_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.r_wings_list,roundstart = TRUE) - //moffs + init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list) //CIT CHANGES START HERE, ADDS SNOWFLAKE BODYPARTS AND MORE diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index b2bb939b11..d2b8ad7d9f 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -111,6 +111,7 @@ "spines" = pick(GLOB.spines_list), "body_markings" = pick(GLOB.body_markings_list), "legs" = "Normal Legs", + "caps" = pick(GLOB.caps_list), "moth_wings" = pick(GLOB.moth_wings_list), "taur" = "None", "mam_body_markings" = "None", @@ -166,6 +167,7 @@ "womb_efficiency" = CUM_EFFICIENCY, "womb_fluid" = "femcum", "flavor_text" = "")) + /proc/random_hair_style(gender) switch(gender) if(MALE) @@ -369,7 +371,7 @@ Proc for attack log creation, because really why not checked_health["health"] = health return ..() -/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null) +/proc/do_after(mob/user, var/delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null) if(!user) return 0 var/atom/Tloc = null @@ -392,6 +394,16 @@ Proc for attack log creation, because really why not if (progress) progbar = new(user, delay, target) + GET_COMPONENT_FROM(mood, /datum/component/mood, user) + if(mood) + switch(mood.mood) //Alerts do_after delay based on how happy you are + if(-INFINITY to MOOD_LEVEL_SAD2) + delay *= 1.25 + if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4) + delay *= 0.95 + if(MOOD_LEVEL_HAPPY4 to INFINITY) + delay *= 0.9 + var/endtime = world.time + delay var/starttime = world.time . = 1 diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index b0bc653b01..b0e76bbcf3 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -500,3 +500,28 @@ objective_parts += "Objective #[count]: [objective.explanation_text] Fail." count++ return objective_parts.Join("
") + +/datum/controller/subsystem/ticker/proc/save_admin_data() + if(CONFIG_GET(flag/admin_legacy_system)) //we're already using legacy system so there's nothing to save + return + else if(load_admins()) //returns true if there was a database failure and the backup was loaded from + return + var/datum/DBQuery/query_admin_rank_update = SSdbcore.NewQuery("UPDATE [format_table_name("player")] p INNER JOIN [format_table_name("admin")] a ON p.ckey = a.ckey SET p.lastadminrank = a.rank") + query_admin_rank_update.Execute() + //json format backup file generation stored per server + var/json_file = file("data/admins_backup.json") + var/list/file_data = list("ranks" = list(), "admins" = list()) + for(var/datum/admin_rank/R in GLOB.admin_ranks) + file_data["ranks"]["[R.name]"] = list() + file_data["ranks"]["[R.name]"]["include rights"] = R.include_rights + file_data["ranks"]["[R.name]"]["exclude rights"] = R.exclude_rights + file_data["ranks"]["[R.name]"]["can edit rights"] = R.can_edit_rights + for(var/i in GLOB.admin_datums+GLOB.deadmins) + var/datum/admins/A = GLOB.admin_datums[i] + if(!A) + A = GLOB.deadmins[i] + if (!A) + continue + file_data["admins"]["[i]"] = A.rank.name + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index b36a8c678b..6c28a1262d 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -598,33 +598,29 @@ GLOBAL_LIST_INIT(binary, list("0","1")) return //Regular expressions are, as usual, absolute magic - var/regex/is_website = new("http|www.|\[a-z0-9_-]+.(com|org|net|mil|edu)+", "i") - var/regex/is_email = new("\[a-z0-9_-]+@\[a-z0-9_-]+.\[a-z0-9_-]+", "i") - var/regex/alphanumeric = new("\[a-z0-9]+", "i") - var/regex/punctuation = new("\[.!?]+", "i") var/regex/all_invalid_symbols = new("\[^ -~]+") var/list/accepted = list() for(var/string in proposed) - if(findtext(string,is_website) || findtext(string,is_email) || findtext(string,all_invalid_symbols) || !findtext(string,alphanumeric)) + if(findtext(string,GLOB.is_website) || findtext(string,GLOB.is_email) || findtext(string,all_invalid_symbols) || !findtext(string,GLOB.is_alphanumeric)) continue var/buffer = "" var/early_culling = TRUE for(var/pos = 1, pos <= lentext(string), pos++) var/let = copytext(string, pos, (pos + 1) % lentext(string)) - if(early_culling && !findtext(let,alphanumeric)) + if(early_culling && !findtext(let,GLOB.is_alphanumeric)) continue early_culling = FALSE buffer += let - if(!findtext(buffer,alphanumeric)) + if(!findtext(buffer,GLOB.is_alphanumeric)) continue var/punctbuffer = "" var/cutoff = lentext(buffer) for(var/pos = lentext(buffer), pos >= 0, pos--) var/let = copytext(buffer, pos, (pos + 1) % lentext(buffer)) - if(findtext(let,alphanumeric)) + if(findtext(let,GLOB.is_alphanumeric)) break - if(findtext(let,punctuation)) + if(findtext(let,GLOB.is_punctuation)) punctbuffer = let + punctbuffer //Note this isn't the same thing as using += cutoff = pos if(punctbuffer) //We clip down excessive punctuation to get the letter count lower and reduce repeats. It's not perfect but it helps. @@ -652,7 +648,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) else punctbuffer = "" //Grammer nazis be damned buffer = copytext(buffer, 1, cutoff) + punctbuffer - if(!findtext(buffer,alphanumeric)) + if(!findtext(buffer,GLOB.is_alphanumeric)) continue if(!buffer || lentext(buffer) > 280 || lentext(buffer) <= cullshort || buffer in accepted) continue diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index daf2b33889..321a55babd 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -11,11 +11,11 @@ wtime = world.time return time2text(wtime - GLOB.timezoneOffset, format) -/proc/station_time() - return ((((world.time - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - GLOB.timezoneOffset +/proc/station_time(display_only = FALSE) + return ((((world.time - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) /proc/station_time_timestamp(format = "hh:mm:ss") - return time2text(station_time(), format) + return time2text(station_time(TRUE), format) /proc/station_time_debug(force_set) if(isnum(force_set)) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 9778596d77..c06484f556 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -182,38 +182,40 @@ return ICON_OVERLAY //Converts a rights bitfield into a string -/proc/rights2text(rights, seperator="", list/adds, list/subs) +/proc/rights2text(rights, seperator="", prefix = "+") + seperator += prefix if(rights & R_BUILDMODE) - . += "[seperator]+BUILDMODE" + . += "[seperator]BUILDMODE" if(rights & R_ADMIN) - . += "[seperator]+ADMIN" + . += "[seperator]ADMIN" if(rights & R_BAN) - . += "[seperator]+BAN" + . += "[seperator]BAN" if(rights & R_FUN) - . += "[seperator]+FUN" + . += "[seperator]FUN" if(rights & R_SERVER) - . += "[seperator]+SERVER" + . += "[seperator]SERVER" if(rights & R_DEBUG) - . += "[seperator]+DEBUG" + . += "[seperator]DEBUG" if(rights & R_POSSESS) - . += "[seperator]+POSSESS" + . += "[seperator]POSSESS" if(rights & R_PERMISSIONS) - . += "[seperator]+PERMISSIONS" + . += "[seperator]PERMISSIONS" if(rights & R_STEALTH) - . += "[seperator]+STEALTH" + . += "[seperator]STEALTH" if(rights & R_POLL) - . += "[seperator]+POLL" + . += "[seperator]POLL" if(rights & R_VAREDIT) - . += "[seperator]+VAREDIT" + . += "[seperator]VAREDIT" if(rights & R_SOUNDS) - . += "[seperator]+SOUND" + . += "[seperator]SOUND" if(rights & R_SPAWN) - . += "[seperator]+SPAWN" - - for(var/verbpath in adds) - . += "[seperator]+[verbpath]" - for(var/verbpath in subs) - . += "[seperator]-[verbpath]" + . += "[seperator]SPAWN" + if(rights & R_AUTOLOGIN) + . += "[seperator]AUTOLOGIN" + if(rights & R_DBRANKS) + . += "[seperator]DBRANKS" + if(!.) + . = "NONE" return . /proc/ui_style2icon(ui_style) diff --git a/code/__HELPERS/type2type_vr.dm b/code/__HELPERS/type2type_vr.dm index 09ea0a158a..96e04585d7 100644 --- a/code/__HELPERS/type2type_vr.dm +++ b/code/__HELPERS/type2type_vr.dm @@ -105,3 +105,7 @@ . += copytext(text, last_found, found) last_found = found + delim_len while (found) + +// Returns true if val is from min to max, inclusive. +/proc/IsInRange(val, min, max) + return (val >= min) && (val <= max) \ No newline at end of file diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index f44943ce87..cbd73627ff 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -518,16 +518,24 @@ Turf and target are separate in case you want to teleport some distance from a t Gets all contents of contents and returns them all in a list. */ -/atom/proc/GetAllContents() +/atom/proc/GetAllContents(var/T) var/list/processing_list = list(src) var/list/assembled = list() - while(processing_list.len) - var/atom/A = processing_list[1] - processing_list.Cut(1, 2) - //Byond does not allow things to be in multiple contents, or double parent-child hierarchies, so only += is needed - //This is also why we don't need to check against assembled as we go along - processing_list += A.contents - assembled += A + if(T) + while(processing_list.len) + var/atom/A = processing_list[1] + processing_list.Cut(1, 2) + //Byond does not allow things to be in multiple contents, or double parent-child hierarchies, so only += is needed + //This is also why we don't need to check against assembled as we go along + processing_list += A.contents + if(istype(A,T)) + assembled += A + else + while(processing_list.len) + var/atom/A = processing_list[1] + processing_list.Cut(1, 2) + processing_list += A.contents + assembled += A return assembled /atom/proc/GetAllContentsIgnoring(list/ignore_typecache) @@ -912,7 +920,7 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/ if(!ismob(target) || target.lying) //Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side - return FACING_FAILED + return FALSE if(initator.dir == target.dir) //mobs are facing the same direction return FACING_SAME_DIR if(is_A_facing_B(initator,target) && is_A_facing_B(target,initator)) //mobs are facing each other @@ -987,9 +995,9 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( var/mob/living/LA = A if(LA.lying) return 0 - var/goal_dir = angle2dir(dir2angle(get_dir(B,A)+180)) + var/goal_dir = get_dir(A,B) var/clockwise_A_dir = turn(A.dir, -45) - var/anticlockwise_A_dir = turn(B.dir, 45) + var/anticlockwise_A_dir = turn(A.dir, 45) if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir) return 1 diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 714e9d114e..a37666bdec 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -1,5 +1,3 @@ -#define DEBUG //Enables byond profiling and full runtime logs - note, this may also be defined in your .dme file - //Enables in-depth debug messages to runtime log (used for debugging) //#define TESTING //By using the testing("message") proc you can create debug-feedback for people with this //uncommented, but not visible in the release version) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index ebf86ed666..4026608f78 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -1,130 +1,131 @@ -//Preferences stuff - //Hairstyles -GLOBAL_LIST_EMPTY(hair_styles_list) //stores /datum/sprite_accessory/hair indexed by name -GLOBAL_LIST_EMPTY(hair_styles_male_list) //stores only hair names -GLOBAL_LIST_EMPTY(hair_styles_female_list) //stores only hair names -GLOBAL_LIST_EMPTY(facial_hair_styles_list) //stores /datum/sprite_accessory/facial_hair indexed by name -GLOBAL_LIST_EMPTY(facial_hair_styles_male_list) //stores only hair names -GLOBAL_LIST_EMPTY(facial_hair_styles_female_list) //stores only hair names - //Underwear -GLOBAL_LIST_EMPTY(underwear_list) //stores /datum/sprite_accessory/underwear indexed by name -GLOBAL_LIST_EMPTY(underwear_m) //stores only underwear name -GLOBAL_LIST_EMPTY(underwear_f) //stores only underwear name - //Undershirts -GLOBAL_LIST_EMPTY(undershirt_list) //stores /datum/sprite_accessory/undershirt indexed by name -GLOBAL_LIST_EMPTY(undershirt_m) //stores only undershirt name -GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name - //Socks -GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/socks indexed by name - //Lizard Bits (all datum lists indexed by name) -GLOBAL_LIST_EMPTY(body_markings_list) -GLOBAL_LIST_EMPTY(tails_list_lizard) -GLOBAL_LIST_EMPTY(animated_tails_list_lizard) -GLOBAL_LIST_EMPTY(snouts_list) -GLOBAL_LIST_EMPTY(horns_list) -GLOBAL_LIST_EMPTY(frills_list) -GLOBAL_LIST_EMPTY(spines_list) -GLOBAL_LIST_EMPTY(legs_list) -GLOBAL_LIST_EMPTY(animated_spines_list) - - //Mutant Human bits -GLOBAL_LIST_EMPTY(tails_list_human) -GLOBAL_LIST_EMPTY(animated_tails_list_human) -GLOBAL_LIST_EMPTY(ears_list) -GLOBAL_LIST_EMPTY(wings_list) -GLOBAL_LIST_EMPTY(wings_open_list) -GLOBAL_LIST_EMPTY(r_wings_list) -GLOBAL_LIST_EMPTY(moth_wings_list) - -GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites -GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list("ghost")) //stores the ghost forms that support hair and other such things - -GLOBAL_LIST_INIT(security_depts_prefs, list(SEC_DEPT_RANDOM, SEC_DEPT_NONE, SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY)) - - //Backpacks -#define GBACKPACK "Grey Backpack" -#define GSATCHEL "Grey Satchel" -#define GDUFFELBAG "Grey Duffel Bag" -#define LSATCHEL "Leather Satchel" -#define DBACKPACK "Department Backpack" -#define DSATCHEL "Department Satchel" -#define DDUFFELBAG "Department Duffel Bag" -GLOBAL_LIST_INIT(backbaglist, list(DBACKPACK, DSATCHEL, DDUFFELBAG, GBACKPACK, GSATCHEL, GDUFFELBAG, LSATCHEL)) - -//Uplink spawn loc -#define UPLINK_PDA "PDA" -#define UPLINK_RADIO "Radio" -#define UPLINK_PEN "Pen" //like a real spy! -GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN)) - - //Female Uniforms -GLOBAL_LIST_EMPTY(female_clothing_icons) - - //radical shit -GLOBAL_LIST_INIT(hit_appends, list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")) - -GLOBAL_LIST_INIT(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')) - - -// 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 -// tagged for the Cargo Bay. - -/* List of sortType codes for mapping reference -0 Waste -1 Disposals -2 Cargo Bay -3 QM Office -4 Engineering -5 CE Office -6 Atmospherics -7 Security -8 HoS Office -9 Medbay -10 CMO Office -11 Chemistry -12 Research -13 RD Office -14 Robotics -15 HoP Office -16 Library -17 Chapel -18 Theatre -19 Bar -20 Kitchen -21 Hydroponics -22 Janitor -23 Genetics -*/ - -GLOBAL_LIST_INIT(TAGGERLOCATIONS, list("Disposals", - "Cargo Bay", "QM Office", "Engineering", "CE Office", - "Atmospherics", "Security", "HoS Office", "Medbay", - "CMO Office", "Chemistry", "Research", "RD Office", - "Robotics", "HoP Office", "Library", "Chapel", "Theatre", - "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics")) - -GLOBAL_LIST_INIT(guitar_notes, flist("sound/guitar/")) - -GLOBAL_LIST_INIT(station_prefixes, world.file2list("strings/station_prefixes.txt") + "") - -GLOBAL_LIST_INIT(station_names, world.file2list("strings/station_names.txt" + "")) - -GLOBAL_LIST_INIT(station_suffixes, world.file2list("strings/station_suffixes.txt")) - -GLOBAL_LIST_INIT(greek_letters, world.file2list("strings/greek_letters.txt")) - -GLOBAL_LIST_INIT(phonetic_alphabet, world.file2list("strings/phonetic_alphabet.txt")) - -GLOBAL_LIST_INIT(numbers_as_words, world.file2list("strings/numbers_as_words.txt")) - -/proc/generate_number_strings() - var/list/L[198] - for(var/i in 1 to 99) - L += "[i]" - L += "\Roman[i]" - return L - -GLOBAL_LIST_INIT(station_numerals, greek_letters + phonetic_alphabet + numbers_as_words + generate_number_strings()) - -GLOBAL_LIST_INIT(admiral_messages, list("Do you know how expensive these stations are?","Stop wasting my time.","I was sleeping, thanks a lot.","Stand and fight you cowards!","You knew the risks coming in.","Stop being paranoid.","Whatever's broken just build a new one.","No.", "null","Error: No comment given.", "It's a good day to die!")) +//Preferences stuff + //Hairstyles +GLOBAL_LIST_EMPTY(hair_styles_list) //stores /datum/sprite_accessory/hair indexed by name +GLOBAL_LIST_EMPTY(hair_styles_male_list) //stores only hair names +GLOBAL_LIST_EMPTY(hair_styles_female_list) //stores only hair names +GLOBAL_LIST_EMPTY(facial_hair_styles_list) //stores /datum/sprite_accessory/facial_hair indexed by name +GLOBAL_LIST_EMPTY(facial_hair_styles_male_list) //stores only hair names +GLOBAL_LIST_EMPTY(facial_hair_styles_female_list) //stores only hair names + //Underwear +GLOBAL_LIST_EMPTY(underwear_list) //stores /datum/sprite_accessory/underwear indexed by name +GLOBAL_LIST_EMPTY(underwear_m) //stores only underwear name +GLOBAL_LIST_EMPTY(underwear_f) //stores only underwear name + //Undershirts +GLOBAL_LIST_EMPTY(undershirt_list) //stores /datum/sprite_accessory/undershirt indexed by name +GLOBAL_LIST_EMPTY(undershirt_m) //stores only undershirt name +GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name + //Socks +GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/socks indexed by name + //Lizard Bits (all datum lists indexed by name) +GLOBAL_LIST_EMPTY(body_markings_list) +GLOBAL_LIST_EMPTY(tails_list_lizard) +GLOBAL_LIST_EMPTY(animated_tails_list_lizard) +GLOBAL_LIST_EMPTY(snouts_list) +GLOBAL_LIST_EMPTY(horns_list) +GLOBAL_LIST_EMPTY(frills_list) +GLOBAL_LIST_EMPTY(spines_list) +GLOBAL_LIST_EMPTY(legs_list) +GLOBAL_LIST_EMPTY(animated_spines_list) + + //Mutant Human bits +GLOBAL_LIST_EMPTY(tails_list_human) +GLOBAL_LIST_EMPTY(animated_tails_list_human) +GLOBAL_LIST_EMPTY(ears_list) +GLOBAL_LIST_EMPTY(wings_list) +GLOBAL_LIST_EMPTY(wings_open_list) +GLOBAL_LIST_EMPTY(r_wings_list) +GLOBAL_LIST_EMPTY(moth_wings_list) +GLOBAL_LIST_EMPTY(caps_list) + +GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites +GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list("ghost")) //stores the ghost forms that support hair and other such things + +GLOBAL_LIST_INIT(security_depts_prefs, list(SEC_DEPT_RANDOM, SEC_DEPT_NONE, SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY)) + + //Backpacks +#define GBACKPACK "Grey Backpack" +#define GSATCHEL "Grey Satchel" +#define GDUFFELBAG "Grey Duffel Bag" +#define LSATCHEL "Leather Satchel" +#define DBACKPACK "Department Backpack" +#define DSATCHEL "Department Satchel" +#define DDUFFELBAG "Department Duffel Bag" +GLOBAL_LIST_INIT(backbaglist, list(DBACKPACK, DSATCHEL, DDUFFELBAG, GBACKPACK, GSATCHEL, GDUFFELBAG, LSATCHEL)) + +//Uplink spawn loc +#define UPLINK_PDA "PDA" +#define UPLINK_RADIO "Radio" +#define UPLINK_PEN "Pen" //like a real spy! +GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN)) + + //Female Uniforms +GLOBAL_LIST_EMPTY(female_clothing_icons) + + //radical shit +GLOBAL_LIST_INIT(hit_appends, list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")) + +GLOBAL_LIST_INIT(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')) + + +// 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 +// tagged for the Cargo Bay. + +/* List of sortType codes for mapping reference +0 Waste +1 Disposals +2 Cargo Bay +3 QM Office +4 Engineering +5 CE Office +6 Atmospherics +7 Security +8 HoS Office +9 Medbay +10 CMO Office +11 Chemistry +12 Research +13 RD Office +14 Robotics +15 HoP Office +16 Library +17 Chapel +18 Theatre +19 Bar +20 Kitchen +21 Hydroponics +22 Janitor +23 Genetics +*/ + +GLOBAL_LIST_INIT(TAGGERLOCATIONS, list("Disposals", + "Cargo Bay", "QM Office", "Engineering", "CE Office", + "Atmospherics", "Security", "HoS Office", "Medbay", + "CMO Office", "Chemistry", "Research", "RD Office", + "Robotics", "HoP Office", "Library", "Chapel", "Theatre", + "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics")) + +GLOBAL_LIST_INIT(guitar_notes, flist("sound/guitar/")) + +GLOBAL_LIST_INIT(station_prefixes, world.file2list("strings/station_prefixes.txt") + "") + +GLOBAL_LIST_INIT(station_names, world.file2list("strings/station_names.txt" + "")) + +GLOBAL_LIST_INIT(station_suffixes, world.file2list("strings/station_suffixes.txt")) + +GLOBAL_LIST_INIT(greek_letters, world.file2list("strings/greek_letters.txt")) + +GLOBAL_LIST_INIT(phonetic_alphabet, world.file2list("strings/phonetic_alphabet.txt")) + +GLOBAL_LIST_INIT(numbers_as_words, world.file2list("strings/numbers_as_words.txt")) + +/proc/generate_number_strings() + var/list/L[198] + for(var/i in 1 to 99) + L += "[i]" + L += "\Roman[i]" + return L + +GLOBAL_LIST_INIT(station_numerals, greek_letters + phonetic_alphabet + numbers_as_words + generate_number_strings()) + +GLOBAL_LIST_INIT(admiral_messages, list("Do you know how expensive these stations are?","Stop wasting my time.","I was sleeping, thanks a lot.","Stand and fight you cowards!","You knew the risks coming in.","Stop being paranoid.","Whatever's broken just build a new one.","No.", "null","Error: No comment given.", "It's a good day to die!")) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index a3d14b26ad..e32405cad5 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -25,8 +25,10 @@ GLOBAL_LIST_EMPTY(available_ai_shells) GLOBAL_LIST_INIT(simple_animals, list(list(),list(),list(),list())) // One for each AI_* status define GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs GLOBAL_LIST_EMPTY(bots_list) +GLOBAL_LIST_EMPTY(living_cameras) GLOBAL_LIST_EMPTY(language_datum_instances) GLOBAL_LIST_EMPTY(all_languages) -GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traitor-target purposes. \ No newline at end of file +GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traitor-target purposes. +GLOBAL_LIST_EMPTY(sentient_disease_instances) diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index f88c4aab85..a2cba4e08f 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -1,10 +1,8 @@ //Each lists stores ckeys for "Never for this round" option category -#define POLL_IGNORE_PAI "pai" #define POLL_IGNORE_SENTIENCE_POTION "sentience_potion" #define POLL_IGNORE_POSSESSED_BLADE "possessed_blade" #define POLL_IGNORE_ALIEN_LARVA "alien_larva" -#define POLL_IGNORE_CLOCKWORK_MARAUDER "clockwork_marauder" #define POLL_IGNORE_SYNDICATE "syndicate" #define POLL_IGNORE_HOLOPARASITE "holoparasite" diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 807ec5c5fe..7a5c95d690 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -22,5 +22,6 @@ GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details GLOBAL_LIST_INIT(bitfields, list( "obj_flags" = list("EMAGGED" = EMAGGED, "IN_USE" = IN_USE, "CAN_BE_HIT" = CAN_BE_HIT, "BEING_SHOCKED" = BEING_SHOCKED, "DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION, "ON_BLUEPRINTS" = ON_BLUEPRINTS, "UNIQUE_RENAME" = UNIQUE_RENAME), "datum_flags" = list("DF_USE_TAG" = DF_USE_TAG, "DF_VAR_EDITED" = DF_VAR_EDITED), - "item_flags" = list("BEING_REMOVED" = BEING_REMOVED, "IN_INVENTORY" = IN_INVENTORY, "FORCE_STRING_OVERRIDE" = FORCE_STRING_OVERRIDE, "NEEDS_PERMIT" = NEEDS_PERMIT) + "item_flags" = list("BEING_REMOVED" = BEING_REMOVED, "IN_INVENTORY" = IN_INVENTORY, "FORCE_STRING_OVERRIDE" = FORCE_STRING_OVERRIDE, "NEEDS_PERMIT" = NEEDS_PERMIT), + "admin_flags" = list("BUILDMODE" = R_BUILDMODE, "ADMIN" = R_ADMIN, "BAN" = R_BAN, "FUN" = R_FUN, "SERVER" = R_SERVER, "DEBUG" = R_DEBUG, "POSSESS" = R_POSSESS, "PERMISSIONS" = R_PERMISSIONS, "STEALTH" = R_STEALTH, "POLL" = R_POLL, "VAREDIT" = R_VAREDIT, "SOUNDS" = R_SOUNDS, "SPAWN" = R_SPAWN, "AUTOLOGIN" = R_AUTOLOGIN, "DBRANKS" = R_DBRANKS) )) diff --git a/code/_globalvars/regexes.dm b/code/_globalvars/regexes.dm new file mode 100644 index 0000000000..bd252b68ce --- /dev/null +++ b/code/_globalvars/regexes.dm @@ -0,0 +1,7 @@ +//These are a bunch of regex datums for use /((any|every|no|some|head|foot)where(wolf)?\sand\s)+(\.[\.\s]+\s?where\?)?/i +GLOBAL_DATUM_INIT(is_http_protocol, /regex, regex("^https?://")) + +GLOBAL_DATUM_INIT(is_website, /regex, regex("http|www.|\[a-z0-9_-]+.(com|org|net|mil|edu)+", "i")) +GLOBAL_DATUM_INIT(is_email, /regex, regex("\[a-z0-9_-]+@\[a-z0-9_-]+.\[a-z0-9_-]+", "i")) +GLOBAL_DATUM_INIT(is_alphanumeric, /regex, regex("\[a-z0-9]+", "i")) +GLOBAL_DATUM_INIT(is_punctuation, /regex, regex("\[.!?]+", "i")) diff --git a/code/_globalvars/tooltips.dm b/code/_globalvars/tooltips.dm deleted file mode 100755 index 58bb6bcea5..0000000000 --- a/code/_globalvars/tooltips.dm +++ /dev/null @@ -1 +0,0 @@ -GLOBAL_VAR_INIT(enable_examine_tips, TRUE) \ No newline at end of file diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index ce9e1ead82..4c588c96fe 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -75,7 +75,7 @@ if(modifiers["middle"]) MiddleClickOn(A) return - if(modifiers["shift"]) + if(modifiers["shift"] && (client && client.show_popup_menus || modifiers["right"])) //CIT CHANGE - makes shift-click examine use right click instead of left click in combat mode ShiftClickOn(A) return if(modifiers["alt"]) // alt and alt-gr (rightalt) @@ -85,6 +85,10 @@ CtrlClickOn(A) return + if(modifiers["right"]) //CIT CHANGE - allows right clicking to perform actions + RightClickOn(A,params) //CIT CHANGE - ditto + return //CIT CHANGE - ditto + if(incapacitated(ignore_restraints = 1)) return diff --git a/code/_onclick/god.dm b/code/_onclick/god.dm deleted file mode 100644 index 24629a0635..0000000000 --- a/code/_onclick/god.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/camera/god/UnarmedAttack(atom/A) - A.attack_god(src) - -/mob/camera/god/RangedAttack(atom/A) - A.attack_god(src) - -/atom/proc/attack_god(mob/user) - return diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 6d941589d3..3225252520 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -66,7 +66,7 @@ #define ui_monkey_neck "CENTER-3:15,SOUTH:5" //monkey #define ui_monkey_back "CENTER-2:16,SOUTH:5" //monkey -#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien +//#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:26,SOUTH:5" //alien @@ -82,9 +82,9 @@ #define ui_acti "EAST-3:24,SOUTH:5" #define ui_zonesel "EAST-1:28,SOUTH:5" #define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) -#define ui_crafting "EAST-4:22,SOUTH:5" -#define ui_building "EAST-4:22,SOUTH:21" -#define ui_language_menu "EAST-4:6,SOUTH:21" +#define ui_crafting "EAST-5:20,SOUTH:5"//CIT CHANGE - moves this over one tile to accommodate for combat mode toggle +#define ui_building "EAST-5:20,SOUTH:21"//CIT CHANGE - ditto +#define ui_language_menu "EAST-5:4,SOUTH:21"//CIT CHANGE - ditto #define ui_borg_pull "EAST-2:26,SOUTH+1:7" #define ui_borg_radio "EAST-1:28,SOUTH+1:7" @@ -102,7 +102,8 @@ //Middle right (status indicators) #define ui_healthdoll "EAST-1:28,CENTER-2:13" #define ui_health "EAST-1:28,CENTER-1:15" -#define ui_internal "EAST-1:28,CENTER:17" +#define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter +#define ui_mood "EAST-1:28,CENTER-3:10" //borgs #define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index c6a5843b32..bb61f2218d 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -346,7 +346,11 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." icon_state = "runed_sense2" desc = "You can no longer sense your target's presence." return - desc = "You are currently tracking [blood_target] in [get_area_name(blood_target)]." + if(isliving(blood_target)) + var/mob/living/real_target = blood_target + desc = "You are currently tracking [real_target.real_name] in [get_area_name(blood_target)]." + else + desc = "You are currently tracking [blood_target] in [get_area_name(blood_target)]." var/target_angle = Get_Angle(Q, P) var/target_dist = get_dist(P, Q) cut_overlays() diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 65c4bd23c2..c579c7adab 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -106,6 +106,11 @@ layer = BLIND_LAYER plane = FULLSCREEN_PLANE +/obj/screen/fullscreen/depression + icon_state = "depression" + layer = FLASH_LAYER + plane = FULLSCREEN_PLANE + /obj/screen/fullscreen/curse icon_state = "curse" layer = CURSE_LAYER diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 5693e9c47e..e5de695789 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -43,6 +43,7 @@ var/obj/screen/healths var/obj/screen/healthdoll var/obj/screen/internals + var/obj/screen/mood var/ui_style_icon = 'icons/mob/screen_midnight.dmi' @@ -103,6 +104,7 @@ healths = null healthdoll = null internals = null + mood = null lingchemdisplay = null devilsouldisplay = null lingstingdisplay = null @@ -268,4 +270,4 @@ show_hud(HUD_STYLE_STANDARD,mymob) /datum/hud/proc/update_locked_slots() - return \ No newline at end of file + return diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index f9f1849c87..c3288e61fc 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -89,19 +89,29 @@ ..() owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) + var/widescreenlayout = FALSE //CIT CHANGE - adds support for different hud layouts depending on widescreen pref + if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref) //CIT CHANGE - ditto + widescreenlayout = TRUE // CIT CHANGE - ditto + var/obj/screen/using var/obj/screen/inventory/inv_box using = new /obj/screen/craft using.icon = ui_style + if(!widescreenlayout) // CIT CHANGE + using.screen_loc = ui_boxcraft // CIT CHANGE static_inventory += using using = new/obj/screen/language_menu using.icon = ui_style + if(!widescreenlayout) // CIT CHANGE + using.screen_loc = ui_boxlang // CIT CHANGE static_inventory += using using = new /obj/screen/area_creator using.icon = ui_style + if(!widescreenlayout) // CIT CHANGE + using.screen_loc = ui_boxarea // CIT CHANGE static_inventory += using action_intent = new /obj/screen/act_intent/segmented @@ -109,11 +119,19 @@ static_inventory += action_intent using = new /obj/screen/mov_intent - using.icon = ui_style + using.icon = tg_ui_icon_to_cit_ui(ui_style) // CIT CHANGE - overrides mov intent icon using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") using.screen_loc = ui_movi static_inventory += using + //CITADEL CHANGES - sprint button + using = new /obj/screen/sprintbutton + using.icon = tg_ui_icon_to_cit_ui(ui_style) + using.icon_state = (owner.sprinting ? "act_sprint_on" : "act_sprint") + using.screen_loc = ui_movi + static_inventory += using + //END OF CITADEL CHANGES + using = new /obj/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw @@ -207,9 +225,21 @@ using = new /obj/screen/resist() using.icon = ui_style - using.screen_loc = ui_pull_resist + using.screen_loc = ui_overridden_resist // CIT CHANGE - changes this to overridden resist hotkeybuttons += using + //CIT CHANGES - rest and combat mode buttons + using = new /obj/screen/restbutton() + using.icon = tg_ui_icon_to_cit_ui(ui_style) + using.screen_loc = ui_pull_resist + static_inventory += using + + using = new /obj/screen/combattoggle() + using.icon = tg_ui_icon_to_cit_ui(ui_style) + using.screen_loc = ui_combat_toggle + static_inventory += using + //END OF CIT CHANGES + using = new /obj/screen/human/toggle() using.icon = ui_style using.screen_loc = ui_inventory @@ -280,15 +310,25 @@ healths = new /obj/screen/healths() infodisplay += healths - //CIT CHANGE - adds arousal to hud + //CIT CHANGE - adds arousal and stamina to hud arousal = new /obj/screen/arousal() arousal.icon_state = (owner.canbearoused == 1 ? "arousal0" : "") infodisplay += arousal + + staminas = new /obj/screen/staminas() + infodisplay += staminas + + staminabuffer = new /obj/screen/staminabuffer() + infodisplay += staminabuffer //END OF CIT CHANGES healthdoll = new /obj/screen/healthdoll() infodisplay += healthdoll + if(!CONFIG_GET(flag/disable_human_mood)) + mood = new /obj/screen/mood() + infodisplay += mood + pull_icon = new /obj/screen/pull() pull_icon.icon = ui_style pull_icon.update_icon(mymob) @@ -314,7 +354,7 @@ inv.hud = src inv_slots[inv.slot_id] = inv inv.update_icon() - + update_locked_slots() /datum/hud/human/update_locked_slots() diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm deleted file mode 100644 index fa2a4ebf31..0000000000 --- a/code/_onclick/hud/other_mobs.dm +++ /dev/null @@ -1,13 +0,0 @@ - -/datum/hud/brain/show_hud(version = 0) - if(!ismob(mymob)) - return 0 - if(!mymob.client) - return 0 - mymob.client.screen = list() - mymob.client.screen += mymob.client.void - -/mob/living/brain/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/brain(src) - diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index e3d1af79ed..da21f43ce7 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -152,12 +152,6 @@ continue var/newstate = initial(L.icon_state) - if (animatedir) - if(animatedir == NORTH || animatedir == SOUTH) - newstate += "_vertical" - else - newstate += "_horizontal" - var/T = PARALLAX_LOOP_TIME / L.speed if (newstate in icon_states(L.icon)) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 1e574cd8aa..e582e3ec0b 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -538,6 +538,16 @@ name = "health doll" screen_loc = ui_healthdoll +/obj/screen/mood + name = "mood" + icon_state = "mood5" + screen_loc = ui_mood + +/obj/screen/mood/Click() + GET_COMPONENT_FROM(mood, /datum/component/mood, usr) + if(mood) + mood.print_mood() + /obj/screen/splash icon = 'icons/blank_title.png' icon_state = "" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 1fc40d3007..8fc30e95e6 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -54,6 +54,10 @@ if(flags_1 & NOBLUDGEON_1) return + if(user.staminaloss >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit + to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto + return // CIT CHANGE - ditto + if(force && user.has_trait(TRAIT_PACIFISM)) to_chat(user, "You don't want to harm other living beings!") return @@ -72,12 +76,17 @@ add_logs(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) + user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes attacking things cause stamina loss //the equivalent of the standard version of attack() but for object targets. /obj/item/proc/attack_obj(obj/O, mob/living/user) SendSignal(COMSIG_ITEM_ATTACK_OBJ, O, user) if(flags_1 & NOBLUDGEON_1) return + if(user.staminaloss >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit + to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto + return // CIT CHANGE - ditto + user.adjustStaminaLossBuffered(getweight()*1.2)//CIT CHANGE - makes attacking things cause stamina loss user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(O) O.attacked_by(src, user) @@ -94,7 +103,16 @@ /mob/living/attacked_by(obj/item/I, mob/living/user) send_item_attack_message(I, user) if(I.force) - apply_damage(I.force, I.damtype) + //CIT CHANGES START HERE - combatmode and resting checks + var/totitemdamage = I.force + if(iscarbon(user)) + var/mob/living/carbon/tempcarb = user + if(!tempcarb.combatmode) + totitemdamage *= 0.5 + if(user.resting) + totitemdamage *= 0.5 + //CIT CHANGES END HERE + apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage if(I.damtype == BRUTE) if(prob(33)) I.add_mob_blood(src) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index d52a7f6fdc..587236e802 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -103,7 +103,7 @@ "[name] bites [ML]!") if(armor >= 2) return - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing ML.ForceContractDisease(D) else diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 87354d6f0b..ce07b7ebb2 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -10,6 +10,8 @@ By default, emulate the user's unarmed attack */ +#define TK_MAXRANGE 15 + /atom/proc/attack_tk(mob/user) if(user.stat || !tkMaxRangeCheck(user, src)) return @@ -188,3 +190,6 @@ /obj/item/tk_grab/suicide_act(mob/user) user.visible_message("[user] is using [user.p_their()] telekinesis to choke [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!") return (OXYLOSS) + + +#undef TK_MAXRANGE diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm deleted file mode 100644 index da1171bb26..0000000000 --- a/code/citadel/cit_guns.dm +++ /dev/null @@ -1,1246 +0,0 @@ -/obj/item/gun/energy/laser/carbine - name = "laser carbine" - desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal laser gun." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "lasernew" - item_state = "laser" - force = 10 - throwforce = 10 - ammo_type = list(/obj/item/ammo_casing/energy/lasergun) - cell_type = /obj/item/stock_parts/cell/lascarbine - resistance_flags = FIRE_PROOF | ACID_PROOF - -/obj/item/gun/energy/laser/carbine/nopin - pin = null - -/obj/item/stock_parts/cell/lascarbine - name = "laser carbine power supply" - maxcharge = 2500 - -/datum/design/lasercarbine - name = "Laser Carbine" - desc = "Beefed up version of a standard laser gun." - id = "lasercarbine" - build_type = PROTOLATHE - materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000) - build_path = /obj/item/gun/energy/laser/carbine/nopin - category = list("Weapons") - -////////////Anti Tank Pistol//////////// - -/obj/item/gun/ballistic/automatic/pistol/antitank - name = "Anti Tank Pistol" - desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "atp" - item_state = "pistol" - recoil = 6 - mag_type = /obj/item/ammo_box/magazine/sniper_rounds - fire_delay = 50 - burst_size = 1 - can_suppress = 0 - w_class = WEIGHT_CLASS_NORMAL - actions_types = list() - fire_sound = 'sound/weapons/blastcannon.ogg' - spread = 30 //damn thing has no rifling. - -/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("atp-mag") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate - name = "Syndicate Anti Tank Pistol" - desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing." - pin = /obj/item/device/firing_pin/implant/pindicate - -/////////////spinfusor stuff//////////////// - -/obj/item/projectile/bullet/spinfusor - name ="spinfusor disk" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state= "spinner" - damage = 30 - dismemberment = 25 - -/obj/item/projectile/bullet/spinfusor/on_hit(atom/target, blocked = FALSE) //explosion to emulate the spinfusor's AOE - ..() - explosion(target, -1, -1, 2, 0, -1) - return 1 - -/obj/item/ammo_casing/caseless/spinfusor - name = "spinfusor disk" - desc = "A magnetic disk designed specifically for the Stormhammer magnetic cannon. Warning: extremely volatile!" - projectile_type = /obj/item/projectile/bullet/spinfusor - caliber = "spinfusor" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "disk" - throwforce = 15 //still deadly when thrown - throw_speed = 3 - -/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/target) //disks detonate when thrown - if(!..()) // not caught in mid-air - visible_message("[src] detonates!") - playsound(src.loc, "sparks", 50, 1) - explosion(target, -1, -1, 1, 1, -1) - qdel(src) - return 1 - -/obj/item/ammo_box/magazine/internal/spinfusor - name = "spinfusor internal magazine" - ammo_type = /obj/item/ammo_casing/caseless/spinfusor - caliber = "spinfusor" - max_ammo = 1 - -/obj/item/gun/ballistic/automatic/spinfusor - name = "Stormhammer Magnetic Cannon" - desc = "An innovative weapon utilizing mag-lev technology to spin up a magnetic fusor and launch it at extreme velocities." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "spinfusor" - item_state = "spinfusor" - mag_type = /obj/item/ammo_box/magazine/internal/spinfusor - fire_sound = 'sound/weapons/rocketlaunch.ogg' - w_class = WEIGHT_CLASS_BULKY - can_suppress = 0 - burst_size = 1 - fire_delay = 40 - select = 0 - actions_types = list() - casing_ejector = 0 - -/obj/item/gun/ballistic/automatic/spinfusor/attackby(obj/item/A, mob/user, params) - var/num_loaded = magazine.attackby(A, user, params, 1) - if(num_loaded) - to_chat(user, "You load [num_loaded] disk\s into \the [src].") - update_icon() - chamber_round() - -/obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user) - return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor - -/obj/item/gun/ballistic/automatic/spinfusor/update_icon() - ..() - icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]" - -/obj/item/ammo_box/aspinfusor - name = "ammo box (spinfusor disks)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "spinfusorbox" - ammo_type = /obj/item/ammo_casing/caseless/spinfusor - max_ammo = 8 - -/datum/supply_pack/security/armory/spinfusor - name = "Stormhammer Spinfusor Crate" - cost = 14000 - contains = list(/obj/item/gun/ballistic/automatic/spinfusor, - /obj/item/gun/ballistic/automatic/spinfusor) - crate_name = "spinfusor crate" - -/datum/supply_pack/security/armory/spinfusorammo - name = "Spinfusor Disk Crate" - cost = 7000 - contains = list(/obj/item/ammo_box/aspinfusor, - /obj/item/ammo_box/aspinfusor, - /obj/item/ammo_box/aspinfusor, - /obj/item/ammo_box/aspinfusor) - crate_name = "spinfusor disk crate" - -///////XCOM X9 AR/////// - -/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them - name = "\improper X9 Assault Rifle" - desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "x9" - item_state = "arg" - slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG - fire_sound = 'sound/weapons/gunshot_smg.ogg' - can_suppress = 0 - burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine. - fire_delay = 1 - spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable - recoil = 1 - -///toy memes/// - -/obj/item/ammo_box/magazine/toy/x9 - name = "foam force X9 magazine" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "toy9magazine" - max_ammo = 30 - multiple_sprites = 2 - materials = list(MAT_METAL = 200) - -/obj/item/gun/ballistic/automatic/x9/toy - name = "\improper Foam Force X9" - desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "toy9" - can_suppress = 0 - obj_flags = 0 - mag_type = /obj/item/ammo_box/magazine/toy/x9 - casing_ejector = 0 - spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread) - w_class = WEIGHT_CLASS_BULKY - weapon_weight = WEAPON_HEAVY - -////////XCOM2 Magpistol///////// - -//////projectiles////// - -/obj/item/projectile/bullet/mags - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile" - damage = 15 - armour_penetration = 10 - light_range = 2 - speed = 0.6 - range = 25 - light_color = LIGHT_COLOR_RED - -/obj/item/projectile/bullet/nlmags //non-lethal boolets - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile-nl" - damage = 0 - knockdown = 0 - stamina = 25 - armour_penetration = -10 - light_range = 2 - speed = 0.7 - range = 25 - light_color = LIGHT_COLOR_BLUE - - -/////actual ammo///// - -/obj/item/ammo_casing/caseless/amags - desc = "A ferromagnetic slug intended to be launched out of a compatible weapon." - caliber = "mags" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mag-casing-live" - projectile_type = /obj/item/projectile/bullet/mags - -/obj/item/ammo_casing/caseless/anlmags - desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload." - caliber = "mags" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mag-casing-live" - projectile_type = /obj/item/projectile/bullet/nlmags - -//////magazines///// - -/obj/item/ammo_box/magazine/mmag/small - name = "magpistol magazine (non-lethal disabler)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "nlmagmag" - ammo_type = /obj/item/ammo_casing/caseless/anlmags - caliber = "mags" - max_ammo = 15 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/mmag/small/lethal - name = "magpistol magazine (lethal)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "smallmagmag" - ammo_type = /obj/item/ammo_casing/caseless/amags - -//////the gun itself////// - -/obj/item/gun/ballistic/automatic/pistol/mag - name = "magpistol" - desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magpistol" - force = 10 - fire_sound = 'sound/weapons/magpistol.ogg' - mag_type = /obj/item/ammo_box/magazine/mmag/small - can_suppress = 0 - casing_ejector = 0 - fire_delay = 2 - -/obj/item/gun/ballistic/automatic/pistol/mag/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("magpistol-magazine") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -///research memes/// - -/obj/item/gun/ballistic/automatic/pistol/mag/nopin - pin = null - spawnwithmagazine = FALSE - -/datum/design/magpistol - name = "Magpistol" - desc = "A weapon which fires ferromagnetic slugs." - id = "magpisol" - build_type = PROTOLATHE - materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000) - build_path = /obj/item/gun/ballistic/automatic/pistol/mag/nopin - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/mag_magpistol - name = "Magpistol Magazine" - desc = "A 14 round magazine for the Magpistol." - id = "mag_magpistol" - build_type = PROTOLATHE - materials = list(MAT_METAL = 4000, MAT_SILVER = 500) - build_path = /obj/item/ammo_box/magazine/mmag/small/lethal - category = list("Ammo") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/mag_magpistol/nl - name = "Magpistol Magazine (Non-Lethal)" - desc = "A 14 round non-lethal magazine for the Magpistol." - id = "mag_magpistol_nl" - materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250) - build_path = /obj/item/ammo_box/magazine/mmag/small - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -//////toy memes///// - -/obj/item/projectile/bullet/reusable/foam_dart/mag - name = "magfoam dart" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile-toy" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag - light_range = 2 - light_color = LIGHT_COLOR_YELLOW - -/obj/item/ammo_casing/caseless/foam_dart/mag - name = "magfoam dart" - desc = "A foam dart with fun light-up projectiles powered by magnets!" - projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag - -/obj/item/ammo_box/magazine/internal/shot/toy/mag - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag - max_ammo = 14 - -/obj/item/gun/ballistic/shotgun/toy/mag - name = "foam force magpistol" - desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "toymag" - item_state = "gun" - mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag - fire_sound = 'sound/weapons/magpistol.ogg' - slot_flags = SLOT_BELT - w_class = WEIGHT_CLASS_SMALL - -/obj/item/ammo_box/foambox/mag - name = "ammo box (Magnetic Foam Darts)" - icon = 'icons/obj/guns/toy.dmi' - icon_state = "foambox" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag - max_ammo = 42 - -//////Magrifle////// - -///projectiles/// - -/obj/item/projectile/bullet/magrifle - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile-large" - damage = 20 - armour_penetration = 25 - light_range = 3 - speed = 0.7 - range = 35 - light_color = LIGHT_COLOR_RED - -/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile-large-nl" - damage = 0 - knockdown = 0 - stamina = 20 - armour_penetration = -10 - light_range = 3 - speed = 0.65 - range = 35 - light_color = LIGHT_COLOR_BLUE - -///ammo casings/// - -/obj/item/ammo_casing/caseless/amagm - desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon." - caliber = "magm" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mag-casing-live" - projectile_type = /obj/item/projectile/bullet/magrifle - -/obj/item/ammo_casing/caseless/anlmagm - desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload." - caliber = "magm" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mag-casing-live" - projectile_type = /obj/item/projectile/bullet/nlmagrifle - -///magazines/// - -/obj/item/ammo_box/magazine/mmag/ - name = "magrifle magazine (non-lethal disabler)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mediummagmag" - ammo_type = /obj/item/ammo_casing/caseless/anlmagm - caliber = "magm" - max_ammo = 24 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/mmag/lethal - name = "magrifle magazine (lethal)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "mediummagmag" - ammo_type = /obj/item/ammo_casing/caseless/amagm - max_ammo = 24 - -///the gun itself/// - -/obj/item/gun/ballistic/automatic/magrifle - name = "\improper Magnetic Rifle" - desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magrifle" - item_state = "arg" - slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/mmag - fire_sound = 'sound/weapons/magrifle.ogg' - can_suppress = 0 - burst_size = 3 - fire_delay = 2 - spread = 20 - recoil = 1 - casing_ejector = 0 - -///research/// - -/obj/item/gun/ballistic/automatic/magrifle/nopin - pin = null - spawnwithmagazine = FALSE - -/datum/design/magrifle - name = "Magrifle" - desc = "An upscaled Magpistol in rifle form." - id = "magrifle" - build_type = PROTOLATHE - materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000) - build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin - category = list("Weapons") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/mag_magrifle - name = "Magrifle Magazine (Lethal)" - desc = "A 24-round magazine for the Magrifle." - id = "mag_magrifle" - build_type = PROTOLATHE - materials = list(MAT_METAL = 8000, MAT_SILVER = 1000) - build_path = /obj/item/ammo_box/magazine/mmag/lethal - category = list("Ammo") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/mag_magrifle/nl - name = "Magrifle Magazine (Non-Lethal)" - desc = "A 24- round non-lethal magazine for the Magrifle." - id = "mag_magrifle_nl" - materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500) - build_path = /obj/item/ammo_box/magazine/mmag - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -///foamagrifle/// - -/obj/item/ammo_box/magazine/toy/foamag - name = "foam force magrifle magazine" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "foamagmag" - max_ammo = 24 - multiple_sprites = 2 - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag - materials = list(MAT_METAL = 200) - -/obj/item/gun/ballistic/automatic/magrifle/toy - name = "foamag rifle" - desc = "A foam launching magnetic rifle. Ages 8 and up." - icon_state = "foamagrifle" - obj_flags = 0 - mag_type = /obj/item/ammo_box/magazine/toy/foamag - casing_ejector = FALSE - spread = 60 - w_class = WEIGHT_CLASS_BULKY - weapon_weight = WEAPON_HEAVY - -/* -// TECHWEBS IMPLEMENTATION -*/ - -/datum/techweb_node/magnetic_weapons - id = "magnetic_weapons" - display_name = "Magnetic Weapons" - description = "Weapons using magnetic technology" - prereq_ids = list("weaponry", "adv_weaponry", "emp_adv") - design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl") - research_cost = 2500 - export_price = 5000 - - -//////Hyper-Burst Rifle////// - -///projectiles/// - -/obj/item/projectile/bullet/mags/hyper - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile" - damage = 10 - armour_penetration = 10 - stamina = 10 - forcedodge = TRUE - range = 6 - light_range = 1 - light_color = LIGHT_COLOR_RED - -/obj/item/projectile/bullet/mags/hyper/inferno - icon_state = "magjectile-large" - stamina = 0 - forcedodge = FALSE - range = 25 - light_range = 4 - -/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 1, 2, 4, 5) - return 1 - -///ammo casings/// - -/obj/item/ammo_casing/caseless/ahyper - desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle." - caliber = "hypermag" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "hyper-casing-live" - projectile_type = /obj/item/projectile/bullet/mags/hyper - pellets = 12 - variance = 40 - -/obj/item/ammo_casing/caseless/ahyper/inferno - projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno - pellets = 1 - variance = 0 - -///magazines/// - -/obj/item/ammo_box/magazine/mhyper - name = "hyper-burst rifle magazine" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "hypermag-4" - ammo_type = /obj/item/ammo_casing/caseless/ahyper - caliber = "hypermag" - desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range." - max_ammo = 4 - -/obj/item/ammo_box/magazine/mhyper/update_icon() - ..() - icon_state = "hypermag-[ammo_count() ? "4" : "0"]" - -/obj/item/ammo_box/magazine/mhyper/inferno - name = "hyper-burst rifle magazine (inferno)" - ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno - desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light." - -///gun itself/// - -/obj/item/gun/ballistic/automatic/hyperburst - name = "\improper Hyper-Burst Rifle" - desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "hyperburst" - item_state = "arg" - slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/mhyper - fire_sound = 'sound/weapons/magburst.ogg' - can_suppress = 0 - burst_size = 1 - fire_delay = 40 - recoil = 2 - casing_ejector = 0 - weapon_weight = WEAPON_HEAVY - -/obj/item/gun/ballistic/automatic/hyperburst/update_icon() - ..() - icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]" - -///toy memes/// - -/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "magjectile-toy" - name = "lasertag magbolt" - forcedodge = TRUE //for penetration memes - range = 5 //so it isn't super annoying - light_range = 2 - light_color = LIGHT_COLOR_YELLOW - eyeblur = 0 - -/obj/item/ammo_casing/energy/laser/magtag - projectile_type = /obj/item/projectile/beam/lasertag/mag - select_name = "magtag" - pellets = 3 - variance = 30 - e_cost = 1000 - fire_sound = 'sound/weapons/magburst.ogg' - -/obj/item/gun/energy/laser/practice/hyperburst - name = "toy hyper-burst launcher" - desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems." - ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag) - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "toyburst" - clumsy_check = FALSE - obj_flags = 0 - fire_delay = 40 - weapon_weight = WEAPON_HEAVY - selfcharge = TRUE - charge_delay = 2 - recoil = 2 - cell_type = /obj/item/stock_parts/cell/toymagburst - -/obj/item/stock_parts/cell/toymagburst - name = "toy mag burst rifle power supply" - maxcharge = 4000 - -/* made redundant by reskinnable stetchkins -//////Stealth Pistol////// - -/obj/item/gun/ballistic/automatic/pistol/stealth - name = "stealth pistol" - desc = "A unique bullpup pistol with a compact frame. Has an integrated surpressor." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "stealthpistol" - w_class = WEIGHT_CLASS_SMALL - mag_type = /obj/item/ammo_box/magazine/m10mm - can_suppress = 0 - fire_sound = 'sound/weapons/gunshot_silenced.ogg' - suppressed = 1 - burst_size = 1 - -/obj/item/gun/ballistic/automatic/pistol/stealth/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("stealthpistol-magazine") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -*/ - -///foam stealth pistol/// - -/obj/item/gun/ballistic/automatic/toy/pistol/stealth - name = "foam force stealth pistol" - desc = "A small, easily concealable toy bullpup handgun. Ages 8 and up." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "foamsp" - w_class = WEIGHT_CLASS_SMALL - mag_type = /obj/item/ammo_box/magazine/toy/pistol - can_suppress = FALSE - fire_sound = 'sound/weapons/gunshot_silenced.ogg' - suppressed = TRUE - burst_size = 1 - fire_delay = 0 - spread = 60 - actions_types = list() - -/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("foamsp-magazine") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -//////10mm soporific bullets////// - -obj/item/projectile/bullet/c10mm/soporific - name ="10mm soporific bullet" - armour_penetration = 0 - nodamage = TRUE - dismemberment = 0 - knockdown = 0 - -/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && isliving(target)) - var/mob/living/L = target - L.blur_eyes(6) - if(L.getStaminaLoss() >= 60) - L.Sleeping(300) - else - L.adjustStaminaLoss(25) - return 1 - -/obj/item/ammo_casing/c10mm/soporific - name = ".10mm soporific bullet casing" - desc = "A 10mm soporific bullet casing." - projectile_type = /obj/item/projectile/bullet/c10mm/soporific - -/obj/item/ammo_box/magazine/m10mm/soporific - name = "pistol magazine (10mm soporific)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "9x19pS" - desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target." - ammo_type = /obj/item/ammo_casing/c10mm/soporific - -/obj/item/ammo_box/c10mm/soporific - name = "ammo box (10mm soporific)" - ammo_type = /obj/item/ammo_casing/c10mm/soporific - max_ammo = 24 - -//////Flechette Launcher////// - -///projectiles/// - -/obj/item/projectile/bullet/cflechetteap //shreds armor - name = "flechette (armor piercing)" - damage = 8 - armour_penetration = 80 - -/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding - name = "flechette (serrated)" - damage = 15 - dismemberment = 10 - armour_penetration = -80 - -/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && iscarbon(target)) - var/mob/living/carbon/C = target - C.bleed(10) - return ..() - -///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)/// - -/obj/item/ammo_casing/caseless/flechetteap - name = "flechette (armor piercing)" - desc = "A flechette made with a tungsten alloy." - projectile_type = /obj/item/projectile/bullet/cflechetteap - caliber = "flechette" - throwforce = 1 - throw_speed = 3 - -/obj/item/ammo_casing/caseless/flechettes - name = "flechette (serrated)" - desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh." - projectile_type = /obj/item/projectile/bullet/cflechettes - caliber = "flechette" - throwforce = 2 - throw_speed = 3 - embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10) - -///magazine/// - -/obj/item/ammo_box/magazine/flechette - name = "flechette magazine (armor piercing)" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "flechettemag" - ammo_type = /obj/item/ammo_casing/caseless/flechetteap - caliber = "flechette" - max_ammo = 40 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/flechette/s - name = "flechette magazine (serrated)" - ammo_type = /obj/item/ammo_casing/caseless/flechettes - -///the gun itself/// - -/obj/item/gun/ballistic/automatic/flechette - name = "\improper CX Flechette Launcher" - desc = "A flechette launching machine pistol with an unconventional bullpup frame." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "flechettegun" - item_state = "gun" - w_class = WEIGHT_CLASS_NORMAL - slot_flags = 0 - /obj/item/device/firing_pin/implant/pindicate - mag_type = /obj/item/ammo_box/magazine/flechette/ - fire_sound = 'sound/weapons/gunshot_smg.ogg' - can_suppress = 0 - burst_size = 5 - fire_delay = 1 - casing_ejector = 0 - spread = 20 - -/obj/item/gun/ballistic/automatic/flechette/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("flechettegun-magazine") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -///unique variant/// - -/obj/item/projectile/bullet/cflechetteshredder - name = "flechette (shredder)" - damage = 5 - dismemberment = 40 - -/obj/item/ammo_casing/caseless/flechetteshredder - name = "flechette (shredder)" - desc = "A serrated flechette made of a special alloy that forms a monofilament edge." - projectile_type = /obj/item/projectile/bullet/cflechettes - -/obj/item/ammo_box/magazine/flechette/shredder - name = "flechette magazine (shredder)" - icon_state = "shreddermag" - ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder - -/obj/item/gun/ballistic/automatic/flechette/shredder - name = "\improper CX Shredder" - desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes." - w_class = WEIGHT_CLASS_SMALL - mag_type = /obj/item/ammo_box/magazine/flechette/shredder - spread = 30 - -/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("shreddergun-magazine") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -//////modular pistol////// (reskinnable stetchkins) - -/obj/item/gun/ballistic/automatic/pistol/modular - name = "modular pistol" - desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "cde" - can_unsuppress = TRUE - obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "cde", - "NT-99" = "n99", - "Stealth" = "stealthpistol", - "HKVP-78" = "vp78", - "Luger" = "p08b", - "Mk.58" = "secguncomp", - "PX4 Storm" = "px4" - ) - -/obj/item/gun/ballistic/automatic/pistol/modular/update_icon() - ..() - if(current_skin) - icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" - else - icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" - if(magazine && suppressed) - cut_overlays() - add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay - else if (magazine) - cut_overlays() - add_overlay("[unique_reskin[current_skin]]-magazine") - else - cut_overlays() - -/////////RAYGUN MEMES///////// - -/obj/item/projectile/beam/lasertag/ray //the projectile, compatible with regular laser tag armor - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "ray" - name = "ray bolt" - eyeblur = 0 - -/obj/item/ammo_casing/energy/laser/raytag - projectile_type = /obj/item/projectile/beam/lasertag/ray - select_name = "raytag" - fire_sound = 'sound/weapons/raygun.ogg' - -/obj/item/gun/energy/laser/practice/raygun - name = "toy ray gun" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "raygun" - desc = "A toy laser with a classic, retro feel and look. Compatible with existing laser tag systems." - ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag) - selfcharge = TRUE - -/*///////////////////////////////////////////////////////////////////////////////////////////// - The Recolourable Gun -*////////////////////////////////////////////////////////////////////////////////////////////// - -/obj/item/gun/ballistic/automatic/pistol/p37 - name = "\improper CX Mk.37P" - desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. \ - This model is coated with a special polychromic material. \ - Has a small warning on the receiver that boldly states 'WARNING: WILL DETONATE UPON UNAUTHORIZED USE'. \ - Uses 9mm bullets loaded into proprietary magazines." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "p37" - w_class = WEIGHT_CLASS_NORMAL - spawnwithmagazine = FALSE - mag_type = /obj/item/ammo_box/magazine/m9mm/p37 - can_suppress = FALSE - pin = /obj/item/device/firing_pin/dna/dredd //goes boom if whoever isn't DNA locked to it tries to use it - actions_types = list(/datum/action/item_action/pick_color) - - var/frame_color = "#808080" //RGB - var/receiver_color = "#808080" - var/body_color = "#0098FF" - var/barrel_color = "#808080" - var/tip_color = "#808080" - var/arm_color = "#808080" - var/grip_color = "#00FFCB" //Does not actually colour the grip, just the lights surrounding it - var/energy_color = "#00FFCB" - -///Defining all the colourable bits and displaying them/// - -/obj/item/gun/ballistic/automatic/pistol/p37/update_icon() - var/mutable_appearance/frame_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_frame") - var/mutable_appearance/receiver_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_receiver") - var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_body") - var/mutable_appearance/barrel_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_barrel") - var/mutable_appearance/tip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_tip") - var/mutable_appearance/grip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_grip") - var/mutable_appearance/energy_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_light") - var/mutable_appearance/arm_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm") - var/mutable_appearance/arm_overlay_e = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm-e") - - if(frame_color) - frame_overlay.color = frame_color - if(receiver_color) - receiver_overlay.color = receiver_color - if(body_color) - body_overlay.color = body_color - if(barrel_color) - barrel_overlay.color = barrel_color - if(tip_color) - tip_overlay.color = tip_color - if(grip_color) - grip_overlay.color = grip_color - if(energy_color) - energy_overlay.color = energy_color - if(arm_color) - arm_overlay.color = arm_color - if(arm_color) - arm_overlay_e.color = arm_color - - cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other - - add_overlay(frame_overlay) - add_overlay(receiver_overlay) - add_overlay(body_overlay) - add_overlay(barrel_overlay) - add_overlay(tip_overlay) - add_overlay(grip_overlay) - add_overlay(energy_overlay) - - if(magazine) //does not need a cut_overlays proc call here because it's already called further up - add_overlay("p37_mag") - - if(chambered) - cut_overlay(arm_overlay_e) - add_overlay(arm_overlay) - else - cut_overlay(arm_overlay) - add_overlay(arm_overlay_e) - -///letting you actually recolor things/// - -/obj/item/gun/ballistic/automatic/pistol/p37/ui_action_click(mob/user, var/datum/action/A) - if(istype(A, /datum/action/item_action/pick_color)) - - var/choice = input(user,"Mk.37P polychrome options", "Gun Recolor") in list("Frame Color","Receiver Color","Body Color", - "Barrel Color", "Barrel Tip Color", "Grip Light Color", - "Light Color", "Arm Color", "*CANCEL*") - - switch(choice) - - if("Frame Color") - var/frame_color_input = input(usr,"","Choose Frame Color",frame_color) as color|null - if(frame_color_input) - frame_color = sanitize_hexcolor(frame_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Receiver Color") - var/receiver_color_input = input(usr,"","Choose Receiver Color",receiver_color) as color|null - if(receiver_color_input) - receiver_color = sanitize_hexcolor(receiver_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Body Color") - var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null - if(body_color_input) - body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Barrel Color") - var/barrel_color_input = input(usr,"","Choose Barrel Color",barrel_color) as color|null - if(barrel_color_input) - barrel_color = sanitize_hexcolor(barrel_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Barrel Tip Color") - var/tip_color_input = input(usr,"","Choose Barrel Tip Color",tip_color) as color|null - if(tip_color_input) - tip_color = sanitize_hexcolor(tip_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Grip Light Color") - var/grip_color_input = input(usr,"","Choose Grip Light Color",grip_color) as color|null - if(grip_color_input) - grip_color = sanitize_hexcolor(grip_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Light Color") - var/energy_color_input = input(usr,"","Choose Light Color",energy_color) as color|null - if(energy_color_input) - energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) - update_icon() - - if("Arm Color") - var/arm_color_input = input(usr,"","Choose Arm Color",arm_color) as color|null - if(arm_color_input) - arm_color = sanitize_hexcolor(arm_color_input, desired_format=6, include_crunch=1) - update_icon() - A.UpdateButtonIcon() - - else - ..() - -///boolets/// - -/obj/item/projectile/bullet/c9mm/frangible - name = "9mm frangible bullet" - damage = 15 - stamina = 0 - speed = 1.0 - range = 20 - armour_penetration = -25 - -/obj/item/projectile/bullet/c9mm/rubber - name = "9mm rubber bullet" - damage = 5 - stamina = 30 - speed = 1.2 - range = 14 - knockdown = 0 - -/obj/item/ammo_casing/c9mm/frangible - name = "9mm frangible bullet casing" - desc = "A 9mm frangible bullet casing." - projectile_type = /obj/item/projectile/bullet/c9mm/frangible - -/obj/item/ammo_casing/c9mm/rubber - name = "9mm rubber bullet casing" - desc = "A 9mm rubber bullet casing." - projectile_type = /obj/item/projectile/bullet/c9mm/rubber - -/obj/item/ammo_box/magazine/m9mm/p37 - name = "\improper P37 magazine (9mm frangible)" - desc = "A gun magazine. Loaded with plastic composite rounds which fragment upon impact to minimize collateral damage." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "11mm" //topkek - ammo_type = /obj/item/ammo_casing/c9mm/frangible - caliber = "9mm" - max_ammo = 11 - multiple_sprites = 1 - -/obj/item/ammo_box/magazine/m9mm/p37/fmj - name = "\improper P37 magazine (9mm)" - ammo_type = /obj/item/ammo_casing/c9mm - desc = "A gun magazine. Loaded with conventional full metal jacket rounds." - -/obj/item/ammo_box/magazine/m9mm/p37/rubber - name = "\improper P37 magazine (9mm Non-Lethal Rubbershot)" - ammo_type = /obj/item/ammo_casing/c9mm/rubber - desc = "A gun magazine. Loaded with less-than-lethal rubber bullets." - -/obj/item/ammo_box/c9mm/frangible - name = "ammo box (9mm frangible)" - ammo_type = /obj/item/ammo_casing/c9mm/frangible - -/obj/item/ammo_box/c9mm/rubber - name = "ammo box (9mm non-lethal rubbershot)" - ammo_type = /obj/item/ammo_casing/c9mm/rubber - -/datum/design/c9mmfrag - name = "Box of 9mm Frangible Bullets" - id = "9mm_frag" - build_type = AUTOLATHE - materials = list(MAT_METAL = 25000) - build_path = /obj/item/ammo_box/c9mm/frangible - category = list("hacked", "Security") - -/datum/design/c9mmrubber - name = "Box of 9mm Rubber Bullets" - id = "9mm_rubber" - build_type = AUTOLATHE - materials = list(MAT_METAL = 30000) - build_path = /obj/item/ammo_box/c9mm/rubber - category = list("initial", "Security") - - -///Security Variant/// - -/obj/item/gun/ballistic/automatic/pistol/p37/sec - name = "\improper CX Mk.37S" - desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. Uses 9mm bullets loaded into proprietary magazines." - spawnwithmagazine = FALSE - pin = /obj/item/device/firing_pin/implant/mindshield - actions_types = list() //so you can't recolor it - - frame_color = "#808080" //RGB - receiver_color = "#808080" - body_color = "#282828" - barrel_color = "#808080" - tip_color = "#808080" - arm_color = "#800000" - grip_color = "#FFFF00" //Does not actually colour the grip, just the lights surrounding it - energy_color = "#FFFF00" - -///Foam Variant because WE NEED MEMES/// - -/obj/item/gun/ballistic/automatic/pistol/p37/foam - name = "\improper Foam Force Mk.37F" - desc = "A licensed foam-firing reproduction of a handgun with a toggle-locking mechanism manufactured by CX Armories. This model is coated with a special polychromic material. Uses standard foam pistol magazines." - icon_state = "p37_foam" - pin = /obj/item/device/firing_pin - spawnwithmagazine = TRUE - obj_flags = 0 - casing_ejector = FALSE - mag_type = /obj/item/ammo_box/magazine/toy/pistol - can_suppress = FALSE - actions_types = list(/datum/action/item_action/pick_color) - -/*///////////////////////////////////////////////////////////////////////////////////////////// - The Recolourable Energy Gun -*////////////////////////////////////////////////////////////////////////////////////////////// - -obj/item/gun/energy/e_gun/cx - name = "\improper CX Model D Energy Gun" - desc = "An overpriced hybrid energy gun with two settings: disable, and kill. Manufactured by CX Armories. Has a polychromic coating." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "cxe" - lefthand_file = 'icons/mob/citadel/guns_lefthand.dmi' - righthand_file = 'icons/mob/citadel/guns_righthand.dmi' - ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) - flight_x_offset = 15 - flight_y_offset = 10 - var/body_color = "#252528" - -obj/item/gun/energy/e_gun/cx/update_icon() - ..() - var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "cxegun_body") - if(body_color) - body_overlay.color = body_color - add_overlay(body_overlay) - - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() - -obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user) - if(!in_range(src, user)) //Basic checks to prevent abuse - return - if(user.incapacitated() || !istype(user)) - to_chat(user, "You can't do that right now!") - return - if(alert("Are you sure you want to repaint your gun?", "Confirm Repaint", "Yes", "No") == "Yes") - var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null - if(body_color_input) - body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) - update_icon() - -obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file) - . = ..() - if(isinhands) - var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body") - body_inhand.color = body_color - . += body_inhand - -/obj/item/ammo_box/magazine/toy/pistol //forcing this might be a bad idea, but it'll fix the foam gun infinite material exploit - materials = list(MAT_METAL = 200) - -/*///////////////////////////////////////////////////////////// -//////////////////////// Zero's Meme ////////////////////////// -*////////////////////////////////////////////////////////////// -/obj/item/ammo_box/magazine/toy/AM4B - name = "foam force AM4-B magazine" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "AM4MAG-60" - max_ammo = 60 - multiple_sprites = 0 - materials = list(MAT_METAL = 200) - -/obj/item/gun/ballistic/automatic/AM4B - name = "AM4-B" - desc = "A Relic from a bygone age. Nobody quite knows why it's here. Has a polychromic coating." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "AM4" - item_state = "arg" - mag_type = /obj/item/ammo_box/magazine/toy/AM4B - can_suppress = 0 - item_flags = NEEDS_PERMIT - casing_ejector = 0 - spread = 30 //Assault Rifleeeeeee - w_class = WEIGHT_CLASS_NORMAL - burst_size = 4 //Shh. - fire_delay = 1 - var/body_color = "#3333aa" - -/obj/item/gun/ballistic/automatic/AM4B/update_icon() - ..() - var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "AM4-Body") - if(body_color) - body_overlay.color = body_color - cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other - add_overlay(body_overlay) - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() -/obj/item/gun/ballistic/automatic/AM4B/AltClick(mob/living/user) - if(!in_range(src, user)) //Basic checks to prevent abuse - return - if(user.incapacitated() || !istype(user)) - to_chat(user, "You can't do that right now!") - return - if(alert("Are you sure you want to recolor your gun?", "Confirm Repaint", "Yes", "No") == "Yes") - var/body_color_input = input(usr,"","Choose Shroud Color",body_color) as color|null - if(body_color_input) - body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) - update_icon() -/obj/item/gun/ballistic/automatic/AM4B/examine(mob/user) - ..() - to_chat(user, "Alt-click to recolor it.") - -/obj/item/ammo_box/magazine/toy/AM4C - name = "foam force AM4-C magazine" - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "AM4MAG-32" - max_ammo = 32 - multiple_sprites = 0 - materials = list(MAT_METAL = 200) - -/obj/item/gun/ballistic/automatic/AM4C - name = "AM4-C" - desc = "A Relic from a bygone age. This one seems newer, yet less effective." - icon = 'icons/obj/guns/cit_guns.dmi' - icon_state = "AM4C" - item_state = "arg" - mag_type = /obj/item/ammo_box/magazine/toy/AM4C - can_suppress = 0 - item_flags = NEEDS_PERMIT - casing_ejector = 0 - spread = 45 //Assault Rifleeeeeee - w_class = WEIGHT_CLASS_NORMAL - burst_size = 4 //Shh. - fire_delay = 1 diff --git a/code/citadel/cit_uniforms.dm b/code/citadel/cit_uniforms.dm deleted file mode 100644 index fc7e03a676..0000000000 --- a/code/citadel/cit_uniforms.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/item/clothing/under/bb_sweater - name = "cream sweater" - desc = "Why trade style for comfort? Now you can go commando down south and still be cozy up north." - icon_state = "bb_turtle" - item_state = "w_suit" - item_color = "bb_turtle" - body_parts_covered = CHEST|ARMS - can_adjust = 1 - icon = 'icons/obj/clothing/turtlenecks.dmi' - icon_override = 'icons/mob/citadel/uniforms.dmi' - -/obj/item/clothing/under/bb_sweater/black - name = "black sweater" - icon_state = "bb_turtleblk" - item_state = "bl_suit" - item_color = "bb_turtleblk" - -/obj/item/clothing/under/bb_sweater/purple - name = "purple sweater" - icon_state = "bb_turtlepur" - item_state = "p_suit" - item_color = "bb_turtlepur" - -/obj/item/clothing/under/bb_sweater/green - name = "green sweater" - icon_state = "bb_turtlegrn" - item_state = "g_suit" - item_color = "bb_turtlegrn" - -/obj/item/clothing/under/bb_sweater/red - name = "red sweater" - icon_state = "bb_turtlered" - item_state = "r_suit" - item_color = "bb_turtlered" - -/obj/item/clothing/under/bb_sweater/blue - name = "blue sweater" - icon_state = "bb_turtleblu" - item_state = "b_suit" - item_color = "bb_turtleblu" diff --git a/code/citadel/cit_vendors.dm b/code/citadel/cit_vendors.dm deleted file mode 100644 index c8ae48c251..0000000000 --- a/code/citadel/cit_vendors.dm +++ /dev/null @@ -1,102 +0,0 @@ -#define STANDARD_CHARGE 1 -#define CONTRABAND_CHARGE 2 -#define COIN_CHARGE 3 - -/obj/machinery/vending/kink - name = "KinkMate" - desc = "A vending machine for all your unmentionable desires." - icon = 'icons/obj/citvending.dmi' - icon_state = "kink" - product_slogans = "Kinky!;Sexy!;Check me out, big boy!" - vend_reply = "Have fun, you shameless pervert!" - products = list( - /obj/item/clothing/under/maid = 5, - /obj/item/clothing/under/stripper_pink = 5, - /obj/item/clothing/under/stripper_green = 5, - /obj/item/dildo/custom = 5 - ) - contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5, - /obj/item/clothing/neck/petcollar = 5, - /obj/item/clothing/under/mankini = 1, - /obj/item/dildo/flared/huge = 1 - ) - premium = list(/obj/item/device/electropack/shockcollar = 1) - refill_canister = /obj/item/vending_refill/kink -/* -/obj/machinery/vending/nazivend - name = "Nazivend" - desc = "A vending machine containing Nazi German supplies. A label reads: \"Remember the gorrilions lost.\"" - icon = 'icons/obj/citvending.dmi' - icon_state = "nazi" - vend_reply = "SIEG HEIL!" - product_slogans = "Das Vierte Reich wird zuruckkehren!;ENTFERNEN JUDEN!;Billiger als die Juden jemals geben!;Rader auf dem adminbus geht rund und rund.;Warten Sie, warum wir wieder hassen Juden?- *BZZT*" - products = list( - /obj/item/clothing/head/stalhelm = 20, - /obj/item/clothing/head/panzer = 20, - /obj/item/clothing/suit/soldiercoat = 20, - // /obj/item/clothing/under/soldieruniform = 20, - /obj/item/clothing/shoes/jackboots = 20 - ) - contraband = list( - /obj/item/clothing/head/naziofficer = 10, - // /obj/item/clothing/suit/officercoat = 10, - // /obj/item/clothing/under/officeruniform = 10, - /obj/item/clothing/suit/space/hardsuit/nazi = 3, - /obj/item/gun/energy/plasma/MP40k = 4 - ) - premium = list() - - refill_canister = /obj/item/vending_refill/nazi -*/ -/obj/machinery/vending/sovietvend - name = "KomradeVendtink" - desc = "Rodina-mat' zovyot!" - icon = 'icons/obj/citvending.dmi' - icon_state = "soviet" - vend_reply = "The fascist and capitalist svin'ya shall fall, komrade!" - product_slogans = "Quality worth waiting in line for!; Get Hammer and Sickled!; Sosvietsky soyuz above all!; With capitalist pigsky, you would have paid a fortunetink! ; Craftink in Motherland herself!" - products = list( - /obj/item/clothing/under/soviet = 20, - /obj/item/clothing/head/ushanka = 20, - /obj/item/clothing/shoes/jackboots = 20, - /obj/item/clothing/head/squatter_hat = 20, - /obj/item/clothing/under/squatter_outfit = 20, - /obj/item/clothing/under/russobluecamooutfit = 20, - /obj/item/clothing/head/russobluecamohat = 20 - ) - contraband = list( - /obj/item/clothing/under/syndicate/tacticool = 4, - /obj/item/clothing/mask/balaclava = 4, - /obj/item/clothing/suit/russofurcoat = 4, - /obj/item/clothing/head/russofurhat = 4, - /obj/item/clothing/suit/space/hardsuit/soviet = 3, - /obj/item/gun/energy/laser/LaserAK = 4 - ) - premium = list() - - refill_canister = /obj/item/vending_refill/soviet - - -#undef STANDARD_CHARGE -#undef CONTRABAND_CHARGE -#undef COIN_CHARGE - - -/obj/item/vending_refill/kink - machine_name = "KinkMate" - icon = 'modular_citadel/icons/vending_restock.dmi' - icon_state = "refill_kink" - charges = list(8, 5, 0)// of 20 standard, 12 contraband, 0 premium - init_charges = list(8, 5, 0) - -/obj/item/vending_refill/nazi - machine_name = "nazivend" - icon_state = "refill_nazi" - charges = list(33, 13, 0) - init_charges = list(33, 13, 0) - -/obj/item/vending_refill/soviet - machine_name = "sovietvend" - icon_state = "refill_soviet" - charges = list(47, 7, 0) - init_charges = list(47, 7, 0) diff --git a/code/citadel/discordbot.dm b/code/citadel/discordbot.dm deleted file mode 100644 index 41c0f21b49..0000000000 --- a/code/citadel/discordbot.dm +++ /dev/null @@ -1,13 +0,0 @@ -/proc/send2maindiscord(var/msg) - send2discord(msg, FALSE) - -/proc/send2admindiscord(var/msg, var/ping = FALSE) - send2discord(msg, TRUE, ping) - -/proc/send2discord(var/msg, var/admin = FALSE, var/ping = FALSE) -// if (!config.discord_url || !config.discord_password) -// return - -// var/url = "[config.discord_url]?pass=[url_encode(config.discord_password)]&admin=[admin ? "true" : "false"]&content=[url_encode(msg)]&ping=[ping ? "true" : "false"]" -// world.Export(url) - return \ No newline at end of file diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm deleted file mode 100644 index 1e4a574e13..0000000000 --- a/code/controllers/configuration.dm +++ /dev/null @@ -1,287 +0,0 @@ -GLOBAL_VAR_INIT(config_dir, "config/") -GLOBAL_PROTECT(config_dir) - -/datum/controller/configuration - name = "Configuration" - - var/hiding_entries_by_type = TRUE //Set for readability, admins can set this to FALSE if they want to debug it - var/list/entries - var/list/entries_by_type - - var/list/maplist - var/datum/map_config/defaultmap - - var/list/modes // allowed modes - var/list/gamemode_cache - var/list/votable_modes // votable modes - var/list/mode_names - var/list/mode_reports - var/list/mode_false_report_weight - -/datum/controller/configuration/New() - config = src - var/list/config_files = InitEntries() - LoadModes() - for(var/I in config_files) - LoadEntries(I) - if(Get(/datum/config_entry/flag/maprotation)) - loadmaplist(CONFIG_MAPS_FILE) - -/datum/controller/configuration/Destroy() - entries_by_type.Cut() - QDEL_LIST_ASSOC_VAL(entries) - QDEL_LIST_ASSOC_VAL(maplist) - QDEL_NULL(defaultmap) - - config = null - - return ..() - -/datum/controller/configuration/proc/InitEntries() - var/list/_entries = list() - entries = _entries - var/list/_entries_by_type = list() - entries_by_type = _entries_by_type - - . = list() - - for(var/I in typesof(/datum/config_entry)) //typesof is faster in this case - var/datum/config_entry/E = I - if(initial(E.abstract_type) == I) - continue - E = new I - _entries_by_type[I] = E - var/esname = E.name - var/datum/config_entry/test = _entries[esname] - if(test) - log_config("Error: [test.type] has the same name as [E.type]: [esname]! Not initializing [E.type]!") - qdel(E) - continue - _entries[esname] = E - .[E.resident_file] = TRUE - -/datum/controller/configuration/proc/RemoveEntry(datum/config_entry/CE) - entries -= CE.name - entries_by_type -= CE.type - -/datum/controller/configuration/proc/LoadEntries(filename) - log_config("Loading config file [filename]...") - var/list/lines = world.file2list("[GLOB.config_dir][filename]") - var/list/_entries = entries - for(var/L in lines) - if(!L) - continue - - if(copytext(L, 1, 2) == "#") - continue - - var/pos = findtext(L, " ") - var/entry = null - var/value = null - - if(pos) - entry = lowertext(copytext(L, 1, pos)) - value = copytext(L, pos + 1) - else - entry = lowertext(L) - - if(!entry) - continue - - var/datum/config_entry/E = _entries[entry] - if(!E) - log_config("Unknown setting in configuration: '[entry]'") - continue - - if(filename != E.resident_file) - log_config("Found [entry] in [filename] when it should have been in [E.resident_file]! Ignoring.") - continue - - var/validated = E.ValidateAndSet(value) - if(!validated) - log_config("Failed to validate setting \"[value]\" for [entry]") - else if(E.modified && !E.dupes_allowed) - log_config("Duplicate setting for [entry] ([value]) detected! Using latest.") - - if(validated) - E.modified = TRUE - -/datum/controller/configuration/can_vv_get(var_name) - return (var_name != "entries_by_type" || !hiding_entries_by_type) && ..() - -/datum/controller/configuration/vv_edit_var(var_name, var_value) - return !(var_name in list("entries_by_type", "entries")) && ..() - -/datum/controller/configuration/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Edit", src) - stat("[name]:", statclick) - -/datum/controller/configuration/proc/Get(entry_type) - if(IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Get" && GLOB.LastAdminCalledTargetRef == "\ref[src]") - log_admin_private("Config access of [entry_type] attempted by [key_name(usr)]") - return - var/datum/config_entry/E = entry_type - var/entry_is_abstract = initial(E.abstract_type) == entry_type - if(entry_is_abstract) - CRASH("Tried to retrieve an abstract config_entry: [entry_type]") - E = entries_by_type[entry_type] - if(!E) - CRASH("Missing config entry for [entry_type]!") - return E.value - -/datum/controller/configuration/proc/Set(entry_type, new_val) - if(IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Set" && GLOB.LastAdminCalledTargetRef == "\ref[src]") - log_admin_private("Config rewrite of [entry_type] to [new_val] attempted by [key_name(usr)]") - return - var/datum/config_entry/E = entry_type - var/entry_is_abstract = initial(E.abstract_type) == entry_type - if(entry_is_abstract) - CRASH("Tried to retrieve an abstract config_entry: [entry_type]") - E = entries_by_type[entry_type] - if(!E) - CRASH("Missing config entry for [entry_type]!") - return E.ValidateAndSet(new_val) - -/datum/controller/configuration/proc/LoadModes() - gamemode_cache = typecacheof(/datum/game_mode, TRUE) - modes = list() - mode_names = list() - mode_reports = list() - mode_false_report_weight = list() - votable_modes = list() - var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) - for(var/T in gamemode_cache) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - var/datum/game_mode/M = new T() - - if(M.config_tag) - if(!(M.config_tag in modes)) // ensure each mode is added only once - modes += M.config_tag - mode_names[M.config_tag] = M.name - probabilities[M.config_tag] = M.probability - mode_reports[M.config_tag] = M.generate_report() - mode_false_report_weight[M.config_tag] = M.false_report_weight - if(M.votable) - votable_modes += M.config_tag - qdel(M) - votable_modes += "secret" - -/datum/controller/configuration/proc/loadmaplist(filename) - filename = "[GLOB.config_dir][filename]" - var/list/Lines = world.file2list(filename) - - var/datum/map_config/currentmap = null - for(var/t in Lines) - if(!t) - continue - - t = trim(t) - if(length(t) == 0) - continue - else if(copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/command = null - var/data = null - - if(pos) - command = lowertext(copytext(t, 1, pos)) - data = copytext(t, pos + 1) - else - command = lowertext(t) - - if(!command) - continue - - if (!currentmap && command != "map") - continue - - switch (command) - if ("map") - currentmap = new ("_maps/[data].json") - if(currentmap.defaulted) - log_config("Failed to load map config for [data]!") - if ("minplayers","minplayer") - currentmap.config_min_users = text2num(data) - if ("maxplayers","maxplayer") - currentmap.config_max_users = text2num(data) - if ("weight","voteweight") - currentmap.voteweight = text2num(data) - if ("default","defaultmap") - defaultmap = currentmap - if ("endmap") - LAZYINITLIST(maplist) - maplist[currentmap.map_name] = currentmap - currentmap = null - if ("disabled") - currentmap = null - else - WRITE_FILE(GLOB.config_error_log, "Unknown command in map vote config: '[command]'") - - -/datum/controller/configuration/proc/pick_mode(mode_name) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - // ^ This guy didn't try hard enough - for(var/T in gamemode_cache) - var/datum/game_mode/M = T - var/ct = initial(M.config_tag) - if(ct && ct == mode_name) - return new T - return new /datum/game_mode/extended() - -/datum/controller/configuration/proc/get_runnable_modes() - var/list/datum/game_mode/runnable_modes = new - var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) - var/list/min_pop = Get(/datum/config_entry/keyed_number_list/min_pop) - var/list/max_pop = Get(/datum/config_entry/keyed_number_list/max_pop) - var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) - for(var/T in gamemode_cache) - var/datum/game_mode/M = new T() - if(!(M.config_tag in modes)) - qdel(M) - continue - if(probabilities[M.config_tag]<=0) - qdel(M) - continue - if(min_pop[M.config_tag]) - M.required_players = min_pop[M.config_tag] - if(max_pop[M.config_tag]) - M.maximum_players = max_pop[M.config_tag] - if(M.can_start()) - var/final_weight = probabilities[M.config_tag] - if(SSpersistence.saved_modes.len == 3 && repeated_mode_adjust.len == 3) - var/recent_round = min(SSpersistence.saved_modes.Find(M.config_tag),3) - var/adjustment = 0 - while(recent_round) - adjustment += repeated_mode_adjust[recent_round] - recent_round = SSpersistence.saved_modes.Find(M.config_tag,recent_round+1,0) - final_weight *= ((100-adjustment)/100) - runnable_modes[M] = final_weight - return runnable_modes - -/datum/controller/configuration/proc/get_runnable_midround_modes(crew) - var/list/datum/game_mode/runnable_modes = new - var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) - var/list/min_pop = Get(/datum/config_entry/keyed_number_list/min_pop) - var/list/max_pop = Get(/datum/config_entry/keyed_number_list/max_pop) - for(var/T in (gamemode_cache - SSticker.mode.type)) - var/datum/game_mode/M = new T() - if(!(M.config_tag in modes)) - qdel(M) - continue - if(probabilities[M.config_tag]<=0) - qdel(M) - continue - if(min_pop[M.config_tag]) - M.required_players = min_pop[M.config_tag] - if(max_pop[M.config_tag]) - M.maximum_players = max_pop[M.config_tag] - if(M.required_players <= crew) - if(M.maximum_players >= 0 && M.maximum_players < crew) - continue - runnable_modes[M] = probabilities[M.config_tag] - return runnable_modes diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 28526d8870..a3923d50fc 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -33,12 +33,12 @@ /datum/config_entry/can_vv_get(var_name) . = ..() - if(var_name == "value" || var_name == "default") + if(var_name == NAMEOF(src, config_entry_value) || var_name == NAMEOF(src, default)) . &= !(protection & CONFIG_ENTRY_HIDDEN) /datum/config_entry/vv_edit_var(var_name, var_value) - var/static/list/banned_edits = list("name", "default", "resident_file", "protection", "abstract_type", "modified", "dupes_allowed") - if(var_name == "value") + var/static/list/banned_edits = list(NAMEOF(src, name), NAMEOF(src, default), NAMEOF(src, resident_file), NAMEOF(src, protection), NAMEOF(src, abstract_type), NAMEOF(src, modified), NAMEOF(src, dupes_allowed)) + if(var_name == NAMEOF(src, config_entry_value)) if(protection & CONFIG_ENTRY_LOCKED) return FALSE . = ValidateAndSet("[var_value]") diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index a19f3147e7..b662fd4f84 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -67,6 +67,9 @@ entries_by_type -= CE.type /datum/controller/configuration/proc/LoadEntries(filename, list/stack = list()) + if(IsAdminAdvancedProcCall()) + return + var/filename_to_test = world.system_type == MS_WINDOWS ? lowertext(filename) : filename if(filename_to_test in stack) log_config("Warning: Config recursion detected ([english_list(stack)]), breaking!") diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index b7edace2e6..4ac9910336 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -47,8 +47,10 @@ /datum/config_entry/flag/force_random_names /datum/config_entry/flag/humans_need_surnames - + /datum/config_entry/flag/allow_ai // allow ai job + +/datum/config_entry/flag/disable_human_mood /datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen. @@ -92,6 +94,20 @@ /datum/config_entry/flag/allow_latejoin_antagonists // If late-joining players can be traitor/changeling +/datum/config_entry/flag/use_antag_rep // see game_options.txt for details + +/datum/config_entry/number/antag_rep_maximum + config_entry_value = 200 + min_val = 0 + +/datum/config_entry/number/default_antag_tickets + config_entry_value = 100 + min_val = 0 + +/datum/config_entry/number/max_tickets_per_roll + config_entry_value = 100 + min_val = 0 + /datum/config_entry/number/midround_antag_time_check // How late (in minutes you want the midround antag system to stay on, setting this to 0 will disable the system) config_entry_value = 60 min_val = 0 @@ -276,6 +292,8 @@ /datum/config_entry/flag/ic_printing +/datum/config_entry/flag/roundstart_traits + /datum/config_entry/flag/enable_night_shifts /datum/config_entry/flag/randomize_shift_time diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index ec7a18ba31..0608baea8c 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -120,6 +120,15 @@ /datum/config_entry/flag/admin_legacy_system //Defines whether the server uses the legacy admin system with admins.txt or the SQL system protection = CONFIG_ENTRY_LOCKED +/datum/config_entry/flag/protect_legacy_admins //Stops any admins loaded by the legacy system from having their rank edited by the permissions panel + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/protect_legacy_ranks //Stops any ranks loaded by the legacy system from having their flags edited by the permissions panel + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/enable_localhost_rank //Gives the !localhost! rank to any client connecting from 127.0.0.1 or ::1 + protection = CONFIG_ENTRY_LOCKED + /datum/config_entry/string/hostedby /datum/config_entry/flag/norespawn @@ -311,7 +320,6 @@ /datum/config_entry/number/client_warn_version config_entry_value = null min_val = 500 - max_val = DM_VERSION - 1 /datum/config_entry/string/client_warn_message config_entry_value = "Your version of byond may have issues or be blocked from accessing this server in the future." @@ -321,7 +329,6 @@ /datum/config_entry/number/client_error_version config_entry_value = null min_val = 500 - max_val = DM_VERSION - 1 /datum/config_entry/string/client_error_message config_entry_value = "Your version of byond is too old, may have issues, and is blocked from accessing this server." diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index 095e69573a..a491fc389b 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -3,7 +3,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) /datum/controller/global_vars name = "Global Variables" - var/list/gvars_datum_protected_varlist + var/static/list/gvars_datum_protected_varlist var/list/gvars_datum_in_built_vars var/list/gvars_datum_init_order @@ -13,25 +13,16 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) GLOB = src var/datum/controller/exclude_these = new - gvars_datum_in_built_vars = exclude_these.vars + list("gvars_datum_protected_varlist", "gvars_datum_in_built_vars", "gvars_datum_init_order") + gvars_datum_in_built_vars = exclude_these.vars + list(NAMEOF(src, gvars_datum_protected_varlist), NAMEOF(src, gvars_datum_in_built_vars), NAMEOF(src, gvars_datum_init_order)) qdel(exclude_these) log_world("[vars.len - gvars_datum_in_built_vars.len] global variables") Initialize() -/datum/controller/global_vars/Destroy(force) - stack_trace("Some fucker qdel'd the global holder!") - if(!force) - return QDEL_HINT_LETMELIVE - - QDEL_NULL(statclick) - gvars_datum_protected_varlist.Cut() - gvars_datum_in_built_vars.Cut() - - GLOB = null - - return ..() +/datum/controller/global_vars/Destroy() + //fuck off kevinz + return QDEL_HINT_IWILLGC /datum/controller/global_vars/stat_entry() if(!statclick) @@ -51,7 +42,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) /datum/controller/global_vars/Initialize() gvars_datum_init_order = list() - gvars_datum_protected_varlist = list("gvars_datum_protected_varlist" = TRUE) + gvars_datum_protected_varlist = list(NAMEOF(src, gvars_datum_protected_varlist) = TRUE) var/list/global_procs = typesof(/datum/controller/global_vars/proc) var/expected_len = vars.len - gvars_datum_in_built_vars.len if(global_procs.len != expected_len) diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm deleted file mode 100644 index 42212e266c..0000000000 --- a/code/controllers/hooks-defs.dm +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Startup hook. - * Called in world.dm when the server starts. - */ -/hook/startup - -/** - * Roundstart hook. - * Called in gameticker.dm when a round starts. - */ -/hook/roundstart - -/** - * Roundend hook. - * Called in gameticker.dm when a round ends. - */ -/hook/roundend - -/** - * Death hook. - * Called in death.dm when someone dies. - * Parameters: var/mob/living/carbon/human, var/gibbed - */ -/hook/death - -/** - * Cloning hook. - * Called in cloning.dm when someone is brought back by the wonders of modern science. - * Parameters: var/mob/living/carbon/human - */ -/hook/clone - -/** - * Debrained hook. - * Called in brain_item.dm when someone gets debrained. - * Parameters: var/obj/item/organ/brain - */ -/hook/debrain - -/** - * Borged hook. - * Called in robot_parts.dm when someone gets turned into a cyborg. - * Parameters: var/mob/living/silicon/robot - */ -/hook/borgify - -/** - * Podman hook. - * Called in podmen.dm when someone is brought back as a Diona. - * Parameters: var/mob/living/carbon/alien/diona - */ -/hook/harvest_podman - -/** - * Payroll revoked hook. - * Called in Accounts_DB.dm when someone's payroll is stolen at the Accounts terminal. - * Parameters: var/datum/money_account - */ -/hook/revoke_payroll - -/** - * Account suspension hook. - * Called in Accounts_DB.dm when someone's account is suspended or unsuspended at the Accounts terminal. - * Parameters: var/datum/money_account - */ -/hook/change_account_status - -/** - * Employee reassignment hook. - * Called in card.dm when someone's card is reassigned at the HoP's desk. - * Parameters: var/obj/item/card/id - */ -/hook/reassign_employee - -/** - * Employee terminated hook. - * Called in card.dm when someone's card is terminated at the HoP's desk. - * Parameters: var/obj/item/card/id - */ -/hook/terminate_employee - -/** - * Crate sold hook. - * Called in supplyshuttle.dm when a crate is sold on the shuttle. - * Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle - */ -/hook/sell_crate diff --git a/code/controllers/subsystem/explosion.dm b/code/controllers/subsystem/explosion.dm deleted file mode 100644 index 1e3a6f8a6e..0000000000 --- a/code/controllers/subsystem/explosion.dm +++ /dev/null @@ -1,510 +0,0 @@ -SUBSYSTEM_DEF(explosion) - priority = 99 - wait = 1 - flags = SS_TICKER|SS_NO_INIT - - var/list/explosions - - var/rebuild_tick_split_count = FALSE - var/tick_portions_required = 0 - - var/list/logs - - var/list/zlevels_that_ignore_bombcap - var/list/doppler_arrays - - //legacy caps, set by config - var/devastation_cap = 3 - var/heavy_cap = 7 - var/light_cap = 14 - var/flash_cap = 14 - var/flame_cap = 14 - var/dyn_ex_scale = 0.5 - - var/id_counter = 0 - -/datum/controller/subsystem/explosion/PreInit() - doppler_arrays = list() - logs = list() - explosions = list() - zlevels_that_ignore_bombcap = list("[ZLEVEL_MINING]") - -/datum/controller/subsystem/explosion/Shutdown() - QDEL_LIST(explosions) - QDEL_LIST(logs) - zlevels_that_ignore_bombcap.Cut() - -/datum/controller/subsystem/explosion/Recover() - explosions = SSexplosion.explosions - logs = SSexplosion.logs - id_counter = SSexplosion.id_counter - rebuild_tick_split_count = TRUE - zlevels_that_ignore_bombcap = SSexplosion.zlevels_that_ignore_bombcap - doppler_arrays = SSexplosion.doppler_arrays - - devastation_cap = SSexplosion.devastation_cap - heavy_cap = SSexplosion.heavy_cap - light_cap = SSexplosion.light_cap - flash_cap = SSexplosion.flash_cap - flame_cap = SSexplosion.flame_cap - dyn_ex_scale = SSexplosion.dyn_ex_scale - -/datum/controller/subsystem/explosion/fire() - var/list/cached_explosions = explosions - var/num_explosions = cached_explosions.len - if(!num_explosions) - return - - //figure exactly how many tick splits are required - var/num_splits - if(rebuild_tick_split_count) - var/reactionary = config.reactionary_explosions - num_splits = num_explosions - for(var/I in cached_explosions) - var/datum/explosion/E = I - if(!E.turfs_processed) - ++num_splits - if(reactionary && !E.densities_processed) - ++num_splits - tick_portions_required = num_splits - else - num_splits = tick_portions_required - - MC_SPLIT_TICK_INIT(num_splits) - - for(var/I in cached_explosions) - var/datum/explosion/E = I - - var/etp = E.turfs_processed - if(!etp) - if(GatherTurfs(E)) - --tick_portions_required - etp = TRUE - MC_SPLIT_TICK - - var/edp = E.densities_processed - if(!edp) - if(DensityCalculate(E, etp)) - --tick_portions_required - edp = TRUE - MC_SPLIT_TICK - - if(ProcessExplosion(E, edp)) //splits the tick - --tick_portions_required - explosions -= E - logs += E - NotifyDopplers(E) - MC_SPLIT_TICK - -/datum/controller/subsystem/explosion/proc/NotifyDopplers(datum/explosion/E) - for(var/array in doppler_arrays) - var/obj/machinery/doppler_array/A = array - A.sense_explosion(E.epicenter, E.devastation, E.heavy, E.light, E.finished_at - E.started_at, E.orig_dev_range, E.orig_heavy_range, E.orig_light_range) - -/datum/controller/subsystem/explosion/proc/Create(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = TRUE, ignorecap = FALSE, flame_range = 0 , silent = FALSE, smoke = FALSE) - epicenter = get_turf(epicenter) - if(!epicenter) - return - - if(adminlog) - message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area: [get_area(epicenter)] [ADMIN_COORDJMP(epicenter)]") - log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])") - - var/datum/explosion/E = new(++id_counter, epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range, silent, smoke, ignorecap) - - if(heavy_impact_range > 1) - var/datum/effect_system/explosion/Eff - if(smoke) - Eff = new /datum/effect_system/explosion/smoke - else - Eff = new - Eff.set_up(epicenter) - Eff.start() - - //flash mobs - if(flash_range) - for(var/mob/living/L in viewers(flash_range, epicenter)) - L.flash_act() - - if(!silent) - ExplosionSound(epicenter, devastation_range, heavy_impact_range, E.extent) - - //add to SS - if(E.extent) - tick_portions_required += 2 + (config.reactionary_explosions ? 1 : 0) - explosions += E - else - logs += E //Already done processing - -/datum/controller/subsystem/explosion/proc/CreateDynamic(atom/epicenter, power, flash_range, adminlog = TRUE, ignorecap = TRUE, flame_range = 0 , silent = FALSE, smoke = TRUE) - if(!power) - return - var/range = round((2 * power) ** dyn_ex_scale) - Create(epicenter, round(range * 0.25), round(range * 0.5), round(range), flash_range*range, adminlog, ignorecap, flame_range*range, silent, smoke) - -// Using default dyn_ex scale: -// 100 explosion power is a (5, 10, 20) explosion. -// 75 explosion power is a (4, 8, 17) explosion. -// 50 explosion power is a (3, 7, 14) explosion. -// 25 explosion power is a (2, 5, 10) explosion. -// 10 explosion power is a (1, 3, 6) explosion. -// 5 explosion power is a (0, 1, 3) explosion. -// 1 explosion power is a (0, 0, 1) explosion. - -/datum/explosion - var/explosion_id - var/turf/epicenter - - var/started_at - var/finished_at - var/tick_started - var/tick_finished - - var/turfs_processed = FALSE - var/densities_processed = FALSE - - var/orig_dev_range - var/orig_heavy_range - var/orig_light_range - var/orig_flash_range - var/orig_flame_range - - var/devastation - var/heavy - var/light - var/extent - - var/flash - var/flame - - var/gather_dist = 0 - - var/list/gathered_turfs - var/list/calculated_turfs - - var/list/unsafe_turfs - -/datum/explosion/New(id, turf/epi, devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range, silent, smoke, ignorecap) - explosion_id = id - epicenter = epi - - densities_processed = !config.reactionary_explosions - - orig_dev_range = devastation_range - orig_heavy_range = heavy_impact_range - orig_light_range = light_impact_range - orig_flash_range = flash_range - orig_flame_range = flame_range - - if(!ignorecap && !("[epicenter.z]" in SSexplosion.zlevels_that_ignore_bombcap)) - //Clamp all values - devastation_range = min(SSexplosion.devastation_cap, devastation_range) - heavy_impact_range = min(SSexplosion.heavy_cap, heavy_impact_range) - light_impact_range = min(SSexplosion.light_cap, light_impact_range) - flash_range = min(SSexplosion.flash_cap, flash_range) - flame_range = min(SSexplosion.flame_cap, flame_range) - - //store this - devastation = devastation_range - heavy = heavy_impact_range - light = light_impact_range - - extent = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) - - flash = flash_range - flame = flame_range - - started_at = REALTIMEOFDAY - tick_started = world.time - - gathered_turfs = list() - calculated_turfs = list() - unsafe_turfs = list() - -// Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. -// Stereo users will also hear the direction of the explosion! - -// Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions. -// 3/7/14 will calculate to 80 + 35 -/proc/ExplosionSound(turf/epicenter, devastation_range, heavy_impact_range, extent) - var/far_dist = 0 - far_dist += heavy_impact_range * 5 - far_dist += devastation_range * 20 - - var/z0 = epicenter.z - - var/frequency = get_rand_frequency() - var/ex_sound = get_sfx("explosion") - for(var/mob/M in GLOB.player_list) - // Double check for client - var/turf/M_turf = get_turf(M) - if(M_turf && M_turf.z == z0) - var/dist = get_dist(M_turf, epicenter) - // If inside the blast radius + world.view - 2 - if(dist <= round(extent + world.view - 2, 1)) - M.playsound_local(epicenter, ex_sound, 100, 1, frequency, falloff = 5) - // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. - else if(dist <= far_dist) - var/far_volume = Clamp(far_dist, 30, 50) // Volume is based on explosion size and dist - far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion - M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5) - -/datum/explosion/Destroy() - SSexplosion.explosions -= src - SSexplosion.logs -= src - LAZYCLEARLIST(gathered_turfs) - LAZYCLEARLIST(calculated_turfs) - LAZYCLEARLIST(unsafe_turfs) - return ..() - -/datum/controller/subsystem/explosion/proc/GatherTurfs(datum/explosion/E) - var/turf/epicenter = E.epicenter - - var/x0 = epicenter.x - var/y0 = epicenter.y - var/z0 = epicenter.z - - var/c_dist = E.gather_dist - var/dist = E.extent - - var/list/L = E.gathered_turfs - - if(!c_dist) - L += epicenter - ++c_dist - - while( c_dist <= dist ) - var/y = y0 + c_dist - var/x = x0 - c_dist + 1 - for(x in x to x0 + c_dist) - var/turf/T = locate(x, y, z0) - if(T) - L += T - - y = y0 + c_dist - 1 - x = x0 + c_dist - for(y in y0 - c_dist to y) - var/turf/T = locate(x, y, z0) - if(T) - L += T - - y = y0 - c_dist - x = x0 + c_dist - 1 - for(x in x0 - c_dist to x) - var/turf/T = locate(x, y, z0) - if(T) - L += T - - y = y0 - c_dist + 1 - x = x0 - c_dist - for(y in y to y0 + c_dist) - var/turf/T = locate(x, y, z0) - if(T) - L += T - ++c_dist - - if(MC_TICK_CHECK) - break - - if(c_dist > dist) - E.turfs_processed = TRUE - return TRUE - else - E.gather_dist = c_dist - return FALSE - -/datum/controller/subsystem/explosion/proc/DensityCalculate(datum/explosion/E, done_gathering_turfs) - var/list/L = E.calculated_turfs - var/cut_to = 1 - for(var/I in E.gathered_turfs) // we cache the explosion block rating of every turf in the explosion area - var/turf/T = I - ++cut_to - - var/current_exp_block = T.density ? T.explosion_block : 0 - - for(var/obj/machinery/door/D in T) - if(D.density) - current_exp_block += D.explosion_block - - for(var/obj/structure/window/W in T) - if(W.reinf && W.fulltile) - current_exp_block += W.explosion_block - - for(var/obj/structure/blob/B in T) - current_exp_block += B.explosion_block - - L[T] = current_exp_block - - if(MC_TICK_CHECK) - E.gathered_turfs.Cut(1, cut_to) - return FALSE - - E.gathered_turfs.Cut() - return done_gathering_turfs - -/datum/controller/subsystem/explosion/proc/ProcessExplosion(datum/explosion/E, done_calculating_turfs) - //cache shit for speed - var/id = E.explosion_id - - var/list/cached_unsafe = E.unsafe_turfs - var/list/cached_exp_block = E.calculated_turfs - var/list/affected_turfs = cached_exp_block ? cached_exp_block : E.gathered_turfs - - var/devastation_range = E.devastation - var/heavy_impact_range = E.heavy - var/light_impact_range = E.light - - var/flame_range = E.flame - var/throw_range_max = E.extent - - var/turf/epi = E.epicenter - - var/x0 = epi.x - var/y0 = epi.y - - var/cut_to = 1 - for(var/TI in affected_turfs) - var/turf/T = TI - ++cut_to - - var/init_dist = cheap_hypotenuse(T.x, T.y, x0, y0) - var/dist = init_dist - - if(cached_exp_block) - var/turf/Trajectory = T - while(Trajectory != epi) - Trajectory = get_step_towards(Trajectory, epi) - dist += cached_exp_block[Trajectory] - - var/flame_dist = dist < flame_range - var/throw_dist = dist - - if(dist < devastation_range) - dist = 1 - else if(dist < heavy_impact_range) - dist = 2 - else if(dist < light_impact_range) - dist = 3 - else - dist = 0 - - //------- EX_ACT AND TURF FIRES ------- - - if(flame_dist && prob(40) && !isspaceturf(T) && !T.density) - new /obj/effect/hotspot(T) //Mostly for ambience! - - if(dist > 0) - T.explosion_level = max(T.explosion_level, dist) //let the bigger one have it - T.explosion_id = id - T.ex_act(dist) - cached_unsafe += T - - //--- THROW ITEMS AROUND --- - - var/throw_dir = get_dir(epi, T) - for(var/obj/item/I in T) - if(!I.anchored) - var/throw_range = rand(throw_dist, throw_range_max) - var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range) - I.throw_speed = 4 //Temporarily change their throw_speed for embedding purposes (Resets when it finishes throwing, regardless of hitting anything) - I.throw_at(throw_at, throw_range, 4) - - if(MC_TICK_CHECK) - var/circumference = (PI * (init_dist + 4) * 2) //+4 to radius to prevent shit gaps - if(cached_unsafe.len > circumference) //only do this every revolution - for(var/Unexplode in cached_unsafe) - var/turf/UnexplodeT = Unexplode - UnexplodeT.explosion_level = 0 - cached_unsafe.Cut() - done_calculating_turfs = FALSE - break - - affected_turfs.Cut(1, cut_to) - - if(!done_calculating_turfs) - return FALSE - - //unfuck the shit - for(var/Unexplode in cached_unsafe) - var/turf/UnexplodeT = Unexplode - UnexplodeT.explosion_level = 0 - cached_unsafe.Cut() - - E.finished_at = REALTIMEOFDAY - E.tick_finished = world.time - - return TRUE - -/client/proc/check_bomb_impacts() - set name = "Check Bomb Impact" - set category = "Debug" - - var/newmode = alert("Use reactionary explosions?","Check Bomb Impact", "Yes", "No") - var/turf/epicenter = get_turf(mob) - if(!epicenter) - return - - var/x0 = epicenter.x - var/y0 = epicenter.y - - var/dev = 0 - var/heavy = 0 - var/light = 0 - var/list/choices = list("Small Bomb","Medium Bomb","Big Bomb","Custom Bomb") - var/choice = input("Bomb Size?") in choices - switch(choice) - if(null) - return 0 - if("Small Bomb") - dev = 1 - heavy = 2 - light = 3 - if("Medium Bomb") - dev = 2 - heavy = 3 - light = 4 - if("Big Bomb") - dev = 3 - heavy = 5 - light = 7 - if("Custom Bomb") - dev = input("Devestation range (Tiles):") as num - heavy = input("Heavy impact range (Tiles):") as num - light = input("Light impact range (Tiles):") as num - else - return - - var/datum/explosion/E = new(null, epicenter, dev, heavy, light, ignorecap = TRUE) - - while(!SSexplosion.GatherTurfs(E)) - stoplag() - var/list/turfs - if(newmode) - while(!SSexplosion.DensityCalculate(E, TRUE)) - stoplag() - turfs = E.calculated_turfs.Copy() - else - turfs = E.gathered_turfs.Copy() - - qdel(E) - - for(var/I in turfs) - var/turf/T = I - var/dist = cheap_hypotenuse(T.x, T.y, x0, y0) + turfs[T] - - if(dist < dev) - T.color = "red" - T.maptext = "Dev" - else if (dist < heavy) - T.color = "yellow" - T.maptext = "Heavy" - else if (dist < light) - T.color = "blue" - T.maptext = "Light" - CHECK_TICK - - sleep(100) - for(var/I in turfs) - var/turf/T = I - T.color = null - T.maptext = null diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index d87496d5ac..fce7ac941e 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -404,6 +404,8 @@ SUBSYSTEM_DEF(job) else M = H + SSpersistence.antag_rep_change[M.client.ckey] += job.antag_rep + to_chat(M, "You are the [rank].") to_chat(M, "As the [rank] you answer directly to [job.supervisors]. Special circumstances may change this.") to_chat(M, "To speak on your departments radio, use the :h button. To see others, look closely at your headset.") diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 3da9dfe41a..8f1b695835 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -50,11 +50,13 @@ SUBSYSTEM_DEF(mapping) preloadTemplates() #ifndef LOWMEMORYMODE // Create space ruin levels - while (space_levels_so_far < ZLEVEL_SPACE_RUIN_COUNT) + while (space_levels_so_far < config.space_ruin_levels) ++space_levels_so_far add_new_zlevel("Empty Area [space_levels_so_far]", ZTRAITS_SPACE) // and one level with no ruins - empty_space = add_new_zlevel("Empty Area [1 + space_levels_so_far]", list(ZTRAIT_LINKAGE = CROSSLINKED)) + for (var/i in 1 to config.space_empty_levels) + ++space_levels_so_far + empty_space = add_new_zlevel("Empty Area [space_levels_so_far]", list(ZTRAIT_LINKAGE = CROSSLINKED)) // and the transit level transit = add_new_zlevel("Transit", list(ZTRAIT_TRANSIT = TRUE)) @@ -175,7 +177,7 @@ SUBSYSTEM_DEF(mapping) #ifndef LOWMEMORYMODE // TODO: remove this when the DB is prepared for the z-levels getting reordered - while (world.maxz < (5 - 1) && space_levels_so_far < ZLEVEL_SPACE_RUIN_COUNT) + while (world.maxz < (5 - 1) && space_levels_so_far < config.space_ruin_levels) ++space_levels_so_far add_new_zlevel("Empty Area [space_levels_so_far]", ZTRAITS_SPACE) diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index cd47adf476..c0837ec76b 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -21,8 +21,8 @@ SUBSYSTEM_DEF(mobs) var/seconds = wait * 0.1 if (!resumed) src.currentrun = GLOB.mob_living_list.Copy() - if (GLOB.overminds.len) // blob cameras need to Life() - src.currentrun += GLOB.overminds + if (GLOB.living_cameras.len) + src.currentrun += GLOB.living_cameras //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun diff --git a/code/controllers/subsystem/moods.dm b/code/controllers/subsystem/moods.dm new file mode 100644 index 0000000000..d1e58c7452 --- /dev/null +++ b/code/controllers/subsystem/moods.dm @@ -0,0 +1,4 @@ +PROCESSING_SUBSYSTEM_DEF(mood) + name = "Mood" + flags = SS_NO_INIT | SS_BACKGROUND + priority = 20 diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index 93003c4634..325ba212c6 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -8,7 +8,6 @@ SUBSYSTEM_DEF(nightshift) var/nightshift_end_time = 270000 //7:30 AM, station time var/nightshift_first_check = 30 SECONDS - var/obey_security_level = TRUE var/high_security_mode = FALSE /datum/controller/subsystem/nightshift/Initialize() @@ -21,48 +20,36 @@ SUBSYSTEM_DEF(nightshift) return check_nightshift() -/datum/controller/subsystem/nightshift/proc/check_nightshift(force_set = FALSE) - var/time = station_time() - var/nightshift = time < nightshift_end_time || time > nightshift_start_time - var/red_or_delta = GLOB.security_level == SEC_LEVEL_RED || GLOB.security_level == SEC_LEVEL_DELTA +/datum/controller/subsystem/nightshift/proc/announce(message) + priority_announce(message, sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") + +/datum/controller/subsystem/nightshift/proc/check_nightshift() + var/emergency = GLOB.security_level >= SEC_LEVEL_RED var/announcing = TRUE - if(nightshift && red_or_delta) - nightshift = FALSE - if(high_security_mode && !red_or_delta) - high_security_mode = FALSE - priority_announce("Restoring night lighting configuration to normal operation.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") - announcing = FALSE - else if(!high_security_mode && red_or_delta) - high_security_mode = TRUE - priority_announce("Night lighting disabled: Station is in a state of emergency.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") - announcing = FALSE + var/time = station_time() + var/night_time = (time < nightshift_end_time) || (time > nightshift_start_time) + if(high_security_mode != emergency) + high_security_mode = emergency + if(night_time) + announcing = FALSE + if(!emergency) + announce("Restoring night lighting configuration to normal operation.") + else + announce("Disabling night lighting: Station is in a state of emergency.") + if(emergency) + night_time = FALSE + if(nightshift_active != night_time) + update_nightshift(night_time, announcing) - if((nightshift_active != nightshift) || force_set) - nightshift? activate_nightshift(announcing) : deactivate_nightshift(announcing) - -/datum/controller/subsystem/nightshift/proc/activate_nightshift(announce = TRUE) - if(!nightshift_active) - if(announce) - priority_announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") - nightshift_active = TRUE - var/list/area/affected = return_nightshift_area_types() - for(var/i in affected) - var/area/A = locate(i) in GLOB.sortedAreas - for(var/obj/machinery/power/apc/APC in A) - APC.set_nightshift(TRUE) +/datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE) + nightshift_active = active + if(announce) + if (active) + announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.") + else + announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.") + for(var/A in GLOB.apcs_list) + var/obj/machinery/power/apc/APC = A + if (APC.area && (APC.area.type in GLOB.the_station_areas)) + APC.set_nightshift(active) CHECK_TICK - -/datum/controller/subsystem/nightshift/proc/deactivate_nightshift(announce = TRUE) - if(nightshift_active) - if(announce) - priority_announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") - nightshift_active = FALSE - var/list/area/affected = return_nightshift_area_types() - for(var/i in affected) - var/area/A = locate(i) in GLOB.sortedAreas - for(var/obj/machinery/power/apc/APC in A) - APC.set_nightshift(FALSE) - CHECK_TICK - -/datum/controller/subsystem/nightshift/proc/return_nightshift_area_types() - return GLOB.the_station_areas.Copy() diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index b46a55c4d1..791a334b55 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -1,3 +1,5 @@ +#define FILE_ANTAG_REP "data/AntagReputation.json" + SUBSYSTEM_DEF(persistence) name = "Persistence" init_order = INIT_ORDER_PERSISTENCE @@ -11,6 +13,8 @@ SUBSYSTEM_DEF(persistence) var/list/saved_modes = list(1,2,3) var/list/saved_trophies = list() var/list/spawned_objects = list() + var/list/antag_rep = list() + var/list/antag_rep_change = list() /datum/controller/subsystem/persistence/Initialize() LoadSatchels() @@ -18,6 +22,8 @@ SUBSYSTEM_DEF(persistence) LoadChiselMessages() LoadTrophies() LoadRecentModes() + if(CONFIG_GET(flag/use_antag_rep)) + LoadAntagReputation() ..() /datum/controller/subsystem/persistence/proc/LoadSatchels() @@ -152,10 +158,21 @@ SUBSYSTEM_DEF(persistence) return saved_modes = json["data"] +/datum/controller/subsystem/persistence/proc/LoadAntagReputation() + var/json = file2text(FILE_ANTAG_REP) + if(!json) + var/json_file = file(FILE_ANTAG_REP) + if(!fexists(json_file)) + WARNING("Failed to load antag reputation. File likely corrupt.") + return + return + antag_rep = json_decode(json) /datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) for(var/A in GLOB.trophy_cases) var/obj/structure/displaycase/trophy/T = A + if (T.showpiece) + continue T.added_roundstart = TRUE var/trophy_data = pick_n_take(trophy_items) @@ -183,6 +200,8 @@ SUBSYSTEM_DEF(persistence) CollectSecretSatchels() CollectTrophies() CollectRoundtype() + if(CONFIG_GET(flag/use_antag_rep)) + CollectAntagReputation() /datum/controller/subsystem/persistence/proc/CollectSecretSatchels() satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/crowbar)) @@ -253,3 +272,18 @@ SUBSYSTEM_DEF(persistence) file_data["data"] = saved_modes fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/CollectAntagReputation() + var/ANTAG_REP_MAXIMUM = CONFIG_GET(number/antag_rep_maximum) + + for(var/p_ckey in antag_rep_change) +// var/start = antag_rep[p_ckey] + antag_rep[p_ckey] = max(0, min(antag_rep[p_ckey]+antag_rep_change[p_ckey], ANTAG_REP_MAXIMUM)) + +// WARNING("AR_DEBUG: [p_ckey]: Committed [antag_rep_change[p_ckey]] reputation, going from [start] to [antag_rep[p_ckey]]") + + antag_rep_change = list() + + fdel(FILE_ANTAG_REP) + text2file(json_encode(antag_rep), FILE_ANTAG_REP) + diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm deleted file mode 100644 index a6b444c4e7..0000000000 --- a/code/controllers/subsystem/ping.dm +++ /dev/null @@ -1,42 +0,0 @@ -#define PING_BUFFER_TIME 25 - -SUBSYSTEM_DEF(ping) - name = "Ping" - wait = 6 - flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY - priority = 10 - var/list/currentrun - -/datum/controller/subsystem/ping/Initialize() - if (config.hub) - world.visibility = 1 - ..() - -/datum/controller/subsystem/ping/fire(resumed = FALSE) - if (!resumed) - src.currentrun = GLOB.clients.Copy() - - var/round_started = Master.round_started - var/list/currentrun = src.currentrun - while (length(currentrun)) - var/client/C = currentrun[currentrun.len] - currentrun.len-- - if (!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1)) - if (MC_TICK_CHECK) - return - continue - - if(round_started && C.is_afk(INACTIVITY_KICK)) - if(!istype(C.mob, /mob/dead)) - log_access("AFK: [key_name(C)]") - to_chat(C, "You have been inactive for more than 10 minutes and have been disconnected.") - qdel(C) - - winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]") - - if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check - return - - currentrun = null - -#undef PING_BUFFER_TIME diff --git a/code/controllers/subsystem/processing/fields.dm b/code/controllers/subsystem/processing/fields.dm index b6996377b5..a4c58b883a 100644 --- a/code/controllers/subsystem/processing/fields.dm +++ b/code/controllers/subsystem/processing/fields.dm @@ -1,6 +1,6 @@ PROCESSING_SUBSYSTEM_DEF(fields) name = "Fields" wait = 2 - priority = FIRE_PRIORUTY_FIELDS + priority = FIRE_PRIORITY_FIELDS flags = SS_KEEP_TIMING | SS_NO_INIT runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/processing/traits.dm b/code/controllers/subsystem/processing/traits.dm new file mode 100644 index 0000000000..17eae4bda2 --- /dev/null +++ b/code/controllers/subsystem/processing/traits.dm @@ -0,0 +1,35 @@ +//Used to process and handle roundstart trait datums +//Trait datums are separate from trait strings: +// - Trait strings are used for faster checking in code +// - Trait datums are stored and hold different effects, as well as being a vector for applying trait string +PROCESSING_SUBSYSTEM_DEF(traits) + name = "Traits" + init_order = INIT_ORDER_TRAITS + flags = SS_BACKGROUND + wait = 10 + runlevels = RUNLEVEL_GAME + + var/list/traits = list() //Assoc. list of all roundstart trait datum types; "name" = /path/ + var/list/trait_points = list() //Assoc. list of trait names and their "point cost"; positive numbers are good traits, and negative ones are bad + var/list/trait_objects = list() //A list of all trait objects in the game, since some may process + +/datum/controller/subsystem/processing/traits/Initialize(timeofday) + if(!traits.len) + SetupTraits() + ..() + +/datum/controller/subsystem/processing/traits/proc/SetupTraits() + for(var/V in subtypesof(/datum/trait)) + var/datum/trait/T = V + traits[initial(T.name)] = T + trait_points[initial(T.name)] = initial(T.value) + +/datum/controller/subsystem/processing/traits/proc/AssignTraits(mob/living/user, client/cli, spawn_effects) + GenerateTraits(cli) + for(var/V in cli.prefs.character_traits) + user.add_trait_datum(V, spawn_effects) + +/datum/controller/subsystem/processing/traits/proc/GenerateTraits(client/user) + if(user.prefs.character_traits.len) + return + user.prefs.character_traits = user.prefs.all_traits diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 43e014061c..3f6f42f833 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -1,7 +1,6 @@ SUBSYSTEM_DEF(research) name = "Research" - flags = SS_KEEP_TIMING priority = FIRE_PRIORITY_RESEARCH wait = 10 init_order = INIT_ORDER_RESEARCH diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 851dd2e750..62e20c9854 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -387,6 +387,8 @@ SUBSYSTEM_DEF(ticker) captainless=0 if(player.mind.assigned_role != player.mind.special_role) SSjob.EquipRank(N, player.mind.assigned_role, 0) + if(CONFIG_GET(flag/roundstart_traits)) + SStraits.AssignTraits(player, N.client, TRUE) CHECK_TICK if(captainless) for(var/mob/dead/new_player/N in GLOB.player_list) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 2c46621f16..45e2b667cf 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -458,7 +458,7 @@ SUBSYSTEM_DEF(timer) if (wait >= 1 && callback && callback.object && callback.object != GLOBAL_PROC && QDELETED(callback.object)) stack_trace("addtimer called with a callback assigned to a qdeleted object") - wait = max(wait, world.tick_lag) + wait = max(wait, 0) if(wait >= INFINITY) CRASH("Attempted to create timer with INFINITY delay") diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 6487d3f8b1..3ea850260a 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(traumas) #define PHOBIA_FILE "phobia.json" /datum/controller/subsystem/traumas/Initialize() - phobia_types = list("spiders", "space", "security", "clowns", "greytide", "lizards", + phobia_types = list("spiders", "space", "security", "clowns", "greytide", "lizards", "skeletons", "snakes", "robots", "doctors", "authority", "the supernatural", "aliens", "strangers") @@ -37,33 +37,35 @@ SUBSYSTEM_DEF(traumas) "lizards" = typecacheof(list(/mob/living/simple_animal/hostile/lizard)), "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)), "snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/poison/snake)), - "robots" = typecacheof(list(/mob/living/silicon/robot, /mob/living/silicon/ai, + "robots" = typecacheof(list(/mob/living/silicon/robot, /mob/living/silicon/ai, /mob/living/simple_animal/drone, /mob/living/simple_animal/bot, /mob/living/simple_animal/hostile/swarmer)), "doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)), - "the supernatural" = typecacheof(list(/mob/living/simple_animal/hostile/construct, - /mob/living/simple_animal/hostile/clockwork, /mob/living/simple_animal/drone/cogscarab, + "the supernatural" = typecacheof(list(/mob/living/simple_animal/hostile/construct, + /mob/living/simple_animal/hostile/clockwork, /mob/living/simple_animal/drone/cogscarab, /mob/living/simple_animal/revenant, /mob/living/simple_animal/shade)), "aliens" = typecacheof(list(/mob/living/carbon/alien, /mob/living/simple_animal/slime)), "conspiracies" = typecacheof(list(/mob/living/simple_animal/bot/secbot, /mob/living/simple_animal/bot/ed209, /mob/living/simple_animal/drone)) ) - phobia_objs = list("spiders" = typecacheof(list(/obj/structure/spider)), - + phobia_objs = list("snakes" = typecacheof(list(/obj/item/rod_of_asclepius)), + + "spiders" = typecacheof(list(/obj/structure/spider)), + "security" = typecacheof(list(/obj/item/clothing/under/rank/security, /obj/item/clothing/under/rank/warden, /obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/det, /obj/item/melee/baton, /obj/item/gun/energy/taser, /obj/item/restraints/handcuffs, /obj/machinery/door/airlock/security)), - + "clowns" = typecacheof(list(/obj/item/clothing/under/rank/clown, /obj/item/clothing/shoes/clown_shoes, /obj/item/clothing/mask/gas/clown_hat, /obj/item/device/instrument/bikehorn, /obj/item/device/pda/clown, /obj/item/grown/bananapeel)), - + "greytide" = typecacheof(list(/obj/item/clothing/under/color/grey, /obj/item/melee/baton/cattleprod, /obj/item/twohanded/spear, /obj/item/clothing/mask/gas)), - + "lizards" = typecacheof(list(/obj/item/toy/plush/lizardplushie, /obj/item/reagent_containers/food/snacks/kebab/tail, /obj/item/organ/tail/lizard, /obj/item/reagent_containers/food/drinks/bottle/lizardwine)), - + "skeletons" = typecacheof(list(/obj/item/organ/tongue/bone, /obj/item/clothing/suit/armor/bone, /obj/item/stack/sheet/bone, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton, /obj/effect/decal/remains/human)), @@ -79,54 +81,54 @@ SUBSYSTEM_DEF(traumas) /obj/item/clothing/suit/space/hardsuit/ert, /obj/item/clothing/suit/space/hardsuit/ert/sec, /obj/item/clothing/suit/space/hardsuit/ert/engi, /obj/item/clothing/suit/space/hardsuit/ert/med, /obj/item/clothing/suit/space/hardsuit/deathsquad, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad, - /obj/machinery/door/airlock/centcom)), - "robots" = typecacheof(list(/obj/machinery/computer/upload, /obj/item/aiModule/, /obj/machinery/recharge_station, + /obj/machinery/door/airlock/centcom)), + "robots" = typecacheof(list(/obj/machinery/computer/upload, /obj/item/aiModule/, /obj/machinery/recharge_station, /obj/item/device/aicard, /obj/item/device/deactivated_swarmer, /obj/effect/mob_spawn/swarmer)), - - "doctors" = typecacheof(list(/obj/item/clothing/under/rank/medical, /obj/item/clothing/under/rank/chemist, - /obj/item/clothing/under/rank/nursesuit, /obj/item/clothing/under/rank/chief_medical_officer, - /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/pill/, /obj/item/reagent_containers/hypospray, - /obj/item/storage/firstaid, /obj/item/storage/pill_bottle, /obj/item/device/healthanalyzer, - /obj/structure/sign/departments/medbay, /obj/machinery/door/airlock/medical, /obj/machinery/sleeper, + + "doctors" = typecacheof(list(/obj/item/clothing/under/rank/medical, /obj/item/clothing/under/rank/chemist, + /obj/item/clothing/under/rank/nursesuit, /obj/item/clothing/under/rank/chief_medical_officer, + /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/pill/, /obj/item/reagent_containers/hypospray, + /obj/item/storage/firstaid, /obj/item/storage/pill_bottle, /obj/item/device/healthanalyzer, + /obj/structure/sign/departments/medbay, /obj/machinery/door/airlock/medical, /obj/machinery/sleeper, /obj/machinery/dna_scannernew, /obj/machinery/atmospherics/components/unary/cryo_cell, /obj/item/surgical_drapes, /obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw)), - - "authority" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/head_of_personnel, - /obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/research_director, - /obj/item/clothing/under/rank/chief_medical_officer, /obj/item/clothing/under/rank/chief_engineer, - /obj/item/clothing/under/rank/centcom_officer, /obj/item/clothing/under/rank/centcom_commander, - /obj/item/melee/classic_baton/telescopic, /obj/item/card/id/silver, /obj/item/card/id/gold, + + "authority" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/head_of_personnel, + /obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/research_director, + /obj/item/clothing/under/rank/chief_medical_officer, /obj/item/clothing/under/rank/chief_engineer, + /obj/item/clothing/under/rank/centcom_officer, /obj/item/clothing/under/rank/centcom_commander, + /obj/item/melee/classic_baton/telescopic, /obj/item/card/id/silver, /obj/item/card/id/gold, /obj/item/card/id/captains_spare, /obj/item/card/id/centcom, /obj/machinery/door/airlock/command)), - - "the supernatural" = typecacheof(list(/obj/structure/destructible/cult, /obj/item/tome, - /obj/item/melee/cultblade, /obj/item/twohanded/required/cult_bastard, /obj/item/restraints/legcuffs/bola/cult, - /obj/item/clothing/suit/cultrobes, /obj/item/clothing/suit/space/hardsuit/cult, - /obj/item/clothing/suit/hooded/cultrobes, /obj/item/clothing/head/hooded/cult_hoodie, /obj/effect/rune, - /obj/item/stack/sheet/runed_metal, /obj/machinery/door/airlock/cult, /obj/singularity/narsie, + + "the supernatural" = typecacheof(list(/obj/structure/destructible/cult, /obj/item/tome, + /obj/item/melee/cultblade, /obj/item/twohanded/required/cult_bastard, /obj/item/restraints/legcuffs/bola/cult, + /obj/item/clothing/suit/cultrobes, /obj/item/clothing/suit/space/hardsuit/cult, + /obj/item/clothing/suit/hooded/cultrobes, /obj/item/clothing/head/hooded/cult_hoodie, /obj/effect/rune, + /obj/item/stack/sheet/runed_metal, /obj/machinery/door/airlock/cult, /obj/singularity/narsie, /obj/item/device/soulstone, - /obj/structure/destructible/clockwork, /obj/item/clockwork, /obj/item/clothing/suit/armor/clockwork, - /obj/item/clothing/glasses/judicial_visor, /obj/effect/clockwork/sigil/, /obj/item/stack/tile/brass, + /obj/structure/destructible/clockwork, /obj/item/clockwork, /obj/item/clothing/suit/armor/clockwork, + /obj/item/clothing/glasses/judicial_visor, /obj/effect/clockwork/sigil/, /obj/item/stack/tile/brass, /obj/machinery/door/airlock/clockwork, - /obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff, + /obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff, /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/gun/magic/staff, /obj/item/gun/magic/wand, /obj/item/nullrod, /obj/item/clothing/under/rank/chaplain)), - + "aliens" = typecacheof(list(/obj/item/clothing/mask/facehugger, /obj/item/organ/body_egg/alien_embryo, /obj/structure/alien, /obj/item/toy/toy_xeno, - /obj/item/clothing/suit/armor/abductor, /obj/item/device/abductor, /obj/item/gun/energy/alien, + /obj/item/clothing/suit/armor/abductor, /obj/item/device/abductor, /obj/item/gun/energy/alien, /obj/item/abductor_baton, /obj/item/device/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/surgicaldrill/alien, /obj/item/cautery/alien, - /obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor, + /obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor, /obj/structure/table/abductor, /obj/structure/table/optable/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland, - /obj/machinery/abductor, /obj/item/crowbar/abductor, /obj/item/screwdriver/abductor, /obj/item/weldingtool/abductor, + /obj/machinery/abductor, /obj/item/crowbar/abductor, /obj/item/screwdriver/abductor, /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/wrench/abductor, /obj/item/stack/sheet/mineral/abductor)) ) phobia_turfs = list("space" = typecacheof(list(/turf/open/space, /turf/open/floor/holofloor/space, /turf/open/floor/fakespace)), - "the supernatural" = typecacheof(list(/turf/open/floor/clockwork, /turf/closed/wall/clockwork, + "the supernatural" = typecacheof(list(/turf/open/floor/clockwork, /turf/closed/wall/clockwork, /turf/open/floor/plasteel/cult, /turf/closed/wall/mineral/cult)), - "aliens" = typecacheof(list(/turf/open/floor/plating/abductor, /turf/open/floor/plating/abductor2, + "aliens" = typecacheof(list(/turf/open/floor/plating/abductor, /turf/open/floor/plating/abductor2, /turf/open/floor/mineral/abductor, /turf/closed/wall/mineral/abductor)) ) @@ -135,7 +137,7 @@ SUBSYSTEM_DEF(traumas) "conspiracies" = typecacheof(list(/datum/species/abductor, /datum/species/lizard, /datum/species/synth)), "robots" = typecacheof(list(/datum/species/android)), "the supernatural" = typecacheof(list(/datum/species/golem/clockwork, /datum/species/golem/runic)), - "aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod, + "aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod, /datum/species/shadow)) ) diff --git a/code/controllers/subsystem/vore.dm b/code/controllers/subsystem/vore.dm new file mode 100644 index 0000000000..faaa297ca3 --- /dev/null +++ b/code/controllers/subsystem/vore.dm @@ -0,0 +1,41 @@ +#define SSBELLIES_PROCESSED 1 +#define SSBELLIES_IGNORED 2 + +// +// Bellies subsystem - Process vore bellies +// + +SUBSYSTEM_DEF(bellies) + name = "Bellies" + priority = 5 + wait = 1 SECONDS + flags = SS_KEEP_TIMING|SS_NO_INIT + runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME + + var/static/list/belly_list = list() + var/list/currentrun = list() + var/ignored_bellies = 0 + +/datum/controller/subsystem/bellies/stat_entry() + ..("#: [belly_list.len] | P: [ignored_bellies]") + +/datum/controller/subsystem/bellies/fire(resumed = 0) + if (!resumed) + ignored_bellies = 0 + src.currentrun = belly_list.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + var/times_fired = src.times_fired + while(currentrun.len) + var/obj/belly/B = currentrun[currentrun.len] + currentrun.len-- + + if(QDELETED(B)) + belly_list -= B + else + if(B.process_belly(times_fired,wait) == SSBELLIES_IGNORED) + ignored_bellies++ + + if (MC_TICK_CHECK) + return diff --git a/code/datums/action.dm b/code/datums/action.dm index 15f62b20b7..a7437a0440 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,6 +11,7 @@ var/processing = FALSE var/obj/screen/movable/action_button/button = null var/buttontooltipstyle = "" + var/transparent_when_unavailable = TRUE var/button_icon = 'icons/mob/actions/backgrounds.dmi' //This is the file for the BACKGROUND icon var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND //And this is the state for the background icon @@ -124,7 +125,7 @@ ApplyIcon(button, force) if(!IsAvailable()) - button.color = rgb(128,0,0,128) + button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) else button.color = rgb(255,255,255,255) return 1 @@ -572,6 +573,52 @@ call(target, procname)(usr) return 1 + +//Preset for an action with a cooldown + +/datum/action/cooldown + check_flags = 0 + transparent_when_unavailable = FALSE + var/cooldown_time = 0 + var/next_use_time = 0 + +/datum/action/cooldown/New() + ..() + button.maptext = "" + button.maptext_x = 8 + button.maptext_y = 0 + button.maptext_width = 24 + button.maptext_height = 12 + +/datum/action/cooldown/IsAvailable() + return next_use_time <= world.time + +/datum/action/cooldown/proc/StartCooldown() + next_use_time = world.time + cooldown_time + button.maptext = "[round(cooldown_time/10, 0.1)]" + UpdateButtonIcon() + START_PROCESSING(SSfastprocess, src) + +/datum/action/cooldown/process() + if(!owner) + button.maptext = "" + STOP_PROCESSING(SSfastprocess, src) + var/timeleft = max(next_use_time - world.time, 0) + if(timeleft == 0) + button.maptext = "" + UpdateButtonIcon() + STOP_PROCESSING(SSfastprocess, src) + else + button.maptext = "[round(timeleft/10, 0.1)]" + +/datum/action/cooldown/Grant(mob/M) + ..() + if(owner) + UpdateButtonIcon() + if(next_use_time > world.time) + START_PROCESSING(SSfastprocess, src) + + //Stickmemes /datum/action/item_action/stickmen name = "Summon Stick Minions" diff --git a/code/datums/antagonists/abductor.dm b/code/datums/antagonists/abductor.dm deleted file mode 100644 index fde8d0059b..0000000000 --- a/code/datums/antagonists/abductor.dm +++ /dev/null @@ -1,182 +0,0 @@ -#define ABDUCTOR_MAX_TEAMS 4 - -/datum/antagonist/abductor - name = "Abductor" - roundend_category = "abductors" - antagpanel_category = "Abductor" - job_rank = ROLE_ABDUCTOR - show_in_antagpanel = FALSE //should only show subtypes - var/datum/team/abductor_team/team - var/sub_role - var/outfit - var/landmark_type - var/greet_text - - -/datum/antagonist/abductor/agent - name = "Abductor Agent" - sub_role = "Agent" - outfit = /datum/outfit/abductor/agent - landmark_type = /obj/effect/landmark/abductor/agent - greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." - show_in_antagpanel = TRUE - -/datum/antagonist/abductor/scientist - name = "Abductor Scientist" - sub_role = "Scientist" - outfit = /datum/outfit/abductor/scientist - landmark_type = /obj/effect/landmark/abductor/scientist - greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." - show_in_antagpanel = TRUE - -/datum/antagonist/abductor/create_team(datum/team/abductor_team/new_team) - if(!new_team) - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - team = new_team - -/datum/antagonist/abductor/get_team() - return team - -/datum/antagonist/abductor/on_gain() - SSticker.mode.abductors += owner - owner.special_role = "[name] [sub_role]" - owner.assigned_role = "[name] [sub_role]" - owner.objectives += team.objectives - finalize_abductor() - return ..() - -/datum/antagonist/abductor/on_removal() - SSticker.mode.abductors -= owner - owner.objectives -= team.objectives - if(owner.current) - to_chat(owner.current,"You are no longer the [owner.special_role]!") - owner.special_role = null - return ..() - -/datum/antagonist/abductor/greet() - to_chat(owner.current, "You are the [owner.special_role]!") - to_chat(owner.current, "With the help of your teammate, kidnap and experiment on station crew members!") - to_chat(owner.current, "[greet_text]") - owner.announce_objectives() - -/datum/antagonist/abductor/proc/finalize_abductor() - //Equip - var/mob/living/carbon/human/H = owner.current - H.set_species(/datum/species/abductor) - H.real_name = "[team.name] [sub_role]" - H.equipOutfit(outfit) - - //Teleport to ship - for(var/obj/effect/landmark/abductor/LM in GLOB.landmarks_list) - if(istype(LM, landmark_type) && LM.team_number == team.team_number) - H.forceMove(LM.loc) - break - - SSticker.mode.update_abductor_icons_added(owner) - -/datum/antagonist/abductor/scientist/finalize_abductor() - ..() - var/mob/living/carbon/human/H = owner.current - var/datum/species/abductor/A = H.dna.species - A.scientist = TRUE - -/datum/antagonist/abductor/admin_add(datum/mind/new_owner,mob/admin) - var/list/current_teams = list() - for(var/datum/team/abductor_team/T in get_all_teams(/datum/team/abductor_team)) - current_teams[T.name] = T - var/choice = input(admin,"Add to which team ?") as null|anything in (current_teams + "new team") - if (choice == "new team") - team = new - else if(choice in current_teams) - team = current_teams[choice] - else - return - new_owner.add_antag_datum(src) - log_admin("[key_name(usr)] made [key_name(new_owner.current)] [name] on [choice]!") - message_admins("[key_name_admin(usr)] made [key_name_admin(new_owner.current)] [name] on [choice] !") - -/datum/antagonist/abductor/get_admin_commands() - . = ..() - .["Equip"] = CALLBACK(src,.proc/admin_equip) - -/datum/antagonist/abductor/proc/admin_equip(mob/admin) - if(!ishuman(owner.current)) - to_chat(admin, "This only works on humans!") - return - var/mob/living/carbon/human/H = owner.current - var/gear = alert(admin,"Agent or Scientist Gear","Gear","Agent","Scientist") - if(gear) - if(gear=="Agent") - H.equipOutfit(/datum/outfit/abductor/agent) - else - H.equipOutfit(/datum/outfit/abductor/scientist) - -/datum/team/abductor_team - member_name = "abductor" - var/team_number - var/list/datum/mind/abductees = list() - var/static/team_count = 1 - -/datum/team/abductor_team/New() - ..() - team_number = team_count++ - name = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names - add_objective(new/datum/objective/experiment) - -/datum/team/abductor_team/is_solo() - return FALSE - -/datum/team/abductor_team/proc/add_objective(datum/objective/O) - O.team = src - O.update_explanation_text() - objectives += O - -/datum/team/abductor_team/roundend_report() - var/list/result = list() - - var/won = TRUE - for(var/datum/objective/O in objectives) - if(!O.check_completion()) - won = FALSE - if(won) - result += "[name] team fulfilled its mission!" - else - result += "[name] team failed its mission." - - result += "The abductors of [name] were:" - for(var/datum/mind/abductor_mind in members) - result += printplayer(abductor_mind) - result += printobjectives(abductor_mind) - - return result.Join("
") - -/datum/antagonist/abductee - name = "Abductee" - roundend_category = "abductees" - antagpanel_category = "Abductee" - -/datum/antagonist/abductee/on_gain() - give_objective() - . = ..() - -/datum/antagonist/abductee/greet() - to_chat(owner, "Your mind snaps!") - to_chat(owner, "You can't remember how you got here...") - owner.announce_objectives() - -/datum/antagonist/abductee/proc/give_objective() - var/mob/living/carbon/human/H = owner.current - if(istype(H)) - H.gain_trauma_type(BRAIN_TRAUMA_MILD) - var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) - var/datum/objective/abductee/O = new objtype() - objectives += O - owner.objectives += objectives - -/datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override) - SSticker.mode.update_abductor_icons_added(mob_override ? mob_override.mind : owner) - -/datum/antagonist/abductee/remove_innate_effects(mob/living/mob_override) - SSticker.mode.update_abductor_icons_removed(mob_override ? mob_override.mind : owner) \ No newline at end of file diff --git a/code/datums/antagonists/antag_datum.dm b/code/datums/antagonists/antag_datum.dm deleted file mode 100644 index 5f12d02398..0000000000 --- a/code/datums/antagonists/antag_datum.dm +++ /dev/null @@ -1,246 +0,0 @@ -GLOBAL_LIST_EMPTY(antagonists) - -/datum/antagonist - var/name = "Antagonist" - var/roundend_category = "other antagonists" //Section of roundend report, datums with same category will be displayed together, also default header for the section - var/show_in_roundend = TRUE //Set to false to hide the antagonists from roundend report - var/datum/mind/owner //Mind that owns this datum - var/silent = FALSE //Silent will prevent the gain/lose texts to show - var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum - var/list/typecache_datum_blacklist = list() //List of datums this type can't coexist with - var/delete_on_mind_deletion = TRUE - var/job_rank - var/replace_banned = TRUE //Should replace jobbaned player with ghosts if granted. - var/list/objectives = list() - var/antag_memory = ""//These will be removed with antag datum - - //Antag panel properties - var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind - var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED - -/datum/antagonist/New() - GLOB.antagonists += src - typecache_datum_blacklist = typecacheof(typecache_datum_blacklist) - -/datum/antagonist/Destroy() - GLOB.antagonists -= src - if(owner) - LAZYREMOVE(owner.antag_datums, src) - owner = null - return ..() - -/datum/antagonist/proc/can_be_owned(datum/mind/new_owner) - . = TRUE - var/datum/mind/tested = new_owner || owner - if(tested.has_antag_datum(type)) - return FALSE - for(var/i in tested.antag_datums) - var/datum/antagonist/A = i - if(is_type_in_typecache(src, A.typecache_datum_blacklist)) - return FALSE - -//This will be called in add_antag_datum before owner assignment. -//Should return antag datum without owner. -/datum/antagonist/proc/specialization(datum/mind/new_owner) - return src - -/datum/antagonist/proc/on_body_transfer(mob/living/old_body, mob/living/new_body) - remove_innate_effects(old_body) - apply_innate_effects(new_body) - -//This handles the application of antag huds/special abilities -/datum/antagonist/proc/apply_innate_effects(mob/living/mob_override) - return - -//This handles the removal of antag huds/special abilities -/datum/antagonist/proc/remove_innate_effects(mob/living/mob_override) - return - -//Assign default team and creates one for one of a kind team antagonists -/datum/antagonist/proc/create_team(datum/team/team) - return - -//Proc called when the datum is given to a mind. -/datum/antagonist/proc/on_gain() - if(owner && owner.current) - if(!silent) - greet() - apply_innate_effects() - if(is_banned(owner.current) && replace_banned) - replace_banned_player() - -/datum/antagonist/proc/is_banned(mob/M) - if(!M) - return FALSE - . = (jobban_isbanned(M, ROLE_SYNDICATE) || (job_rank && jobban_isbanned(M,job_rank))) - -/datum/antagonist/proc/replace_banned_player() - set waitfor = FALSE - - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [name]?", "[name]", null, job_rank, 50, owner.current) - if(LAZYLEN(candidates)) - var/client/C = pick(candidates) - to_chat(owner, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") - message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner.current)]) to replace a jobbaned player.") - owner.current.ghostize(0) - owner.current.key = C.key - -/datum/antagonist/proc/on_removal() - remove_innate_effects() - if(owner) - LAZYREMOVE(owner.antag_datums, src) - if(!silent && owner.current) - farewell() - var/datum/team/team = get_team() - if(team) - team.remove_member(owner) - qdel(src) - -/datum/antagonist/proc/greet() - return - -/datum/antagonist/proc/farewell() - return - -//Returns the team antagonist belongs to if any. -/datum/antagonist/proc/get_team() - return - -//Individual roundend report -/datum/antagonist/proc/roundend_report() - var/list/report = list() - - if(!owner) - CRASH("antagonist datum without owner") - - report += printplayer(owner) - - var/objectives_complete = TRUE - if(owner.objectives.len) - report += printobjectives(owner) - for(var/datum/objective/objective in owner.objectives) - if(!objective.check_completion()) - objectives_complete = FALSE - break - - if(owner.objectives.len == 0 || objectives_complete) - report += "The [name] was successful!" - else - report += "The [name] has failed!" - - return report.Join("
") - -//Displayed at the start of roundend_category section, default to roundend_category header -/datum/antagonist/proc/roundend_report_header() - return "The [roundend_category] were:
" - -//Displayed at the end of roundend_category section -/datum/antagonist/proc/roundend_report_footer() - return - - -//ADMIN TOOLS - -//Called when using admin tools to give antag status -/datum/antagonist/proc/admin_add(datum/mind/new_owner,mob/admin) - message_admins("[key_name_admin(admin)] made [new_owner.current] into [name].") - log_admin("[key_name(admin)] made [new_owner.current] into [name].") - new_owner.add_antag_datum(src) - -//Called when removing antagonist using admin tools -/datum/antagonist/proc/admin_remove(mob/user) - if(!user) - return - message_admins("[key_name_admin(user)] has removed [name] antagonist status from [owner.current].") - log_admin("[key_name(user)] has removed [name] antagonist status from [owner.current].") - on_removal() - -//gamemode/proc/is_mode_antag(antagonist/A) => TRUE/FALSE - -//Additional data to display in antagonist panel section -//nuke disk code, genome count, etc -/datum/antagonist/proc/antag_panel_data() - return "" - -/datum/antagonist/proc/enabled_in_preferences(datum/mind/M) - if(job_rank) - if(M.current && M.current.client && (job_rank in M.current.client.prefs.be_special)) - return TRUE - else - return FALSE - return TRUE - -// List if ["Command"] = CALLBACK(), user will be appeneded to callback arguments on execution -/datum/antagonist/proc/get_admin_commands() - . = list() - -/datum/antagonist/Topic(href,href_list) - if(!check_rights(R_ADMIN)) - return - //Antag memory edit - if (href_list["memory_edit"]) - edit_memory(usr) - owner.traitor_panel() - return - - //Some commands might delete/modify this datum clearing or changing owner - var/datum/mind/persistent_owner = owner - - var/commands = get_admin_commands() - for(var/admin_command in commands) - if(href_list["command"] == admin_command) - var/datum/callback/C = commands[admin_command] - C.Invoke(usr) - persistent_owner.traitor_panel() - return - -/datum/antagonist/proc/edit_memory(mob/user) - var/new_memo = copytext(trim(input(user,"Write new memory", "Memory", antag_memory) as null|message),1,MAX_MESSAGE_LEN) - if (isnull(new_memo)) - return - antag_memory = new_memo - -//Should probably be on ticker or job ss ? -/proc/get_antagonists(antag_type,specific = FALSE) - . = list() - for(var/datum/antagonist/A in GLOB.antagonists) - if(!A.owner) - continue - if(!antag_type || !specific && istype(A,antag_type) || specific && A.type == antag_type) - . += A.owner - -//This datum will autofill the name with special_role -//Used as placeholder for minor antagonists, please create proper datums for these -/datum/antagonist/auto_custom - show_in_antagpanel = FALSE - antagpanel_category = "Other" - -/datum/antagonist/auto_custom/on_gain() - ..() - name = owner.special_role - //Add all objectives not already owned by other datums to this one. - var/list/already_registered_objectives = list() - for(var/datum/antagonist/A in owner.antag_datums) - if(A == src) - continue - else - already_registered_objectives |= A.objectives - objectives = owner.objectives - already_registered_objectives - -/datum/antagonist/auto_custom/antag_listing_name() - return ..() + "([name])" - -//This one is created by admin tools for custom objectives -/datum/antagonist/custom - antagpanel_category = "Custom" - -/datum/antagonist/custom/admin_add(datum/mind/new_owner,mob/admin) - var/custom_name = stripped_input(admin, "Custom antagonist name:", "Custom antag", "Antagonist") - if(custom_name) - name = custom_name - else - return - ..() - -/datum/antagonist/custom/antag_listing_name() - return ..() + "([name])" \ No newline at end of file diff --git a/code/datums/antagonists/blob.dm b/code/datums/antagonists/blob.dm deleted file mode 100644 index 964bc99311..0000000000 --- a/code/datums/antagonists/blob.dm +++ /dev/null @@ -1,67 +0,0 @@ -/datum/antagonist/blob - name = "Blob" - roundend_category = "blobs" - antagpanel_category = "Blob" - job_rank = ROLE_BLOB - - var/datum/action/innate/blobpop/pop_action - var/starting_points_human_blob = 60 - var/point_rate_human_blob = 2 - -/datum/antagonist/blob/roundend_report() - var/basic_report = ..() - //Display max blobpoints for blebs that lost - if(isovermind(owner.current)) //embarrasing if not - var/mob/camera/blob/overmind = owner.current - if(!overmind.victory_in_progress) //if it won this doesn't really matter - var/point_report = "
[owner.name] took over [overmind.max_count] tiles at the height of its growth." - return basic_report+point_report - return basic_report - -/datum/antagonist/blob/greet() - if(!isovermind(owner.current)) - to_chat(owner,"You feel bloated.") - -/datum/antagonist/blob/on_gain() - create_objectives() - . = ..() - -/datum/antagonist/blob/proc/create_objectives() - var/datum/objective/blob_takeover/main = new - main.owner = owner - objectives += main - owner.objectives |= objectives - -/datum/antagonist/blob/apply_innate_effects(mob/living/mob_override) - if(!isovermind(owner.current)) - if(!pop_action) - pop_action = new - pop_action.Grant(owner.current) - -/datum/objective/blob_takeover - explanation_text = "Reach critical mass!" - -//Non-overminds get this on blob antag assignment -/datum/action/innate/blobpop - name = "Pop" - desc = "Unleash the blob" - icon_icon = 'icons/mob/blob.dmi' - button_icon_state = "blob" - -/datum/action/innate/blobpop/Activate() - var/mob/old_body = owner - var/datum/antagonist/blob/blobtag = owner.mind.has_antag_datum(/datum/antagonist/blob) - if(!blobtag) - Remove() - return - var/mob/camera/blob/B = new /mob/camera/blob(get_turf(old_body), blobtag.starting_points_human_blob) - owner.mind.transfer_to(B) - old_body.gib() - B.place_blob_core(blobtag.point_rate_human_blob, pop_override = TRUE) - -/datum/antagonist/blob/antag_listing_status() - . = ..() - if(owner && owner.current) - var/mob/camera/blob/B = owner.current - if(istype(B)) - . += "(Progress: [B.blobs_legit.len]/[B.blobwincount])" \ No newline at end of file diff --git a/code/datums/antagonists/brother.dm b/code/datums/antagonists/brother.dm deleted file mode 100644 index d8371d3751..0000000000 --- a/code/datums/antagonists/brother.dm +++ /dev/null @@ -1,154 +0,0 @@ -/datum/antagonist/brother - name = "Brother" - antagpanel_category = "Brother" - job_rank = ROLE_BROTHER - var/special_role = ROLE_BROTHER - var/datum/team/brother_team/team - -/datum/antagonist/brother/create_team(datum/team/brother_team/new_team) - if(!new_team) - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - team = new_team - -/datum/antagonist/brother/get_team() - return team - -/datum/antagonist/brother/on_gain() - SSticker.mode.brothers += owner - objectives += team.objectives - owner.objectives += objectives - owner.special_role = special_role - finalize_brother() - return ..() - -/datum/antagonist/brother/on_removal() - SSticker.mode.brothers -= owner - owner.objectives -= objectives - if(owner.current) - to_chat(owner.current,"You are no longer the [special_role]!") - owner.special_role = null - return ..() - -/datum/antagonist/brother/proc/give_meeting_area() - if(!owner.current || !team || !team.meeting_area) - return - to_chat(owner.current, "Your designated meeting area: [team.meeting_area]") - antag_memory += "Meeting Area: [team.meeting_area]
" - -/datum/antagonist/brother/greet() - var/brother_text = "" - var/list/brothers = team.members - owner - for(var/i = 1 to brothers.len) - var/datum/mind/M = brothers[i] - brother_text += M.name - if(i == brothers.len - 1) - brother_text += " and " - else if(i != brothers.len) - brother_text += ", " - to_chat(owner.current, "You are the [owner.special_role] of [brother_text].") - to_chat(owner.current, "The Syndicate only accepts those that have proven themself. Prove yourself and prove your [team.member_name]s by completing your objectives together!") - owner.announce_objectives() - give_meeting_area() - -/datum/antagonist/brother/proc/finalize_brother() - SSticker.mode.update_brother_icons_added(owner) - -/datum/antagonist/brother/admin_add(datum/mind/new_owner,mob/admin) - //show list of possible brothers - var/list/candidates = list() - for(var/mob/living/L in GLOB.alive_mob_list) - if(!L.mind || L.mind == new_owner || !can_be_owned(L.mind)) - continue - candidates[L.mind.name] = L.mind - - var/choice = input(admin,"Choose the blood brother.", "Brother") as null|anything in candidates - if(!choice) - return - var/datum/mind/bro = candidates[choice] - var/datum/team/brother_team/T = new - T.add_member(new_owner) - T.add_member(bro) - T.pick_meeting_area() - T.forge_brother_objectives() - new_owner.add_antag_datum(/datum/antagonist/brother,T) - bro.add_antag_datum(/datum/antagonist/brother, T) - T.update_name() - message_admins("[key_name_admin(admin)] made [new_owner.current] and [bro.current] into blood brothers.") - log_admin("[key_name(admin)] made [new_owner.current] and [bro.current] into blood brothers.") - -/datum/team/brother_team - name = "brotherhood" - member_name = "blood brother" - var/meeting_area - var/static/meeting_areas = list("The Bar", "Dorms", "Escape Dock", "Arrivals", "Holodeck", "Primary Tool Storage", "Recreation Area", "Chapel", "Library") - -/datum/team/brother_team/is_solo() - return FALSE - -/datum/team/brother_team/proc/pick_meeting_area() - meeting_area = pick(meeting_areas) - meeting_areas -= meeting_area - -/datum/team/brother_team/proc/update_name() - var/list/last_names = list() - for(var/datum/mind/M in members) - var/list/split_name = splittext(M.name," ") - last_names += split_name[split_name.len] - - name = last_names.Join(" & ") - -/datum/team/brother_team/roundend_report() - var/list/parts = list() - - parts += "The blood brothers of [name] were:" - for(var/datum/mind/M in members) - parts += printplayer(M) - var/win = TRUE - var/objective_count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[objective_count]: [objective.explanation_text] Success!" - else - parts += "Objective #[objective_count]: [objective.explanation_text] Fail." - win = FALSE - objective_count++ - if(win) - parts += "The blood brothers were successful!" - else - parts += "The blood brothers have failed!" - - return "
[parts.Join("
")]
" - -/datum/team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE) - O.team = src - if(needs_target) - O.find_target() - O.update_explanation_text() - objectives += O - -/datum/team/brother_team/proc/forge_brother_objectives() - objectives = list() - var/is_hijacker = prob(10) - for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker)) - forge_single_objective() - if(is_hijacker) - if(!locate(/datum/objective/hijack) in objectives) - add_objective(new/datum/objective/hijack) - else if(!locate(/datum/objective/escape) in objectives) - add_objective(new/datum/objective/escape) - -/datum/team/brother_team/proc/forge_single_objective() - if(prob(50)) - if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len)) - add_objective(new/datum/objective/destroy, TRUE) - else if(prob(30)) - add_objective(new/datum/objective/maroon, TRUE) - else - add_objective(new/datum/objective/assassinate, TRUE) - else - add_objective(new/datum/objective/steal, TRUE) - -/datum/team/brother_team/antag_listing_name() - return "[name] blood brothers" \ No newline at end of file diff --git a/code/datums/antagonists/changeling.dm b/code/datums/antagonists/changeling.dm deleted file mode 100644 index 2bc4900ac5..0000000000 --- a/code/datums/antagonists/changeling.dm +++ /dev/null @@ -1,545 +0,0 @@ -#define LING_FAKEDEATH_TIME 400 //40 seconds -#define LING_DEAD_GENETICDAMAGE_HEAL_CAP 50 //The lowest value of geneticdamage handle_changeling() can take it to while dead. -#define LING_ABSORB_RECENT_SPEECH 8 //The amount of recent spoken lines to gain on absorbing a mob - -/datum/antagonist/changeling - name = "Changeling" - roundend_category = "changelings" - antagpanel_category = "Changeling" - job_rank = ROLE_CHANGELING - - var/you_are_greet = TRUE - var/give_objectives = TRUE - var/team_mode = FALSE //Should assign team objectives ? - - //Changeling Stuff - - var/list/stored_profiles = list() //list of datum/changelingprofile - var/datum/changelingprofile/first_prof = null - var/dna_max = 6 //How many extra DNA strands the changeling can store for transformation. - var/absorbedcount = 0 - var/chem_charges = 20 - var/chem_storage = 75 - var/chem_recharge_rate = 1 - var/chem_recharge_slowdown = 0 - var/sting_range = 2 - var/changelingID = "Changeling" - var/geneticdamage = 0 - var/isabsorbing = 0 - var/islinking = 0 - var/geneticpoints = 10 - var/purchasedpowers = list() - var/mimicing = "" - var/canrespec = 0 - var/changeling_speak = 0 - var/datum/dna/chosen_dna - var/obj/effect/proc_holder/changeling/sting/chosen_sting - var/datum/cellular_emporium/cellular_emporium - var/datum/action/innate/cellular_emporium/emporium_action - - // wip stuff - var/static/list/all_powers = typecacheof(/obj/effect/proc_holder/changeling,TRUE) - - -/datum/antagonist/changeling/Destroy() - QDEL_NULL(cellular_emporium) - QDEL_NULL(emporium_action) - . = ..() - -/datum/antagonist/changeling/proc/generate_name() - var/honorific - if(owner.current.gender == FEMALE) - honorific = "Ms." - else - honorific = "Mr." - if(GLOB.possible_changeling_IDs.len) - changelingID = pick(GLOB.possible_changeling_IDs) - GLOB.possible_changeling_IDs -= changelingID - changelingID = "[honorific] [changelingID]" - else - changelingID = "[honorific] [rand(1,999)]" - -/datum/antagonist/changeling/proc/create_actions() - cellular_emporium = new(src) - emporium_action = new(cellular_emporium) - -/datum/antagonist/changeling/on_gain() - generate_name() - create_actions() - reset_powers() - create_initial_profile() - if(give_objectives) - if(team_mode) - forge_team_objectives() - forge_objectives() - remove_clownmut() - . = ..() - -/datum/antagonist/changeling/on_removal() - //We'll be using this from now on - var/mob/living/carbon/C = owner.current - if(istype(C)) - var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) - if(B && (B.decoy_override != initial(B.decoy_override))) - B.vital = TRUE - B.decoy_override = FALSE - remove_changeling_powers() - owner.objectives -= objectives - . = ..() - -/datum/antagonist/changeling/proc/remove_clownmut() - if (owner) - var/mob/living/carbon/human/H = owner.current - if(istype(H) && owner.assigned_role == "Clown") - to_chat(H, "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself.") - H.dna.remove_mutation(CLOWNMUT) - -/datum/antagonist/changeling/proc/reset_properties() - changeling_speak = 0 - chosen_sting = null - geneticpoints = initial(geneticpoints) - sting_range = initial(sting_range) - chem_storage = initial(chem_storage) - chem_recharge_rate = initial(chem_recharge_rate) - chem_charges = min(chem_charges, chem_storage) - chem_recharge_slowdown = initial(chem_recharge_slowdown) - mimicing = "" - -/datum/antagonist/changeling/proc/remove_changeling_powers() - if(ishuman(owner.current) || ismonkey(owner.current)) - reset_properties() - for(var/obj/effect/proc_holder/changeling/p in purchasedpowers) - if(p.always_keep) - continue - purchasedpowers -= p - p.on_refund(owner.current) - - //MOVE THIS - if(owner.current.hud_used) - owner.current.hud_used.lingstingdisplay.icon_state = null - owner.current.hud_used.lingstingdisplay.invisibility = INVISIBILITY_ABSTRACT - -/datum/antagonist/changeling/proc/reset_powers() - if(purchasedpowers) - remove_changeling_powers() - //Repurchase free powers. - for(var/path in all_powers) - var/obj/effect/proc_holder/changeling/S = new path() - if(!S.dna_cost) - if(!has_sting(S)) - purchasedpowers += S - S.on_purchase(owner.current,TRUE) - -/datum/antagonist/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power) - for(var/obj/effect/proc_holder/changeling/P in purchasedpowers) - if(initial(power.name) == P.name) - return TRUE - return FALSE - - -/datum/antagonist/changeling/proc/purchase_power(sting_name) - var/obj/effect/proc_holder/changeling/thepower = null - - for(var/path in all_powers) - var/obj/effect/proc_holder/changeling/S = path - if(initial(S.name) == sting_name) - thepower = new path() - break - - if(!thepower) - to_chat(owner.current, "This is awkward. Changeling power purchase failed, please report this bug to a coder!") - return - - if(absorbedcount < thepower.req_dna) - to_chat(owner.current, "We lack the energy to evolve this ability!") - return - - if(has_sting(thepower)) - to_chat(owner.current, "We have already evolved this ability!") - return - - if(thepower.dna_cost < 0) - to_chat(owner.current, "We cannot evolve this ability.") - return - - if(geneticpoints < thepower.dna_cost) - to_chat(owner.current, "We have reached our capacity for abilities.") - return - - if(owner.current.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist. - to_chat(owner.current, "We lack the energy to evolve new abilities right now.") - return - - geneticpoints -= thepower.dna_cost - purchasedpowers += thepower - thepower.on_purchase(owner.current) - -/datum/antagonist/changeling/proc/readapt() - if(!ishuman(owner.current)) - to_chat(owner.current, "We can't remove our evolutions in this form!") - return - if(canrespec) - to_chat(owner.current, "We have removed our evolutions from this form, and are now ready to readapt.") - reset_powers() - canrespec = 0 - SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, "Readapt") - return 1 - else - to_chat(owner.current, "You lack the power to readapt your evolutions!") - return 0 - -//Called in life() -/datum/antagonist/changeling/proc/regenerate() - var/mob/living/carbon/the_ling = owner.current - if(istype(the_ling)) - emporium_action.Grant(the_ling) - if(the_ling.stat == DEAD) - chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), (chem_storage*0.5)) - geneticdamage = max(LING_DEAD_GENETICDAMAGE_HEAL_CAP,geneticdamage-1) - else //not dead? no chem/geneticdamage caps. - chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage) - geneticdamage = max(0, geneticdamage-1) - - -/datum/antagonist/changeling/proc/get_dna(dna_owner) - for(var/datum/changelingprofile/prof in stored_profiles) - if(dna_owner == prof.name) - return prof - -/datum/antagonist/changeling/proc/has_dna(datum/dna/tDNA) - for(var/datum/changelingprofile/prof in stored_profiles) - if(tDNA.is_same_as(prof.dna)) - return TRUE - return FALSE - -/datum/antagonist/changeling/proc/can_absorb_dna(mob/living/carbon/human/target, var/verbose=1) - var/mob/living/carbon/user = owner.current - if(!istype(user)) - return - if(stored_profiles.len) - var/datum/changelingprofile/prof = stored_profiles[1] - if(prof.dna == user.dna && stored_profiles.len >= dna_max)//If our current DNA is the stalest, we gotta ditch it. - if(verbose) - to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.") - return - if(!target) - return - if(NO_DNA_COPY in target.dna.species.species_traits) - if(verbose) - to_chat(user, "[target] is not compatible with our biology.") - return - if((target.has_disability(DISABILITY_NOCLONE)) || (target.has_disability(DISABILITY_NOCLONE))) - if(verbose) - to_chat(user, "DNA of [target] is ruined beyond usability!") - return - if(!ishuman(target))//Absorbing monkeys is entirely possible, but it can cause issues with transforming. That's what lesser form is for anyway! - if(verbose) - to_chat(user, "We could gain no benefit from absorbing a lesser creature.") - return - if(has_dna(target.dna)) - if(verbose) - to_chat(user, "We already have this DNA in storage!") - return - if(!target.has_dna()) - if(verbose) - to_chat(user, "[target] is not compatible with our biology.") - return - return 1 - - -/datum/antagonist/changeling/proc/create_profile(mob/living/carbon/human/H, protect = 0) - var/datum/changelingprofile/prof = new - - H.dna.real_name = H.real_name //Set this again, just to be sure that it's properly set. - var/datum/dna/new_dna = new H.dna.type - H.dna.copy_dna(new_dna) - prof.dna = new_dna - prof.name = H.real_name - prof.protected = protect - - prof.underwear = H.underwear - prof.undershirt = H.undershirt - prof.socks = H.socks - - var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store") - for(var/slot in slots) - if(slot in H.vars) - var/obj/item/I = H.vars[slot] - if(!I) - continue - prof.name_list[slot] = I.name - prof.appearance_list[slot] = I.appearance - prof.flags_cover_list[slot] = I.flags_cover - prof.item_color_list[slot] = I.item_color - prof.item_state_list[slot] = I.item_state - prof.exists_list[slot] = 1 - else - continue - - return prof - -/datum/antagonist/changeling/proc/add_profile(datum/changelingprofile/prof) - if(stored_profiles.len > dna_max) - if(!push_out_profile()) - return - - if(!first_prof) - first_prof = prof - - stored_profiles += prof - absorbedcount++ - -/datum/antagonist/changeling/proc/add_new_profile(mob/living/carbon/human/H, protect = 0) - var/datum/changelingprofile/prof = create_profile(H, protect) - add_profile(prof) - return prof - -/datum/antagonist/changeling/proc/remove_profile(mob/living/carbon/human/H, force = 0) - for(var/datum/changelingprofile/prof in stored_profiles) - if(H.real_name == prof.name) - if(prof.protected && !force) - continue - stored_profiles -= prof - qdel(prof) - -/datum/antagonist/changeling/proc/get_profile_to_remove() - for(var/datum/changelingprofile/prof in stored_profiles) - if(!prof.protected) - return prof - -/datum/antagonist/changeling/proc/push_out_profile() - var/datum/changelingprofile/removeprofile = get_profile_to_remove() - if(removeprofile) - stored_profiles -= removeprofile - return 1 - return 0 - - -/datum/antagonist/changeling/proc/create_initial_profile() - var/mob/living/carbon/C = owner.current //only carbons have dna now, so we have to typecaste - if(ishuman(C)) - add_new_profile(C) - -/datum/antagonist/changeling/apply_innate_effects() - //Brains optional. - var/mob/living/carbon/C = owner.current - if(istype(C)) - var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) - if(B) - B.vital = FALSE - B.decoy_override = TRUE - update_changeling_icons_added() - return - -/datum/antagonist/changeling/remove_innate_effects() - update_changeling_icons_removed() - return - - -/datum/antagonist/changeling/greet() - if (you_are_greet) - to_chat(owner.current, "You are [changelingID], a changeling! You have absorbed and taken the form of a human.") - to_chat(owner.current, "Use say \":g message\" to communicate with your fellow changelings.") - to_chat(owner.current, "You must complete the following tasks:") - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_aler.ogg', 100, FALSE, pressure_affected = FALSE) - - owner.announce_objectives() - -/datum/antagonist/changeling/farewell() - to_chat(owner.current, "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!") - -/datum/antagonist/changeling/proc/forge_team_objectives() - if(GLOB.changeling_team_objective_type) - var/datum/objective/changeling_team_objective/team_objective = new GLOB.changeling_team_objective_type - team_objective.owner = owner - objectives += team_objective - return - -/datum/antagonist/changeling/proc/forge_objectives() - //OBJECTIVES - random traitor objectives. Unique objectives "steal brain" and "identity theft". - //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting - //If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone - - var/escape_objective_possible = TRUE - - //if there's a team objective, check if it's compatible with escape objectives - for(var/datum/objective/changeling_team_objective/CTO in objectives) - if(!CTO.escape_objective_compatible) - escape_objective_possible = FALSE - break - - var/datum/objective/absorb/absorb_objective = new - absorb_objective.owner = owner - absorb_objective.gen_amount_goal(6, 8) - objectives += absorb_objective - - if(prob(60)) - if(prob(85)) - var/datum/objective/steal/steal_objective = new - steal_objective.owner = owner - steal_objective.find_target() - objectives += steal_objective - else - var/datum/objective/download/download_objective = new - download_objective.owner = owner - download_objective.gen_amount_goal() - objectives += download_objective - - var/list/active_ais = active_ais() - if(active_ais.len && prob(100/GLOB.joined_player_list.len)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = owner - destroy_objective.find_target() - objectives += destroy_objective - else - if(prob(70)) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - if(team_mode) //No backstabbing while in a team - kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) - else - kill_objective.find_target() - objectives += kill_objective - else - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = owner - if(team_mode) - maroon_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) - else - maroon_objective.find_target() - objectives += maroon_objective - - if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) - var/datum/objective/escape/escape_with_identity/identity_theft = new - identity_theft.owner = owner - identity_theft.target = maroon_objective.target - identity_theft.update_explanation_text() - objectives += identity_theft - escape_objective_possible = FALSE - - if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) - if(prob(50)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - else - var/datum/objective/escape/escape_with_identity/identity_theft = new - identity_theft.owner = owner - if(team_mode) - identity_theft.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) - else - identity_theft.find_target() - objectives += identity_theft - escape_objective_possible = FALSE - - owner.objectives |= objectives - -/datum/antagonist/changeling/proc/update_changeling_icons_added() - var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING] - hud.join_hud(owner.current) - set_antag_hud(owner.current, "changling") - -/datum/antagonist/changeling/proc/update_changeling_icons_removed() - var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING] - hud.leave_hud(owner.current) - set_antag_hud(owner.current, null) - -/datum/antagonist/changeling/admin_add(datum/mind/new_owner,mob/admin) - . = ..() - to_chat(new_owner.current, "Our powers have awoken. A flash of memory returns to us...we are [changelingID], a changeling!") - -/datum/antagonist/changeling/get_admin_commands() - . = ..() - if(stored_profiles.len && (owner.current.real_name != first_prof.name)) - .["Transform to initial appearance."] = CALLBACK(src,.proc/admin_restore_appearance) - -/datum/antagonist/changeling/proc/admin_restore_appearance(mob/admin) - if(!stored_profiles.len || !iscarbon(owner.current)) - to_chat(admin, "Resetting DNA failed!") - else - var/mob/living/carbon/C = owner.current - first_prof.dna.transfer_identity(C, transfer_SE=1) - C.real_name = first_prof.name - C.updateappearance(mutcolor_update=1) - C.domutcheck() - -// Profile - -/datum/changelingprofile - var/name = "a bug" - - var/protected = 0 - - var/datum/dna/dna = null - var/list/name_list = list() //associative list of slotname = itemname - var/list/appearance_list = list() - var/list/flags_cover_list = list() - var/list/exists_list = list() - var/list/item_color_list = list() - var/list/item_state_list = list() - - var/underwear - var/undershirt - var/socks - -/datum/changelingprofile/Destroy() - qdel(dna) - . = ..() - -/datum/changelingprofile/proc/copy_profile(datum/changelingprofile/newprofile) - newprofile.name = name - newprofile.protected = protected - newprofile.dna = new dna.type - dna.copy_dna(newprofile.dna) - newprofile.name_list = name_list.Copy() - newprofile.appearance_list = appearance_list.Copy() - newprofile.flags_cover_list = flags_cover_list.Copy() - newprofile.exists_list = exists_list.Copy() - newprofile.item_color_list = item_color_list.Copy() - newprofile.item_state_list = item_state_list.Copy() - newprofile.underwear = underwear - newprofile.undershirt = undershirt - newprofile.socks = socks - - -/datum/antagonist/changeling/xenobio - name = "Xenobio Changeling" - give_objectives = FALSE - show_in_roundend = FALSE //These are here for admin tracking purposes only - you_are_greet = FALSE - -/datum/antagonist/changeling/roundend_report() - var/list/parts = list() - - var/changelingwin = 1 - if(!owner.current) - changelingwin = 0 - - parts += printplayer(owner) - - //Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed. - parts += "Changeling ID: [changelingID]." - parts += "Genomes Extracted: [absorbedcount]" - parts += " " - if(objectives.len) - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!
" - else - parts += "Objective #[count]: [objective.explanation_text] Fail." - changelingwin = 0 - count++ - - if(changelingwin) - parts += "The changeling was successful!" - else - parts += "The changeling has failed." - - return parts.Join("
") - -/datum/antagonist/changeling/antag_listing_name() - return ..() + "([changelingID])" - -/datum/antagonist/changeling/xenobio/antag_listing_name() - return ..() + "(Xenobio)" \ No newline at end of file diff --git a/code/datums/antagonists/clockcult.dm b/code/datums/antagonists/clockcult.dm deleted file mode 100644 index 067801677b..0000000000 --- a/code/datums/antagonists/clockcult.dm +++ /dev/null @@ -1,219 +0,0 @@ -//CLOCKCULT PROOF OF CONCEPT -/datum/antagonist/clockcult - name = "Clock Cultist" - roundend_category = "clock cultists" - antagpanel_category = "Clockcult" - job_rank = ROLE_SERVANT_OF_RATVAR - var/datum/action/innate/hierophant/hierophant_network = new() - var/datum/team/clockcult/clock_team - var/make_team = TRUE //This should be only false for tutorial scarabs - -/datum/antagonist/clockcult/silent - silent = TRUE - show_in_antagpanel = FALSE //internal - -/datum/antagonist/clockcult/Destroy() - qdel(hierophant_network) - return ..() - -/datum/antagonist/clockcult/get_team() - return clock_team - -/datum/antagonist/clockcult/create_team(datum/team/clockcult/new_team) - if(!new_team && make_team) - //TODO blah blah same as the others, allow multiple - for(var/datum/antagonist/clockcult/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.clock_team) - clock_team = H.clock_team - return - clock_team = new /datum/team/clockcult - return - if(make_team && !istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - clock_team = new_team - -/datum/antagonist/clockcult/can_be_owned(datum/mind/new_owner) - . = ..() - if(.) - . = is_eligible_servant(new_owner.current) - -/datum/antagonist/clockcult/greet() - if(!owner.current || silent) - return - owner.current.visible_message("[owner.current]'s eyes glow a blazing yellow!", null, null, 7, owner.current) //don't show the owner this message - to_chat(owner.current, "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork \ - Justiciar above all else. Perform his every whim without hesitation.") - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/clockcultalr.ogg', 70, FALSE, pressure_affected = FALSE) - -/datum/antagonist/clockcult/on_gain() - var/mob/living/current = owner.current - SSticker.mode.servants_of_ratvar += owner - SSticker.mode.update_servant_icons_added(owner) - owner.special_role = ROLE_SERVANT_OF_RATVAR - owner.current.log_message("Has been converted to the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) - if(issilicon(current)) - if(iscyborg(current) && !silent) - var/mob/living/silicon/robot/R = current - if(R.connected_ai && !is_servant_of_ratvar(R.connected_ai)) - to_chat(R, "You have been desynced from your master AI.
\ - In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.
") - else - to_chat(R, "Your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.") - if(isAI(current)) - to_chat(current, "You are now able to use your cameras to listen in on conversations, but can no longer speak in anything but Ratvarian.") - to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") - else if(isbrain(current) || isclockmob(current)) - to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") - ..() - to_chat(current, "This is Ratvar's will: [CLOCKCULT_OBJECTIVE]") - antag_memory += "Ratvar's will: [CLOCKCULT_OBJECTIVE]
" //Memorize the objectives - -/datum/antagonist/clockcult/apply_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(istype(mob_override)) - current = mob_override - GLOB.all_clockwork_mobs += current - current.faction |= "ratvar" - current.grant_language(/datum/language/ratvar) - current.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons - if(issilicon(current)) - var/mob/living/silicon/S = current - if(iscyborg(S)) - var/mob/living/silicon/robot/R = S - if(!R.shell) - R.UnlinkSelf() - R.module.rebuild_modules() - else if(isAI(S)) - var/mob/living/silicon/ai/A = S - A.can_be_carded = FALSE - A.requires_power = POWER_REQ_CLOCKCULT - var/list/AI_frame = list(mutable_appearance('icons/mob/clockwork_mobs.dmi', "aiframe")) //make the AI's cool frame - for(var/d in GLOB.cardinals) - AI_frame += image('icons/mob/clockwork_mobs.dmi', A, "eye[rand(1, 10)]", dir = d) //the eyes are randomly fast or slow - A.add_overlay(AI_frame) - if(!A.lacks_power()) - A.ai_restore_power() - if(A.eyeobj) - A.eyeobj.relay_speech = TRUE - for(var/mob/living/silicon/robot/R in A.connected_robots) - if(R.connected_ai == A) - add_servant_of_ratvar(R) - S.laws = new/datum/ai_laws/ratvar - S.laws.associate(S) - S.update_icons() - S.show_laws() - hierophant_network.title = "Silicon" - hierophant_network.span_for_name = "nezbere" - hierophant_network.span_for_message = "brass" - else if(isbrain(current)) - hierophant_network.title = "Vessel" - hierophant_network.span_for_name = "nezbere" - hierophant_network.span_for_message = "alloy" - else if(isclockmob(current)) - hierophant_network.title = "Construct" - hierophant_network.span_for_name = "nezbere" - hierophant_network.span_for_message = "brass" - hierophant_network.Grant(current) - current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump) - var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar - if(G.active && ishuman(current)) - current.add_overlay(mutable_appearance('icons/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER)) - -/datum/antagonist/clockcult/remove_innate_effects(mob/living/mob_override) - var/mob/living/current = owner.current - if(istype(mob_override)) - current = mob_override - GLOB.all_clockwork_mobs -= current - current.faction -= "ratvar" - current.remove_language(/datum/language/ratvar) - current.clear_alert("clockinfo") - for(var/datum/action/innate/clockwork_armaments/C in owner.current.actions) //Removes any bound clockwork armor - qdel(C) - for(var/datum/action/innate/call_weapon/W in owner.current.actions) //and weapons too - qdel(W) - if(issilicon(current)) - var/mob/living/silicon/S = current - if(isAI(S)) - var/mob/living/silicon/ai/A = S - A.can_be_carded = initial(A.can_be_carded) - A.requires_power = initial(A.requires_power) - A.cut_overlays() - S.make_laws() - S.update_icons() - S.show_laws() - var/mob/living/temp_owner = current - ..() - if(iscyborg(temp_owner)) - var/mob/living/silicon/robot/R = temp_owner - R.module.rebuild_modules() - if(temp_owner) - temp_owner.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them, we need to update buttons - temp_owner.cut_overlays() - temp_owner.regenerate_icons() - -/datum/antagonist/clockcult/on_removal() - SSticker.mode.servants_of_ratvar -= owner - SSticker.mode.update_servant_icons_removed(owner) - if(!silent) - owner.current.visible_message("[owner] seems to have remembered their true allegiance!", null, null, null, owner.current) - to_chat(owner, "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.") - owner.current.log_message("Has renounced the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) - owner.special_role = null - if(iscyborg(owner.current)) - to_chat(owner.current, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.") - . = ..() - - -/datum/antagonist/clockcult/admin_add(datum/mind/new_owner,mob/admin) - add_servant_of_ratvar(new_owner.current, TRUE) - message_admins("[key_name_admin(admin)] has made [new_owner.current] into a servant of Ratvar.") - log_admin("[key_name(admin)] has made [new_owner.current] into a servant of Ratvar.") - -/datum/antagonist/clockcult/admin_remove(mob/user) - remove_servant_of_ratvar(owner.current, TRUE) - message_admins("[key_name_admin(user)] has removed clockwork servant status from [owner.current].") - log_admin("[key_name(user)] has removed clockwork servant status from [owner.current].") - -/datum/antagonist/clockcult/get_admin_commands() - . = ..() - .["Give slab"] = CALLBACK(src,.proc/admin_give_slab) - -/datum/antagonist/clockcult/proc/admin_give_slab(mob/admin) - if(!SSticker.mode.equip_servant(owner.current)) - to_chat(admin, "Failed to outfit [owner.current]!") - else - to_chat(admin, "Successfully gave [owner.current] servant equipment!") - -/datum/team/clockcult - name = "Clockcult" - var/list/objective - var/datum/mind/eminence - -/datum/team/clockcult/proc/check_clockwork_victory() - if(GLOB.clockwork_gateway_activated) - return TRUE - return FALSE - -/datum/team/clockcult/roundend_report() - var/list/parts = list() - - if(check_clockwork_victory()) - parts += "Ratvar's servants defended the Ark until its activation!" - else - parts += "The Ark was destroyed! Ratvar will rust away for all eternity!" - parts += " " - parts += "The servants' objective was: [CLOCKCULT_OBJECTIVE]." - parts += "Construction Value(CV) was: [GLOB.clockwork_construction_value]" - for(var/i in SSticker.scripture_states) - if(i != SCRIPTURE_DRIVER) - parts += "[i] scripture was: [SSticker.scripture_states[i] ? "UN":""]LOCKED" - if(eminence) - parts += "The Eminence was: [printplayer(eminence)]" - if(members.len) - parts += "Ratvar's servants were:" - parts += printplayerlist(members - eminence) - - return "
[parts.Join("
")]
" \ No newline at end of file diff --git a/code/datums/antagonists/cult.dm b/code/datums/antagonists/cult.dm deleted file mode 100644 index 3b9fa7b8c4..0000000000 --- a/code/datums/antagonists/cult.dm +++ /dev/null @@ -1,329 +0,0 @@ -#define SUMMON_POSSIBILITIES 3 - -/datum/antagonist/cult - name = "Cultist" - roundend_category = "cultists" - antagpanel_category = "Cult" - var/datum/action/innate/cult/comm/communion = new - var/datum/action/innate/cult/mastervote/vote = new - job_rank = ROLE_CULTIST - var/ignore_implant = FALSE - var/give_equipment = FALSE - - var/datum/team/cult/cult_team - -/datum/antagonist/cult/get_team() - return cult_team - -/datum/antagonist/cult/create_team(datum/team/cult/new_team) - if(!new_team) - //todo remove this and allow admin buttons to create more than one cult - for(var/datum/antagonist/cult/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.cult_team) - cult_team = H.cult_team - return - cult_team = new /datum/team/cult - cult_team.setup_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - cult_team = new_team - -/datum/antagonist/cult/proc/add_objectives() - objectives |= cult_team.objectives - owner.objectives |= objectives - -/datum/antagonist/cult/proc/remove_objectives() - owner.objectives -= objectives - -/datum/antagonist/cult/Destroy() - QDEL_NULL(communion) - QDEL_NULL(vote) - return ..() - -/datum/antagonist/cult/can_be_owned(datum/mind/new_owner) - . = ..() - if(. && !ignore_implant) - . = is_convertable_to_cult(new_owner.current,cult_team) - -/datum/antagonist/cult/greet() - to_chat(owner, "You are a member of the cult!") - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change - owner.announce_objectives() - -/datum/antagonist/cult/on_gain() - . = ..() - var/mob/living/current = owner.current - add_objectives() - if(give_equipment) - equip_cultist() - SSticker.mode.cult += owner // Only add after they've been given objectives - SSticker.mode.update_cult_icons_added(owner) - current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - - if(cult_team.blood_target && cult_team.blood_target_image && current.client) - current.client.images += cult_team.blood_target_image - - -/datum/antagonist/cult/proc/equip_cultist(tome=FALSE) - var/mob/living/carbon/H = owner.current - if(!istype(H)) - return - if (owner.assigned_role == "Clown") - to_chat(owner, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - H.dna.remove_mutation(CLOWNMUT) - - if(tome) - . += cult_give_item(/obj/item/tome, H) - else - . += cult_give_item(/obj/item/paper/talisman/supply, H) - to_chat(owner, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.") - - -/datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) - var/list/slots = list( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store - ) - - var/T = new item_path(mob) - var/item_name = initial(item_path.name) - var/where = mob.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(mob, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).") - return 0 - else - to_chat(mob, "You have a [item_name] in your [where].") - if(where == "backpack") - var/obj/item/storage/B = mob.back - B.orient2hud(mob) - B.show_to(mob) - return 1 - -/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override - current.faction |= "cult" - current.grant_language(/datum/language/narsie) - current.verbs += /mob/living/proc/cult_help - if(!cult_team.cult_mastered) - vote.Grant(current) - communion.Grant(current) - current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) - -/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override - current.faction -= "cult" - current.remove_language(/datum/language/narsie) - current.verbs -= /mob/living/proc/cult_help - vote.Remove(current) - communion.Remove(current) - current.clear_alert("bloodsense") - -/datum/antagonist/cult/on_removal() - remove_objectives() - SSticker.mode.cult -= owner - SSticker.mode.update_cult_icons_removed(owner) - if(!silent) - owner.current.visible_message("[owner.current] looks like [owner.current.p_they()] just reverted to their old faith!", null, null, null, owner.current) - to_chat(owner.current, "An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.") - owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client) - owner.current.client.images -= cult_team.blood_target_image - . = ..() - -/datum/antagonist/cult/admin_add(datum/mind/new_owner,mob/admin) - give_equipment = FALSE - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has cult'ed [new_owner.current].") - log_admin("[key_name(admin)] has cult'ed [new_owner.current].") - -/datum/antagonist/cult/admin_remove(mob/user) - message_admins("[key_name_admin(user)] has decult'ed [owner.current].") - log_admin("[key_name(user)] has decult'ed [owner.current].") - SSticker.mode.remove_cultist(owner,silent=TRUE) //disgusting - -/datum/antagonist/cult/get_admin_commands() - . = ..() - .["Tome"] = CALLBACK(src,.proc/admin_give_tome) - .["Amulet"] = CALLBACK(src,.proc/admin_give_amulet) - -/datum/antagonist/cult/proc/admin_give_tome(mob/admin) - if(equip_cultist(owner.current,1)) - to_chat(admin, "Spawning tome failed!") - -/datum/antagonist/cult/proc/admin_give_amulet(mob/admin) - if (equip_cultist(owner.current)) - to_chat(admin, "Spawning amulet failed!") - -/datum/antagonist/cult/master - ignore_implant = TRUE - show_in_antagpanel = FALSE //Feel free to add this later - var/datum/action/innate/cult/master/finalreck/reckoning = new - var/datum/action/innate/cult/master/cultmark/bloodmark = new - var/datum/action/innate/cult/master/pulse/throwing = new - -/datum/antagonist/cult/master/Destroy() - QDEL_NULL(reckoning) - QDEL_NULL(bloodmark) - QDEL_NULL(throwing) - return ..() - -/datum/antagonist/cult/master/on_gain() - . = ..() - var/mob/living/current = owner.current - set_antag_hud(current, "cultmaster") - -/datum/antagonist/cult/master/greet() - to_chat(owner.current, "You are the cult's Master. As the cult's Master, you have a unique title and loud voice when communicating, are capable of marking \ - targets, such as a location or a noncultist, to direct the cult to them, and, finally, you are capable of summoning the entire living cult to your location once.") - to_chat(owner.current, "Use these abilities to direct the cult to victory at any cost.") - -/datum/antagonist/cult/master/apply_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override - if(!cult_team.reckoning_complete) - reckoning.Grant(current) - bloodmark.Grant(current) - throwing.Grant(current) - current.update_action_buttons_icon() - current.apply_status_effect(/datum/status_effect/cult_master) - -/datum/antagonist/cult/master/remove_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/current = owner.current - if(mob_override) - current = mob_override - reckoning.Remove(current) - bloodmark.Remove(current) - throwing.Remove(current) - current.update_action_buttons_icon() - current.remove_status_effect(/datum/status_effect/cult_master) - -/datum/team/cult - name = "Cult" - - var/blood_target - var/image/blood_target_image - var/blood_target_reset_timer - - var/cult_vote_called = FALSE - var/cult_mastered = FALSE - var/reckoning_complete = FALSE - - -/datum/team/cult/proc/setup_objectives() - //SAC OBJECTIVE , todo: move this to objective internals - var/list/target_candidates = list() - var/datum/objective/sacrifice/sac_objective = new - sac_objective.team = src - - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD) - target_candidates += player.mind - - if(target_candidates.len == 0) - message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.") - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD) - target_candidates += player.mind - listclearnulls(target_candidates) - if(LAZYLEN(target_candidates)) - sac_objective.target = pick(target_candidates) - sac_objective.update_explanation_text() - - var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role) - var/datum/preferences/sacface = sac_objective.target.current.client.prefs - var/icon/reshape = get_flat_human_icon(null, sacjob, sacface) - reshape.Shift(SOUTH, 4) - reshape.Shift(EAST, 1) - reshape.Crop(7,4,26,31) - reshape.Crop(-5,-3,26,30) - sac_objective.sac_image = reshape - - objectives += sac_objective - else - message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!") - - - //SUMMON OBJECTIVE - - var/datum/objective/eldergod/summon_objective = new() - summon_objective.team = src - objectives += summon_objective - -/datum/objective/sacrifice - var/sacced = FALSE - var/sac_image - -/datum/objective/sacrifice/check_completion() - return sacced || completed - -/datum/objective/sacrifice/update_explanation_text() - if(target) - explanation_text = "Sacrifice [target], the [target.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it." - else - explanation_text = "The veil has already been weakened here, proceed to the final objective." - -/datum/objective/eldergod - var/summoned = FALSE - var/list/summon_spots = list() - -/datum/objective/eldergod/New() - ..() - var/sanity = 0 - while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100) - var/area/summon = pick(GLOB.sortedAreas - summon_spots) - if(summon && is_station_level(summon.z) && summon.valid_territory) - summon_spots += summon - sanity++ - update_explanation_text() - -/datum/objective/eldergod/update_explanation_text() - explanation_text = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie'. The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." - -/datum/objective/eldergod/check_completion() - return summoned || completed - -/datum/team/cult/proc/check_cult_victory() - for(var/datum/objective/O in objectives) - if(!O.check_completion()) - return FALSE - return TRUE - -/datum/team/cult/roundend_report() - var/list/parts = list() - - if(check_cult_victory()) - parts += "The cult has succeeded! Nar-sie has snuffed out another torch in the void!" - else - parts += "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!" - - if(objectives.len) - parts += "The cultists' objectives were:" - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!" - else - parts += "Objective #[count]: [objective.explanation_text] Fail." - count++ - - if(members.len) - parts += "The cultists were:" - parts += printplayerlist(members) - - return "
[parts.Join("
")]
" - -/datum/team/cult/is_gamemode_hero() - return SSticker.mode.name == "cult" \ No newline at end of file diff --git a/code/datums/antagonists/datum_iaa.dm b/code/datums/antagonists/datum_iaa.dm deleted file mode 100644 index fd2c4e89a0..0000000000 --- a/code/datums/antagonists/datum_iaa.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/antagonist/iaa - -/datum/antagonist/iaa/apply_innate_effects() - .=..() //in case the base is used in future - if(owner&&owner.current) - give_pinpointer(owner.current) - -/datum/antagonist/iaa/remove_innate_effects() - .=..() - if(owner&&owner.current) - owner.current.remove_status_effect(/datum/status_effect/agent_pinpointer) \ No newline at end of file diff --git a/code/datums/antagonists/datum_traitor.dm b/code/datums/antagonists/datum_traitor.dm deleted file mode 100644 index da34debf95..0000000000 --- a/code/datums/antagonists/datum_traitor.dm +++ /dev/null @@ -1,352 +0,0 @@ -/datum/antagonist/traitor - name = "Traitor" - roundend_category = "traitors" - antagpanel_category = "Traitor" - job_rank = ROLE_TRAITOR - var/should_specialise = TRUE //do we split into AI and human, set to true on inital assignment only - var/ai_datum = /datum/antagonist/traitor/AI - var/human_datum = /datum/antagonist/traitor/human - var/special_role = ROLE_TRAITOR - var/employer = "The Syndicate" - var/give_objectives = TRUE - var/should_give_codewords = TRUE - - - -/datum/antagonist/traitor/human - show_in_antagpanel = FALSE - should_specialise = FALSE - var/should_equip = TRUE - - -/datum/antagonist/traitor/AI - show_in_antagpanel = FALSE - should_specialise = FALSE - -/datum/antagonist/traitor/specialization(datum/mind/new_owner) - if(should_specialise) - if(new_owner.current && isAI(new_owner.current)) - return new ai_datum() - else - return new human_datum() - else - return ..() - -/datum/antagonist/traitor/on_gain() - SSticker.mode.traitors += owner - owner.special_role = special_role - if(give_objectives) - forge_traitor_objectives() - finalize_traitor() - ..() - -/datum/antagonist/traitor/apply_innate_effects() - if(owner.assigned_role == "Clown") - var/mob/living/carbon/human/traitor_mob = owner.current - if(traitor_mob && istype(traitor_mob)) - if(!silent) - to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - traitor_mob.dna.remove_mutation(CLOWNMUT) - -/datum/antagonist/traitor/remove_innate_effects() - if(owner.assigned_role == "Clown") - var/mob/living/carbon/human/traitor_mob = owner.current - if(traitor_mob && istype(traitor_mob)) - traitor_mob.dna.add_mutation(CLOWNMUT) - -/datum/antagonist/traitor/on_removal() - SSticker.mode.traitors -= owner - for(var/O in objectives) - owner.objectives -= O - objectives = list() - if(!silent && owner.current) - to_chat(owner.current," You are no longer the [special_role]! ") - owner.special_role = null - ..() - -/datum/antagonist/traitor/AI/on_removal() - if(owner.current && isAI(owner.current)) - var/mob/living/silicon/ai/A = owner.current - A.set_zeroth_law("") - A.verbs -= /mob/living/silicon/ai/proc/choose_modules - A.malf_picker.remove_malf_verbs(A) - qdel(A.malf_picker) - ..() - -/datum/antagonist/traitor/proc/add_objective(var/datum/objective/O) - owner.objectives += O - objectives += O - -/datum/antagonist/traitor/proc/remove_objective(var/datum/objective/O) - owner.objectives -= O - objectives -= O - -/datum/antagonist/traitor/proc/forge_traitor_objectives() - return - -/datum/antagonist/traitor/human/forge_traitor_objectives() - var/is_hijacker = FALSE - if (GLOB.joined_player_list.len >= 30) // Less murderboning on lowpop thanks - is_hijacker = prob(10) - var/martyr_chance = prob(20) - var/objective_count = is_hijacker //Hijacking counts towards number of objectives - if(!SSticker.mode.exchange_blue && SSticker.mode.traitors.len >= 8) //Set up an exchange if there are enough traitors - if(!SSticker.mode.exchange_red) - SSticker.mode.exchange_red = owner - else - SSticker.mode.exchange_blue = owner - assign_exchange_role(SSticker.mode.exchange_red) - assign_exchange_role(SSticker.mode.exchange_blue) - objective_count += 1 //Exchange counts towards number of objectives - var/toa = CONFIG_GET(number/traitor_objectives_amount) - for(var/i = objective_count, i < toa, i++) - forge_single_objective() - - if(is_hijacker && objective_count <= toa) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount - if (!(locate(/datum/objective/hijack) in owner.objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = owner - add_objective(hijack_objective) - return - - - var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead. - for(var/datum/objective/O in owner.objectives) - if(!O.martyr_compatible) - martyr_compatibility = 0 - break - - if(martyr_compatibility && martyr_chance) - var/datum/objective/martyr/martyr_objective = new - martyr_objective.owner = owner - add_objective(martyr_objective) - return - - else - if(!(locate(/datum/objective/escape) in owner.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - add_objective(escape_objective) - return - -/datum/antagonist/traitor/AI/forge_traitor_objectives() - var/objective_count = 0 - - if(prob(30)) - objective_count += forge_single_objective() - - for(var/i = objective_count, i < CONFIG_GET(number/traitor_objectives_amount), i++) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - add_objective(kill_objective) - - var/datum/objective/survive/exist/exist_objective = new - exist_objective.owner = owner - add_objective(exist_objective) -/datum/antagonist/traitor/proc/forge_single_objective() - return 0 -/datum/antagonist/traitor/human/forge_single_objective() //Returns how many objectives are added - .=1 - if(prob(50)) - var/list/active_ais = active_ais() - if(active_ais.len && prob(100/GLOB.joined_player_list.len)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = owner - destroy_objective.find_target() - add_objective(destroy_objective) - else if(prob(30)) - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = owner - maroon_objective.find_target() - add_objective(maroon_objective) - else - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - add_objective(kill_objective) - else - if(prob(15) && !(locate(/datum/objective/download in owner.objectives))) - var/datum/objective/download/download_objective = new - download_objective.owner = owner - download_objective.gen_amount_goal() - add_objective(download_objective) - else - var/datum/objective/steal/steal_objective = new - steal_objective.owner = owner - steal_objective.find_target() - add_objective(steal_objective) - -/datum/antagonist/traitor/AI/forge_single_objective() - .=1 - var/special_pick = rand(1,4) - switch(special_pick) - if(1) - var/datum/objective/block/block_objective = new - block_objective.owner = owner - add_objective(block_objective) - if(2) - var/datum/objective/purge/purge_objective = new - purge_objective.owner = owner - add_objective(purge_objective) - if(3) - var/datum/objective/robot_army/robot_objective = new - robot_objective.owner = owner - add_objective(robot_objective) - if(4) //Protect and strand a target - var/datum/objective/protect/yandere_one = new - yandere_one.owner = owner - add_objective(yandere_one) - yandere_one.find_target() - var/datum/objective/maroon/yandere_two = new - yandere_two.owner = owner - yandere_two.target = yandere_one.target - yandere_two.update_explanation_text() // normally called in find_target() - add_objective(yandere_two) - .=2 - -/datum/antagonist/traitor/greet() - to_chat(owner.current, "You are the [owner.special_role].") - owner.announce_objectives() - if(should_give_codewords) - give_codewords() - -/datum/antagonist/traitor/proc/finalize_traitor() - SSticker.mode.update_traitor_icons_added(owner) - return - -/datum/antagonist/traitor/AI/finalize_traitor() - ..() - add_law_zero() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE) - owner.current.grant_language(/datum/language/codespeak) - -/datum/antagonist/traitor/human/finalize_traitor() - ..() - if(should_equip) - equip(silent) - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE) - -/datum/antagonist/traitor/proc/give_codewords() - if(!owner.current) - return - var/mob/traitor_mob=owner.current - - to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") - to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]") - to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]") - - antag_memory += "Code Phrase: [GLOB.syndicate_code_phrase]
" - antag_memory += "Code Response: [GLOB.syndicate_code_response]
" - - to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") - -/datum/antagonist/traitor/AI/proc/add_law_zero() - var/mob/living/silicon/ai/killer = owner.current - if(!killer || !istype(killer)) - return - var/law = "Accomplish your objectives at all costs." - var/law_borg = "Accomplish your AI's objectives at all costs." - killer.set_zeroth_law(law, law_borg) - killer.set_syndie_radio() - to_chat(killer, "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!") - killer.add_malf_picker() - -/datum/antagonist/traitor/proc/equip(var/silent = FALSE) - return - -/datum/antagonist/traitor/human/equip(var/silent = FALSE) - owner.equip_traitor(employer, silent, src) - -/datum/antagonist/traitor/human/proc/assign_exchange_role() - //set faction - var/faction = "red" - if(owner == SSticker.mode.exchange_blue) - faction = "blue" - - //Assign objectives - var/datum/objective/steal/exchange/exchange_objective = new - exchange_objective.set_faction(faction,((faction == "red") ? SSticker.mode.exchange_blue : SSticker.mode.exchange_red)) - exchange_objective.owner = owner - add_objective(exchange_objective) - - if(prob(20)) - var/datum/objective/steal/exchange/backstab/backstab_objective = new - backstab_objective.set_faction(faction) - backstab_objective.owner = owner - add_objective(backstab_objective) - - //Spawn and equip documents - var/mob/living/carbon/human/mob = owner.current - - var/obj/item/folder/syndicate/folder - if(owner == SSticker.mode.exchange_red) - folder = new/obj/item/folder/syndicate/red(mob.loc) - else - folder = new/obj/item/folder/syndicate/blue(mob.loc) - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store - ) - - var/where = "At your feet" - var/equipped_slot = mob.equip_in_one_of_slots(folder, slots) - if (equipped_slot) - where = "In your [equipped_slot]" - to_chat(mob, "

[where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
") - -//TODO Collate -/datum/antagonist/traitor/roundend_report() - var/list/result = list() - - var/traitorwin = TRUE - - result += printplayer(owner) - - var/TC_uses = 0 - var/uplink_true = FALSE - var/purchases = "" - var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[owner.key] - if(H) - TC_uses = H.total_spent - uplink_true = TRUE - purchases += H.generate_render(FALSE) - - var/objectives_text = "" - if(objectives.len)//If the traitor had no objectives, don't need to process this. - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objectives_text += "
Objective #[count]: [objective.explanation_text] Success!" - else - objectives_text += "
Objective #[count]: [objective.explanation_text] Fail." - traitorwin = FALSE - count++ - - if(uplink_true) - var/uplink_text = "(used [TC_uses] TC) [purchases]" - if(TC_uses==0 && traitorwin) - var/static/icon/badass = icon('icons/badass.dmi', "badass") - uplink_text += "[icon2html(badass, world)]" - result += uplink_text - - result += objectives_text - - var/special_role_text = lowertext(name) - - if(traitorwin) - result += "The [special_role_text] was successful!" - else - result += "The [special_role_text] has failed!" - SEND_SOUND(owner.current, 'sound/ambience/ambifailure.ogg') - - return result.Join("
") - -/datum/antagonist/traitor/roundend_report_footer() - return "
The code phrases were: [GLOB.syndicate_code_phrase]
\ - The code responses were: [GLOB.syndicate_code_response]
" - -/datum/antagonist/traitor/is_gamemode_hero() - return SSticker.mode.name == "traitor" \ No newline at end of file diff --git a/code/datums/antagonists/devil.dm b/code/datums/antagonists/devil.dm deleted file mode 100644 index 858b2d1ef1..0000000000 --- a/code/datums/antagonists/devil.dm +++ /dev/null @@ -1,582 +0,0 @@ -#define BLOOD_THRESHOLD 3 //How many souls are needed per stage. -#define TRUE_THRESHOLD 7 -#define ARCH_THRESHOLD 12 - -#define BASIC_DEVIL 0 -#define BLOOD_LIZARD 1 -#define TRUE_DEVIL 2 -#define ARCH_DEVIL 3 - -#define LOSS_PER_DEATH 2 - -#define SOULVALUE soulsOwned.len-reviveNumber - -#define DEVILRESURRECTTIME 600 - -GLOBAL_LIST_EMPTY(allDevils) -GLOBAL_LIST_INIT(lawlorify, list ( - LORE = list( - OBLIGATION_FOOD = "This devil seems to always offer its victims food before slaughtering them.", - OBLIGATION_FIDDLE = "This devil will never turn down a musical challenge.", - OBLIGATION_DANCEOFF = "This devil will never turn down a dance off.", - OBLIGATION_GREET = "This devil seems to only be able to converse with people it knows the name of.", - OBLIGATION_PRESENCEKNOWN = "This devil seems to be unable to attack from stealth.", - OBLIGATION_SAYNAME = "He will always chant his name upon killing someone.", - OBLIGATION_ANNOUNCEKILL = "This devil always loudly announces his kills for the world to hear.", - OBLIGATION_ANSWERTONAME = "This devil always responds to his truename.", - BANE_SILVER = "Silver seems to gravely injure this devil.", - BANE_SALT = "Throwing salt at this devil will hinder his ability to use infernal powers temporarily.", - BANE_LIGHT = "Bright flashes will disorient the devil, likely causing him to flee.", - BANE_IRON = "Cold iron will slowly injure him, until he can purge it from his system.", - BANE_WHITECLOTHES = "Wearing clean white clothing will help ward off this devil.", - BANE_HARVEST = "Presenting the labors of a harvest will disrupt the devil.", - BANE_TOOLBOX = "That which holds the means of creation also holds the means of the devil's undoing.", - BAN_HURTWOMAN = "This devil seems to prefer hunting men.", - BAN_CHAPEL = "This devil avoids holy ground.", - BAN_HURTPRIEST = "The annointed clergy appear to be immune to his powers.", - BAN_AVOIDWATER = "The devil seems to have some sort of aversion to water, though it does not appear to harm him.", - BAN_STRIKEUNCONSCIOUS = "This devil only shows interest in those who are awake.", - BAN_HURTLIZARD = "This devil will not strike a lizardman first.", - BAN_HURTANIMAL = "This devil avoids hurting animals.", - BANISH_WATER = "To banish the devil, you must infuse its body with holy water.", - BANISH_COFFIN = "This devil will return to life if its remains are not placed within a coffin.", - BANISH_FORMALDYHIDE = "To banish the devil, you must inject its lifeless body with embalming fluid.", - BANISH_RUNES = "This devil will resurrect after death, unless its remains are within a rune.", - BANISH_CANDLES = "A large number of nearby lit candles will prevent it from resurrecting.", - BANISH_DESTRUCTION = "Its corpse must be utterly destroyed to prevent resurrection.", - BANISH_FUNERAL_GARB = "If clad in funeral garments, this devil will be unable to resurrect. Should the clothes not fit, lay them gently on top of the devil's corpse." - ), - LAW = list( - OBLIGATION_FOOD = "When not acting in self defense, you must always offer your victim food before harming them.", - OBLIGATION_FIDDLE = "When not in immediate danger, if you are challenged to a musical duel, you must accept it. You are not obligated to duel the same person twice.", - OBLIGATION_DANCEOFF = "When not in immediate danger, if you are challenged to a dance off, you must accept it. You are not obligated to face off with the same person twice.", - OBLIGATION_GREET = "You must always greet other people by their last name before talking with them.", - OBLIGATION_PRESENCEKNOWN = "You must always make your presence known before attacking.", - OBLIGATION_SAYNAME = "You must always say your true name after you kill someone.", - OBLIGATION_ANNOUNCEKILL = "Upon killing someone, you must make your deed known to all within earshot, over comms if reasonably possible.", - OBLIGATION_ANSWERTONAME = "If you are not under attack, you must always respond to your true name.", - BAN_HURTWOMAN = "You must never harm a female outside of self defense.", - BAN_CHAPEL = "You must never attempt to enter the chapel.", - BAN_HURTPRIEST = "You must never attack a priest.", - BAN_AVOIDWATER = "You must never willingly touch a wet surface.", - BAN_STRIKEUNCONSCIOUS = "You must never strike an unconscious person.", - BAN_HURTLIZARD = "You must never harm a lizardman outside of self defense.", - BAN_HURTANIMAL = "You must never harm a non-sentient creature or robot outside of self defense.", - BANE_SILVER = "Silver, in all of its forms shall be your downfall.", - BANE_SALT = "Salt will disrupt your magical abilities.", - BANE_LIGHT = "Blinding lights will prevent you from using offensive powers for a time.", - BANE_IRON = "Cold wrought iron shall act as poison to you.", - BANE_WHITECLOTHES = "Those clad in pristine white garments will strike you true.", - BANE_HARVEST = "The fruits of the harvest shall be your downfall.", - BANE_TOOLBOX = "Toolboxes are bad news for you, for some reason.", - BANISH_WATER = "If your corpse is filled with holy water, you will be unable to resurrect.", - BANISH_COFFIN = "If your corpse is in a coffin, you will be unable to resurrect.", - BANISH_FORMALDYHIDE = "If your corpse is embalmed, you will be unable to resurrect.", - BANISH_RUNES = "If your corpse is placed within a rune, you will be unable to resurrect.", - BANISH_CANDLES = "If your corpse is near lit candles, you will be unable to resurrect.", - BANISH_DESTRUCTION = "If your corpse is destroyed, you will be unable to resurrect.", - BANISH_FUNERAL_GARB = "If your corpse is clad in funeral garments, you will be unable to resurrect." - ) - )) - -//These are also used in the codex gigas, so let's declare them globally. -GLOBAL_LIST_INIT(devil_pre_title, list("Dark ", "Hellish ", "Fallen ", "Fiery ", "Sinful ", "Blood ", "Fluffy ")) -GLOBAL_LIST_INIT(devil_title, list("Lord ", "Prelate ", "Count ", "Viscount ", "Vizier ", "Elder ", "Adept ")) -GLOBAL_LIST_INIT(devil_syllable, list("hal", "ve", "odr", "neit", "ci", "quon", "mya", "folth", "wren", "geyr", "hil", "niet", "twou", "phi", "coa")) -GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr.")) -/datum/antagonist/devil - name = "Devil" - roundend_category = "devils" - antagpanel_category = "Devil" - job_rank = ROLE_DEVIL - //Don't delete upon mind destruction, otherwise soul re-selling will break. - delete_on_mind_deletion = FALSE - var/obligation - var/ban - var/bane - var/banish - var/truename - var/list/datum/mind/soulsOwned = new - var/reviveNumber = 0 - var/form = BASIC_DEVIL - var/static/list/devil_spells = typecacheof(list( - /obj/effect/proc_holder/spell/aimed/fireball/hellish, - /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork, - /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater, - /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/ascended, - /obj/effect/proc_holder/spell/targeted/infernal_jaunt, - /obj/effect/proc_holder/spell/targeted/sintouch, - /obj/effect/proc_holder/spell/targeted/sintouch/ascended, - /obj/effect/proc_holder/spell/targeted/summon_contract, - /obj/effect/proc_holder/spell/targeted/conjure_item/violin, - /obj/effect/proc_holder/spell/targeted/summon_dancefloor)) - var/ascendable = FALSE - -/datum/antagonist/devil/can_be_owned(datum/mind/new_owner) - . = ..() - return . && (ishuman(new_owner.current) || iscyborg(new_owner.current)) - -/datum/antagonist/devil/get_admin_commands() - . = ..() - .["Toggle ascendable"] = CALLBACK(src,.proc/admin_toggle_ascendable) - - -/datum/antagonist/devil/proc/admin_toggle_ascendable(mob/admin) - ascendable = !ascendable - message_admins("[key_name_admin(admin)] set [owner.current] devil ascendable to [ascendable]") - log_admin("[key_name_admin(admin)] set [owner.current] devil ascendable to [ascendable])") - -/datum/antagonist/devil/admin_add(datum/mind/new_owner,mob/admin) - switch(alert(admin,"Should the devil be able to ascend",,"Yes","No","Cancel")) - if("Yes") - ascendable = TRUE - if("No") - ascendable = FALSE - else - return - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has devil'ed [new_owner.current]. [ascendable ? "(Ascendable)":""]") - log_admin("[key_name(admin)] has devil'ed [new_owner.current]. [ascendable ? "(Ascendable)":""]") - -/datum/antagonist/devil/antag_listing_name() - return ..() + "([truename])" - -/proc/devilInfo(name) - if(GLOB.allDevils[lowertext(name)]) - return GLOB.allDevils[lowertext(name)] - else - var/datum/fakeDevil/devil = new /datum/fakeDevil(name) - GLOB.allDevils[lowertext(name)] = devil - return devil - -/proc/randomDevilName() - var/name = "" - if(prob(65)) - if(prob(35)) - name = pick(GLOB.devil_pre_title) - name += pick(GLOB.devil_title) - var/probability = 100 - name += pick(GLOB.devil_syllable) - while(prob(probability)) - name += pick(GLOB.devil_syllable) - probability -= 20 - if(prob(40)) - name += pick(GLOB.devil_suffix) - return name - -/proc/randomdevilobligation() - return pick(OBLIGATION_FOOD, OBLIGATION_FIDDLE, OBLIGATION_DANCEOFF, OBLIGATION_GREET, OBLIGATION_PRESENCEKNOWN, OBLIGATION_SAYNAME, OBLIGATION_ANNOUNCEKILL, OBLIGATION_ANSWERTONAME) - -/proc/randomdevilban() - return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONSCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL) - -/proc/randomdevilbane() - return pick(BANE_SALT, BANE_LIGHT, BANE_IRON, BANE_WHITECLOTHES, BANE_SILVER, BANE_HARVEST, BANE_TOOLBOX) - -/proc/randomdevilbanish() - return pick(BANISH_WATER, BANISH_COFFIN, BANISH_FORMALDYHIDE, BANISH_RUNES, BANISH_CANDLES, BANISH_DESTRUCTION, BANISH_FUNERAL_GARB) - -/datum/antagonist/devil/proc/add_soul(datum/mind/soul) - if(soulsOwned.Find(soul)) - return - soulsOwned += soul - owner.current.nutrition = NUTRITION_LEVEL_FULL - to_chat(owner.current, "You feel satiated as you received a new soul.") - update_hud() - switch(SOULVALUE) - if(0) - to_chat(owner.current, "Your hellish powers have been restored.") - give_appropriate_spells() - if(BLOOD_THRESHOLD) - increase_blood_lizard() - if(TRUE_THRESHOLD) - increase_true_devil() - if(ARCH_THRESHOLD) - increase_arch_devil() - -/datum/antagonist/devil/proc/remove_soul(datum/mind/soul) - if(soulsOwned.Remove(soul)) - check_regression() - to_chat(owner.current, "You feel as though a soul has slipped from your grasp.") - update_hud() - -/datum/antagonist/devil/proc/check_regression() - if(form == ARCH_DEVIL) - return //arch devil can't regress - //Yes, fallthrough behavior is intended, so I can't use a switch statement. - if(form == TRUE_DEVIL && SOULVALUE < TRUE_THRESHOLD) - regress_blood_lizard() - if(form == BLOOD_LIZARD && SOULVALUE < BLOOD_THRESHOLD) - regress_humanoid() - if(SOULVALUE < 0) - give_appropriate_spells() - to_chat(owner.current, "As punishment for your failures, all of your powers except contract creation have been revoked.") - -/datum/antagonist/devil/proc/regress_humanoid() - to_chat(owner.current, "Your powers weaken, have more contracts be signed to regain power.") - if(ishuman(owner.current)) - var/mob/living/carbon/human/H = owner.current - H.set_species(/datum/species/human, 1) - H.regenerate_icons() - give_appropriate_spells() - if(istype(owner.current.loc, /obj/effect/dummy/slaughter/)) - owner.current.forceMove(get_turf(owner.current))//Fixes dying while jaunted leaving you permajaunted. - form = BASIC_DEVIL - -/datum/antagonist/devil/proc/regress_blood_lizard() - var/mob/living/carbon/true_devil/D = owner.current - to_chat(D, "Your powers weaken, have more contracts be signed to regain power.") - D.oldform.forceMove(D.drop_location()) - owner.transfer_to(D.oldform) - give_appropriate_spells() - qdel(D) - form = BLOOD_LIZARD - update_hud() - - -/datum/antagonist/devil/proc/increase_blood_lizard() - to_chat(owner.current, "You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard.") - sleep(50) - if(ishuman(owner.current)) - var/mob/living/carbon/human/H = owner.current - H.set_species(/datum/species/lizard, 1) - H.underwear = "Nude" - H.undershirt = "Nude" - H.socks = "Nude" - H.dna.features["mcolor"] = "511" //A deep red - H.regenerate_icons() - else //Did the devil get hit by a staff of transmutation? - owner.current.color = "#501010" - give_appropriate_spells() - form = BLOOD_LIZARD - - - -/datum/antagonist/devil/proc/increase_true_devil() - to_chat(owner.current, "You feel as though your current form is about to shed. You will soon turn into a true devil.") - sleep(50) - var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(owner.current.loc) - A.faction |= "hell" - owner.current.forceMove(A) - A.oldform = owner.current - owner.transfer_to(A) - A.set_name() - give_appropriate_spells() - form = TRUE_DEVIL - update_hud() - -/datum/antagonist/devil/proc/increase_arch_devil() - if(!ascendable) - return - var/mob/living/carbon/true_devil/D = owner.current - to_chat(D, "You feel as though your form is about to ascend.") - sleep(50) - if(!D) - return - D.visible_message("[D]'s skin begins to erupt with spikes.", \ - "Your flesh begins creating a shield around yourself.") - sleep(100) - if(!D) - return - D.visible_message("The horns on [D]'s head slowly grow and elongate.", \ - "Your body continues to mutate. Your telepathic abilities grow.") - sleep(90) - if(!D) - return - D.visible_message("[D]'s body begins to violently stretch and contort.", \ - "You begin to rend apart the final barriers to ultimate power.") - sleep(40) - if(!D) - return - to_chat(D, "Yes!") - sleep(10) - if(!D) - return - to_chat(D, "YES!!") - sleep(10) - if(!D) - return - to_chat(D, "YE--") - sleep(1) - if(!D) - return - to_chat(world, "\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"") - SEND_SOUND(world, sound('sound/hallucinations/veryfar_noise.ogg')) - give_appropriate_spells() - D.convert_to_archdevil() - if(istype(D.loc, /obj/effect/dummy/slaughter/)) - D.forceMove(get_turf(D))//Fixes dying while jaunted leaving you permajaunted. - var/area/A = get_area(owner.current) - if(A) - notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, action=NOTIFY_ATTACK) - sleep(50) - if(!SSticker.mode.devil_ascended) - SSshuttle.emergency.request(null, set_coefficient = 0.3) - SSticker.mode.devil_ascended++ - form = ARCH_DEVIL - -/datum/antagonist/devil/proc/remove_spells() - for(var/X in owner.spell_list) - var/obj/effect/proc_holder/spell/S = X - if(is_type_in_typecache(S, devil_spells)) - owner.RemoveSpell(S) - -/datum/antagonist/devil/proc/give_summon_contract() - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_contract(null)) - if(obligation == OBLIGATION_FIDDLE) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/violin(null)) - else if(obligation == OBLIGATION_DANCEOFF) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_dancefloor(null)) - -/datum/antagonist/devil/proc/give_appropriate_spells() - remove_spells() - give_summon_contract() - if(SOULVALUE >= ARCH_THRESHOLD && ascendable) - give_arch_spells() - else if(SOULVALUE >= TRUE_THRESHOLD) - give_true_spells() - else if(SOULVALUE >= BLOOD_THRESHOLD) - give_blood_spells() - else if(SOULVALUE >= 0) - give_base_spells() - -/datum/antagonist/devil/proc/give_base_spells() - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork(null)) - -/datum/antagonist/devil/proc/give_blood_spells() - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null)) - -/datum/antagonist/devil/proc/give_true_spells() - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch(null)) - -/datum/antagonist/devil/proc/give_arch_spells() - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/ascended(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch/ascended(null)) - -/datum/antagonist/devil/proc/beginResurrectionCheck(mob/living/body) - if(SOULVALUE>0) - to_chat(owner.current, "Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon. Remain in your body.") - sleep(DEVILRESURRECTTIME) - if (!body || body.stat == DEAD) - if(SOULVALUE>0) - if(check_banishment(body)) - to_chat(owner.current, "Unfortunately, the mortals have finished a ritual that prevents your resurrection.") - return -1 - else - to_chat(owner.current, "WE LIVE AGAIN!") - return hellish_resurrection(body) - else - to_chat(owner.current, "Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.") - return -1 - else - to_chat(owner.current, " You seem to have resurrected without your hellish powers.") - else - to_chat(owner.current, "Your hellish powers are too weak to resurrect yourself.") - -/datum/antagonist/devil/proc/check_banishment(mob/living/body) - switch(banish) - if(BANISH_WATER) - if(iscarbon(body)) - var/mob/living/carbon/H = body - return H.reagents.has_reagent("holy water") - return 0 - if(BANISH_COFFIN) - return (body && istype(body.loc, /obj/structure/closet/coffin)) - if(BANISH_FORMALDYHIDE) - if(iscarbon(body)) - var/mob/living/carbon/H = body - return H.reagents.has_reagent("formaldehyde") - return 0 - if(BANISH_RUNES) - if(body) - for(var/obj/effect/decal/cleanable/crayon/R in range(0,body)) - if (R.name == "rune") - return 1 - return 0 - if(BANISH_CANDLES) - if(body) - var/count = 0 - for(var/obj/item/candle/C in range(1,body)) - count += C.lit - if(count>=4) - return 1 - return 0 - if(BANISH_DESTRUCTION) - if(body) - return 0 - return 1 - if(BANISH_FUNERAL_GARB) - if(ishuman(body)) - var/mob/living/carbon/human/H = body - if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under/burial)) - return 1 - return 0 - else - for(var/obj/item/clothing/under/burial/B in range(0,body)) - if(B.loc == get_turf(B)) //Make sure it's not in someone's inventory or something. - return 1 - return 0 - -/datum/antagonist/devil/proc/hellish_resurrection(mob/living/body) - message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.") - if(SOULVALUE < ARCH_THRESHOLD || !ascendable) // once ascended, arch devils do not go down in power by any means. - reviveNumber += LOSS_PER_DEATH - update_hud() - if(body) - body.revive(TRUE, TRUE) //Adminrevive also recovers organs, preventing someone from resurrecting without a heart. - if(istype(body.loc, /obj/effect/dummy/slaughter/)) - body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted. - if(istype(body, /mob/living/carbon/true_devil)) - var/mob/living/carbon/true_devil/D = body - if(D.oldform) - D.oldform.revive(1,0) // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body. - if(body.stat == DEAD) - create_new_body() - else - create_new_body() - check_regression() - -/datum/antagonist/devil/proc/create_new_body() - if(GLOB.blobstart.len > 0) - var/turf/targetturf = get_turf(pick(GLOB.blobstart)) - var/mob/currentMob = owner.current - if(!currentMob) - currentMob = owner.get_ghost() - if(!currentMob) - message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.") - return -1 - if(currentMob.mind != owner) - message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.") - return -1 - currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1) - var/mob/living/carbon/human/H = owner.current - H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), slot_hands) - H.equip_to_slot_or_del(new /obj/item/pen(H), slot_l_store) - if(SOULVALUE >= BLOOD_THRESHOLD) - H.set_species(/datum/species/lizard, 1) - H.underwear = "Nude" - H.undershirt = "Nude" - H.socks = "Nude" - H.dna.features["mcolor"] = "511" - H.regenerate_icons() - if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough. - var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf) - A.faction |= "hell" - H.forceMove(A) - A.oldform = H - owner.transfer_to(A, TRUE) - A.set_name() - if(SOULVALUE >= ARCH_THRESHOLD && ascendable) - A.convert_to_archdevil() - else - throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection") - - -/datum/antagonist/devil/proc/update_hud() - if(iscarbon(owner.current)) - var/mob/living/C = owner.current - if(C.hud_used && C.hud_used.devilsouldisplay) - C.hud_used.devilsouldisplay.update_counter(SOULVALUE) - -/datum/antagonist/devil/greet() - to_chat(owner.current, "You remember your link to the infernal. You are [truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.") - to_chat(owner.current, "However, your infernal form is not without weaknesses.") - to_chat(owner.current, "You may not use violence to coerce someone into selling their soul.") - to_chat(owner.current, "You may not directly and knowingly physically harm a devil, other than yourself.") - to_chat(owner.current, GLOB.lawlorify[LAW][bane]) - to_chat(owner.current, GLOB.lawlorify[LAW][ban]) - to_chat(owner.current, GLOB.lawlorify[LAW][obligation]) - to_chat(owner.current, GLOB.lawlorify[LAW][banish]) - to_chat(owner.current, "Remember, the crew can research your weaknesses if they find out your devil name.
") - .=..() - -/datum/antagonist/devil/on_gain() - truename = randomDevilName() - ban = randomdevilban() - bane = randomdevilbane() - obligation = randomdevilobligation() - banish = randomdevilbanish() - GLOB.allDevils[lowertext(truename)] = src - - antag_memory += "Your devilic true name is [truename]
[GLOB.lawlorify[LAW][ban]]
You may not use violence to coerce someone into selling their soul.
You may not directly and knowingly physically harm a devil, other than yourself.
[GLOB.lawlorify[LAW][bane]]
[GLOB.lawlorify[LAW][obligation]]
[GLOB.lawlorify[LAW][banish]]
" - if(issilicon(owner.current)) - var/mob/living/silicon/robot_devil = owner.current - var/laws = list("You may not use violence to coerce someone into selling their soul.", "You may not directly and knowingly physically harm a devil, other than yourself.", GLOB.lawlorify[LAW][ban], GLOB.lawlorify[LAW][obligation], "Accomplish your objectives at all costs.") - robot_devil.set_law_sixsixsix(laws) - sleep(10) - if(owner.assigned_role == "Clown" && ishuman(owner.current)) - var/mob/living/carbon/human/S = owner.current - to_chat(S, "Your infernal nature has allowed you to overcome your clownishness.") - S.dna.remove_mutation(CLOWNMUT) - .=..() - -/datum/antagonist/devil/on_removal() - to_chat(owner.current, "Your infernal link has been severed! You are no longer a devil!") - .=..() - -/datum/antagonist/devil/apply_innate_effects(mob/living/mob_override) - give_appropriate_spells() - owner.current.grant_all_languages(TRUE) - update_hud() - .=..() - -/datum/antagonist/devil/remove_innate_effects(mob/living/mob_override) - for(var/X in owner.spell_list) - var/obj/effect/proc_holder/spell/S = X - if(is_type_in_typecache(S, devil_spells)) - owner.RemoveSpell(S) - .=..() - -/datum/antagonist/devil/proc/printdevilinfo() - var/list/parts = list() - parts += "The devil's true name is: [truename]" - parts += "The devil's bans were:" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]" - return parts.Join("
") - -/datum/antagonist/devil/roundend_report() - var/list/parts = list() - parts += printplayer(owner) - parts += printdevilinfo() - parts += printobjectives(owner) - return parts.Join("
") - -/datum/antagonist/devil/roundend_report_footer() - //sintouched go here for now as a hack , TODO proper antag datum for these - var/list/parts = list() - if(SSticker.mode.sintouched.len) - parts += "The sintouched were:" - var/list/sintouchedUnique = uniqueList(SSticker.mode.sintouched) - for(var/S in sintouchedUnique) - var/datum/mind/sintouched_mind = S - parts += printplayer(sintouched_mind) - parts += printobjectives(sintouched_mind) - return parts.Join("
") - -//A simple super light weight datum for the codex gigas. -/datum/fakeDevil - var/truename - var/bane - var/obligation - var/ban - var/banish - var/ascendable - -/datum/fakeDevil/New(name = randomDevilName()) - truename = name - bane = randomdevilbane() - obligation = randomdevilobligation() - ban = randomdevilban() - banish = randomdevilbanish() - ascendable = prob(25) diff --git a/code/datums/antagonists/internal_affairs.dm b/code/datums/antagonists/internal_affairs.dm deleted file mode 100644 index 9077b84dcd..0000000000 --- a/code/datums/antagonists/internal_affairs.dm +++ /dev/null @@ -1,302 +0,0 @@ -#define PINPOINTER_MINIMUM_RANGE 15 -#define PINPOINTER_EXTRA_RANDOM_RANGE 10 -#define PINPOINTER_PING_TIME 40 -#define PROB_ACTUAL_TRAITOR 20 -#define TRAITOR_AGENT_ROLE "Syndicate External Affairs Agent" - -/datum/antagonist/traitor/internal_affairs - name = "Internal Affairs Agent" - human_datum = /datum/antagonist/traitor/human/internal_affairs - ai_datum = /datum/antagonist/traitor/AI/internal_affairs - antagpanel_category = "IAA" - -/datum/antagonist/traitor/AI/internal_affairs - name = "Internal Affairs Agent" - employer = "Nanotrasen" - special_role = "internal affairs agent" - antagpanel_category = "IAA" - var/syndicate = FALSE - var/last_man_standing = FALSE - var/list/datum/mind/targets_stolen - - -/datum/antagonist/traitor/human/internal_affairs - name = "Internal Affairs Agent" - employer = "Nanotrasen" - special_role = "internal affairs agent" - antagpanel_category = "IAA" - var/syndicate = FALSE - var/last_man_standing = FALSE - var/list/datum/mind/targets_stolen - - -/datum/antagonist/traitor/human/internal_affairs/proc/give_pinpointer() - if(owner && owner.current) - owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer) - -/datum/antagonist/traitor/human/internal_affairs/apply_innate_effects() - .=..() //in case the base is used in future - if(owner && owner.current) - give_pinpointer(owner.current) - -/datum/antagonist/traitor/human/internal_affairs/remove_innate_effects() - .=..() - if(owner && owner.current) - owner.current.remove_status_effect(/datum/status_effect/agent_pinpointer) - -/datum/antagonist/traitor/human/internal_affairs/on_gain() - START_PROCESSING(SSprocessing, src) - .=..() -/datum/antagonist/traitor/human/internal_affairs/on_removal() - STOP_PROCESSING(SSprocessing,src) - .=..() -/datum/antagonist/traitor/human/internal_affairs/process() - iaa_process() - -/datum/antagonist/traitor/AI/internal_affairs/on_gain() - START_PROCESSING(SSprocessing, src) - .=..() -/datum/antagonist/traitor/AI/internal_affairs/on_removal() - STOP_PROCESSING(SSprocessing,src) - .=..() -/datum/antagonist/traitor/AI/internal_affairs/process() - iaa_process() - -/datum/status_effect/agent_pinpointer - id = "agent_pinpointer" - duration = -1 - tick_interval = PINPOINTER_PING_TIME - alert_type = /obj/screen/alert/status_effect/agent_pinpointer - var/minimum_range = PINPOINTER_MINIMUM_RANGE - var/mob/scan_target = null - -/obj/screen/alert/status_effect/agent_pinpointer - name = "Internal Affairs Integrated Pinpointer" - desc = "Even stealthier than a normal implant." - icon = 'icons/obj/device.dmi' - icon_state = "pinon" - -/datum/status_effect/agent_pinpointer/proc/point_to_target() //If we found what we're looking for, show the distance and direction - if(!scan_target) - linked_alert.icon_state = "pinonnull" - return - var/turf/here = get_turf(owner) - var/turf/there = get_turf(scan_target) - if(here.z != there.z) - linked_alert.icon_state = "pinonnull" - return - if(get_dist_euclidian(here,there)<=minimum_range + rand(0, PINPOINTER_EXTRA_RANDOM_RANGE)) - linked_alert.icon_state = "pinondirect" - else - linked_alert.setDir(get_dir(here, there)) - switch(get_dist(here, there)) - if(1 to 8) - linked_alert.icon_state = "pinonclose" - if(9 to 16) - linked_alert.icon_state = "pinonmedium" - if(16 to INFINITY) - linked_alert.icon_state = "pinonfar" - -/datum/status_effect/agent_pinpointer/proc/scan_for_target() - scan_target = null - if(owner) - if(owner.mind) - if(owner.mind.objectives) - for(var/datum/objective/objective_ in owner.mind.objectives) - if(!is_internal_objective(objective_)) - continue - var/datum/objective/assassinate/internal/objective = objective_ - var/mob/current = objective.target.current - if(current&¤t.stat!=DEAD) - scan_target = current - break - -/datum/status_effect/agent_pinpointer/tick() - if(!owner) - qdel(src) - return - scan_for_target() - point_to_target() - - -/proc/is_internal_objective(datum/objective/O) - return (istype(O, /datum/objective/assassinate/internal)||istype(O, /datum/objective/destroy/internal)) - -/datum/antagonist/traitor/proc/replace_escape_objective() - if(!owner||!owner.objectives) - return - for (var/objective_ in owner.objectives) - if(!(istype(objective_, /datum/objective/escape)||istype(objective_, /datum/objective/survive))) - continue - remove_objective(objective_) - - var/datum/objective/martyr/martyr_objective = new - martyr_objective.owner = owner - add_objective(martyr_objective) - -/datum/antagonist/traitor/proc/reinstate_escape_objective() - if(!owner||!owner.objectives) - return - for (var/objective_ in owner.objectives) - if(!istype(objective_, /datum/objective/martyr)) - continue - remove_objective(objective_) - -/datum/antagonist/traitor/human/internal_affairs/reinstate_escape_objective() - ..() - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - add_objective(escape_objective) - -/datum/antagonist/traitor/AI/internal_affairs/reinstate_escape_objective() - ..() - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - add_objective(survive_objective) - -/datum/antagonist/traitor/proc/steal_targets(datum/mind/victim) - var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA - - if(!owner.current||owner.current.stat==DEAD) - return - to_chat(owner.current, " Target eliminated: [victim.name]") - for(var/objective_ in victim.objectives) - if(istype(objective_, /datum/objective/assassinate/internal)) - var/datum/objective/assassinate/internal/objective = objective_ - if(objective.target==owner) - continue - else if(this.targets_stolen.Find(objective.target) == 0) - var/datum/objective/assassinate/internal/new_objective = new - new_objective.owner = owner - new_objective.target = objective.target - new_objective.update_explanation_text() - add_objective(new_objective) - this.targets_stolen += objective.target - var/status_text = objective.check_completion() ? "neutralised" : "active" - to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") - else if(istype(objective_, /datum/objective/destroy/internal)) - var/datum/objective/destroy/internal/objective = objective_ - var/datum/objective/destroy/internal/new_objective = new - if(objective.target==owner) - continue - else if(this.targets_stolen.Find(objective.target) == 0) - new_objective.owner = owner - new_objective.target = objective.target - new_objective.update_explanation_text() - add_objective(new_objective) - this.targets_stolen += objective.target - var/status_text = objective.check_completion() ? "neutralised" : "active" - to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") - this.last_man_standing = TRUE - for(var/objective_ in owner.objectives) - if(!is_internal_objective(objective_)) - continue - var/datum/objective/assassinate/internal/objective = objective_ - if(!objective.check_completion()) - this.last_man_standing = FALSE - return - if(this.last_man_standing) - if(this.syndicate) - to_chat(owner.current," All the loyalist agents are dead, and no more is required of you. Die a glorious death, agent. ") - else - to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.") - replace_escape_objective(owner) - -/datum/antagonist/traitor/proc/iaa_process() - var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA - if(owner&&owner.current&&owner.current.stat!=DEAD) - for(var/objective_ in owner.objectives) - if(!is_internal_objective(objective_)) - continue - var/datum/objective/assassinate/internal/objective = objective_ - if(!objective.target) - continue - if(objective.check_completion()) - if(objective.stolen) - continue - else - steal_targets(objective.target) - objective.stolen = TRUE - else - if(objective.stolen) - var/fail_msg = "Your sensors tell you that [objective.target.current.real_name], one of the targets you were meant to have killed, pulled one over on you, and is still alive - do the job properly this time! " - if(this.last_man_standing) - if(this.syndicate) - fail_msg += " You no longer have permission to die. " - else - fail_msg += " The truth could still slip out! Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated." - reinstate_escape_objective(owner) - this.last_man_standing = FALSE - to_chat(owner.current, fail_msg) - objective.stolen = FALSE - -/datum/antagonist/traitor/proc/forge_iaa_objectives() - var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA - if(SSticker.mode.target_list.len && SSticker.mode.target_list[owner]) // Is a double agent - - // Assassinate - var/datum/mind/target_mind = SSticker.mode.target_list[owner] - if(issilicon(target_mind.current)) - var/datum/objective/destroy/internal/destroy_objective = new - destroy_objective.owner = owner - destroy_objective.target = target_mind - destroy_objective.update_explanation_text() - else - var/datum/objective/assassinate/internal/kill_objective = new - kill_objective.owner = owner - kill_objective.target = target_mind - kill_objective.update_explanation_text() - add_objective(kill_objective) - - //Optional traitor objective - if(prob(PROB_ACTUAL_TRAITOR)) - employer = "The Syndicate" - owner.special_role = TRAITOR_AGENT_ROLE - special_role = TRAITOR_AGENT_ROLE - this.syndicate = TRUE - forge_single_objective() - - else - ..() // Give them standard objectives. - return - -/datum/antagonist/traitor/human/internal_affairs/forge_traitor_objectives() - forge_iaa_objectives() - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - add_objective(escape_objective) - -/datum/antagonist/traitor/AI/internal_affairs/forge_traitor_objectives() - forge_iaa_objectives() - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - add_objective(survive_objective) - -/datum/antagonist/traitor/proc/greet_iaa() - var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA - var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence") - - to_chat(owner.current, "You are the [special_role].") - if(this.syndicate) - to_chat(owner.current, "Your target has been framed for [crime], and you have been tasked with eliminating them to prevent them defending themselves in court.") - to_chat(owner.current, "Any damage you cause will be a further embarrassment to Nanotrasen, so you have no limits on collateral damage.") - to_chat(owner.current, " You have been provided with a standard uplink to accomplish your task. ") - else - to_chat(owner.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.") - to_chat(owner.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.") - to_chat(owner.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.") - - to_chat(owner.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") - owner.announce_objectives() - -/datum/antagonist/traitor/AI/internal_affairs/greet() - greet_iaa() - -/datum/antagonist/traitor/human/internal_affairs/greet() - greet_iaa() - - -#undef PROB_ACTUAL_TRAITOR -#undef PINPOINTER_EXTRA_RANDOM_RANGE -#undef PINPOINTER_MINIMUM_RANGE -#undef PINPOINTER_PING_TIME diff --git a/code/datums/antagonists/monkey.dm b/code/datums/antagonists/monkey.dm deleted file mode 100644 index 25e80f6afb..0000000000 --- a/code/datums/antagonists/monkey.dm +++ /dev/null @@ -1,214 +0,0 @@ -#define MONKEYS_ESCAPED 1 -#define MONKEYS_LIVED 2 -#define MONKEYS_DIED 3 -#define DISEASE_LIVED 4 - -/datum/antagonist/monkey - name = "Monkey" - job_rank = ROLE_MONKEY - roundend_category = "monkeys" - antagpanel_category = "Monkey" - var/datum/team/monkey/monkey_team - var/monkey_only = TRUE - -/datum/antagonist/monkey/can_be_owned(datum/mind/new_owner) - return ..() && (!monkey_only || ismonkey(new_owner.current)) - -/datum/antagonist/monkey/get_team() - return monkey_team - -/datum/antagonist/monkey/on_gain() - . = ..() - SSticker.mode.ape_infectees += owner - owner.special_role = "Infected Monkey" - - var/datum/disease/D = new /datum/disease/transformation/jungle_fever/monkeymode - if(!owner.current.HasDisease(D)) - owner.current.ForceContractDisease(D) - else - QDEL_NULL(D) - -/datum/antagonist/monkey/greet() - to_chat(owner, "You are a monkey now!") - to_chat(owner, "Bite humans to infect them, follow the orders of the monkey leaders, and help fellow monkeys!") - to_chat(owner, "Ensure at least one infected monkey escapes on the Emergency Shuttle!") - to_chat(owner, "As an intelligent monkey, you know how to use technology and how to ventcrawl while wearing things.") - to_chat(owner, "You can use :k to talk to fellow monkeys!") - SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) - -/datum/antagonist/monkey/on_removal() - owner.special_role = null - SSticker.mode.ape_infectees -= owner - - var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.viruses - if(D) - D.remove_virus() - qdel(D) - - . = ..() - -/datum/antagonist/monkey/create_team(datum/team/monkey/new_team) - if(!new_team) - for(var/datum/antagonist/monkey/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.monkey_team) - monkey_team = H.monkey_team - return - monkey_team = new /datum/team/monkey - monkey_team.update_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - monkey_team = new_team - -/datum/antagonist/monkey/proc/forge_objectives() - objectives |= monkey_team.objectives - owner.objectives |= objectives - -/datum/antagonist/monkey/admin_remove(mob/admin) - var/mob/living/carbon/monkey/M = owner.current - if(istype(M)) - switch(alert(admin, "Humanize?", "Humanize", "Yes", "No")) - if("Yes") - if(admin == M) - admin = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) - else - M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) - if("No") - //nothing - else - return - . = ..() - -/datum/antagonist/monkey/leader - name = "Monkey Leader" - monkey_only = FALSE - -/datum/antagonist/monkey/leader/admin_add(datum/mind/new_owner,mob/admin) - var/mob/living/carbon/human/H = new_owner.current - if(istype(H)) - switch(alert(admin, "Monkeyize?", "Monkeyize", "Yes", "No")) - if("Yes") - if(admin == H) - admin = H.monkeyize() - else - H.monkeyize() - if("No") - //nothing - else - return - new_owner.add_antag_datum(src) - log_admin("[key_name(admin)] made [key_name(new_owner.current)] a monkey leader!") - message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner.current)] a monkey leader!") - -/datum/antagonist/monkey/leader/on_gain() - . = ..() - var/obj/item/organ/heart/freedom/F = new - F.Insert(owner.current, drop_if_replaced = FALSE) - SSticker.mode.ape_leaders += owner - owner.special_role = "Monkey Leader" - -/datum/antagonist/monkey/leader/on_removal() - SSticker.mode.ape_leaders -= owner - var/obj/item/organ/heart/H = new - H.Insert(owner.current, drop_if_replaced = FALSE) //replace freedom heart with normal heart - - . = ..() - -/datum/antagonist/monkey/leader/greet() - to_chat(owner, "You are the Jungle Fever patient zero!!") - to_chat(owner, "You have been planted onto this station by the Animal Rights Consortium.") - to_chat(owner, "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.") - to_chat(owner, "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.") - to_chat(owner, "Your mission will be deemed a success if any of the live infected monkeys reach CentCom.") - to_chat(owner, "As an initial infectee, you will be considered a 'leader' by your fellow monkeys.") - to_chat(owner, "You can use :k to talk to fellow monkeys!") - SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) - -/datum/objective/monkey - explanation_text = "Ensure that infected monkeys escape on the emergency shuttle!" - martyr_compatible = TRUE - var/monkeys_to_win = 1 - var/escaped_monkeys = 0 - -/datum/objective/monkey/check_completion() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if (M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - escaped_monkeys++ - if(escaped_monkeys >= monkeys_to_win) - return TRUE - return FALSE - -/datum/team/monkey - name = "Monkeys" - -/datum/team/monkey/proc/update_objectives() - objectives = list() - var/datum/objective/monkey/O = new() - O.team = src - objectives += O - -/datum/team/monkey/proc/infected_monkeys_alive() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if(M.HasDisease(D)) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_monkeys_escaped() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_humans_escaped() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/human/M in GLOB.alive_mob_list) - if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_humans_alive() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/human/M in GLOB.alive_mob_list) - if(M.HasDisease(D)) - return TRUE - return FALSE - -/datum/team/monkey/proc/get_result() - if(infected_monkeys_escaped()) - return MONKEYS_ESCAPED - if(infected_monkeys_alive()) - return MONKEYS_LIVED - if(infected_humans_alive() || infected_humans_escaped()) - return DISEASE_LIVED - return MONKEYS_DIED - -/datum/team/monkey/roundend_report() - var/list/parts = list() - switch(get_result()) - if(MONKEYS_ESCAPED) - parts += "Monkey Major Victory!" - parts += "Central Command and [station_name()] were taken over by the monkeys! Ook ook!" - if(MONKEYS_LIVED) - parts += "Monkey Minor Victory!" - parts += "[station_name()] was taken over by the monkeys! Ook ook!" - if(DISEASE_LIVED) - parts += "Monkey Minor Defeat!" - parts += "All the monkeys died, but the disease lives on! The future is uncertain." - if(MONKEYS_DIED) - parts += "Monkey Major Defeat!" - parts += "All the monkeys died, and Jungle Fever was wiped out!" - var/list/leaders = get_antagonists(/datum/antagonist/monkey/leader, TRUE) - var/list/monkeys = get_antagonists(/datum/antagonist/monkey, TRUE) - - if(LAZYLEN(leaders)) - parts += "The monkey leaders were:" - parts += printplayerlist(SSticker.mode.ape_leaders) - if(LAZYLEN(monkeys)) - parts += "The monkeys were:" - parts += printplayerlist(SSticker.mode.ape_infectees) - return "
[parts.Join("
")]
" diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm deleted file mode 100644 index e8a1c140ea..0000000000 --- a/code/datums/antagonists/ninja.dm +++ /dev/null @@ -1,155 +0,0 @@ -/datum/antagonist/ninja - name = "Ninja" - antagpanel_category = "Ninja" - job_rank = ROLE_NINJA - var/helping_station = FALSE - var/give_objectives = TRUE - var/give_equipment = TRUE - - -/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_ninja_icons_added(M) - -/datum/antagonist/ninja/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_ninja_icons_removed(M) - -/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current) - return H.equipOutfit(/datum/outfit/ninja) - -/datum/antagonist/ninja/proc/addMemories() - antag_memory += "I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!
" - antag_memory += "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!
" - antag_memory += "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.
" - -/datum/antagonist/ninja/proc/addObjectives(quantity = 6) - var/list/possible_targets = list() - for(var/datum/mind/M in SSticker.minds) - if(M.current && M.current.stat != DEAD) - if(ishuman(M.current)) - if(M.special_role) - possible_targets[M] = 0 //bad-guy - else if(M.assigned_role in GLOB.command_positions) - possible_targets[M] = 1 //good-guy - - var/list/possible_objectives = list(1,2,3,4) - - while(objectives.len < quantity) - switch(pick_n_take(possible_objectives)) - if(1) //research - var/datum/objective/download/O = new /datum/objective/download() - O.owner = owner - O.gen_amount_goal() - objectives += O - - if(2) //steal - var/datum/objective/steal/special/O = new /datum/objective/steal/special() - O.owner = owner - objectives += O - - if(3) //protect/kill - if(!possible_targets.len) continue - var/index = rand(1,possible_targets.len) - var/datum/mind/M = possible_targets[index] - var/is_bad_guy = possible_targets[M] - possible_targets.Cut(index,index+1) - - if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy) - var/datum/objective/assassinate/O = new /datum/objective/assassinate() - O.owner = owner - O.target = M - O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]." - objectives += O - else //protect - var/datum/objective/protect/O = new /datum/objective/protect() - O.owner = owner - O.target = M - O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm." - objectives += O - if(4) //debrain/capture - if(!possible_targets.len) continue - var/selected = rand(1,possible_targets.len) - var/datum/mind/M = possible_targets[selected] - var/is_bad_guy = possible_targets[M] - possible_targets.Cut(selected,selected+1) - - if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy) - var/datum/objective/debrain/O = new /datum/objective/debrain() - O.owner = owner - O.target = M - O.explanation_text = "Steal the brain of [M.current.real_name]." - objectives += O - else //capture - var/datum/objective/capture/O = new /datum/objective/capture() - O.owner = owner - O.gen_amount_goal() - objectives += O - else - break - var/datum/objective/O = new /datum/objective/survive() - O.owner = owner - owner.objectives |= objectives - - -/proc/remove_ninja(mob/living/L) - if(!L || !L.mind) - return FALSE - var/datum/antagonist/datum = L.mind.has_antag_datum(/datum/antagonist/ninja) - datum.on_removal() - return TRUE - -/proc/is_ninja(mob/living/M) - return M && M.mind && M.mind.has_antag_datum(/datum/antagonist/ninja) - - -/datum/antagonist/ninja/greet() - SEND_SOUND(owner.current, sound('sound/effects/ninja_greeting.ogg')) - to_chat(owner.current, "I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!") - to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!") - to_chat(owner.current, "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.") - return - -/datum/antagonist/ninja/on_gain() - if(give_objectives) - addObjectives() - addMemories() - if(give_equipment) - equip_space_ninja(owner.current) - . = ..() - -/datum/antagonist/ninja/admin_add(datum/mind/new_owner,mob/admin) - var/adj - switch(input("What kind of ninja?", "Ninja") as null|anything in list("Random","Syndicate","Nanotrasen","No objectives")) - if("Random") - helping_station = pick(TRUE,FALSE) - adj = "" - if("Syndicate") - helping_station = FALSE - adj = "syndie" - if("Nanotrasen") - helping_station = TRUE - adj = "friendly" - if("No objectives") - give_objectives = FALSE - adj = "objectiveless" - else - return - new_owner.assigned_role = ROLE_NINJA - new_owner.special_role = ROLE_NINJA - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has [adj] ninja'ed [new_owner.current].") - log_admin("[key_name(admin)] has [adj] ninja'ed [new_owner.current].") - -/datum/antagonist/ninja/antag_listing_name() - return ..() + "(Ninja)" - -/datum/antagonist/ninja/proc/update_ninja_icons_added(var/mob/living/carbon/human/ninja) - var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA] - ninjahud.join_hud(ninja) - set_antag_hud(ninja, "ninja") - -/datum/antagonist/ninja/proc/update_ninja_icons_removed(var/mob/living/carbon/human/ninja) - var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA] - ninjahud.leave_hud(ninja) - set_antag_hud(ninja, null) \ No newline at end of file diff --git a/code/datums/antagonists/nukeop.dm b/code/datums/antagonists/nukeop.dm deleted file mode 100644 index 1ec2e77f64..0000000000 --- a/code/datums/antagonists/nukeop.dm +++ /dev/null @@ -1,379 +0,0 @@ -#define NUKE_RESULT_FLUKE 0 -#define NUKE_RESULT_NUKE_WIN 1 -#define NUKE_RESULT_CREW_WIN 2 -#define NUKE_RESULT_CREW_WIN_SYNDIES_DEAD 3 -#define NUKE_RESULT_DISK_LOST 4 -#define NUKE_RESULT_DISK_STOLEN 5 -#define NUKE_RESULT_NOSURVIVORS 6 -#define NUKE_RESULT_WRONG_STATION 7 -#define NUKE_RESULT_WRONG_STATION_DEAD 8 - -/datum/antagonist/nukeop - name = "Nuclear Operative" - roundend_category = "syndicate operatives" //just in case - antagpanel_category = "NukeOp" - job_rank = ROLE_OPERATIVE - var/datum/team/nuclear/nuke_team - var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. - var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. - var/nukeop_outfit = /datum/outfit/syndicate - -/datum/antagonist/nukeop/proc/update_synd_icons_added(mob/living/M) - var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] - opshud.join_hud(M) - set_antag_hud(M, "synd") - -/datum/antagonist/nukeop/proc/update_synd_icons_removed(mob/living/M) - var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] - opshud.leave_hud(M) - set_antag_hud(M, null) - -/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_synd_icons_added(M) - -/datum/antagonist/nukeop/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_synd_icons_removed(M) - -/datum/antagonist/nukeop/proc/equip_op() - if(!ishuman(owner.current)) - return - var/mob/living/carbon/human/H = owner.current - - H.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs - - H.equipOutfit(nukeop_outfit) - return TRUE - -/datum/antagonist/nukeop/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) - to_chat(owner, "You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!") - owner.announce_objectives() - return - -/datum/antagonist/nukeop/on_gain() - give_alias() - forge_objectives() - . = ..() - equip_op() - memorize_code() - if(send_to_spawnpoint) - move_to_spawnpoint() - -/datum/antagonist/nukeop/get_team() - return nuke_team - -/datum/antagonist/nukeop/proc/assign_nuke() - if(nuke_team && !nuke_team.tracked_nuke) - nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/syndicate/nuke = locate() in GLOB.nuke_list - if(nuke) - nuke_team.tracked_nuke = nuke - if(nuke.r_code == "ADMIN") - nuke.r_code = nuke_team.memorized_code - else //Already set by admins/something else? - nuke_team.memorized_code = nuke.r_code - else - stack_trace("Syndicate nuke not found during nuke team creation.") - nuke_team.memorized_code = null - -/datum/antagonist/nukeop/proc/give_alias() - if(nuke_team && nuke_team.syndicate_name) - var/number = 1 - number = nuke_team.members.Find(owner) - owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" - -/datum/antagonist/nukeop/proc/memorize_code() - if(nuke_team && nuke_team.tracked_nuke && nuke_team.memorized_code) - antag_memory += "[nuke_team.tracked_nuke] Code: [nuke_team.memorized_code]
" - to_chat(owner, "The nuclear authorization code is: [nuke_team.memorized_code]") - else - to_chat(owner, "Unfortunately the syndicate was unable to provide you with nuclear authorization code.") - -/datum/antagonist/nukeop/proc/forge_objectives() - if(nuke_team) - owner.objectives |= nuke_team.objectives - -/datum/antagonist/nukeop/proc/move_to_spawnpoint() - var/team_number = 1 - if(nuke_team) - team_number = nuke_team.members.Find(owner) - owner.current.forceMove(GLOB.nukeop_start[((team_number - 1) % GLOB.nukeop_start.len) + 1]) - -/datum/antagonist/nukeop/leader/move_to_spawnpoint() - owner.current.forceMove(pick(GLOB.nukeop_leader_start)) - -/datum/antagonist/nukeop/create_team(datum/team/nuclear/new_team) - if(!new_team) - if(!always_new_team) - for(var/datum/antagonist/nukeop/N in GLOB.antagonists) - if(!N.owner) - continue - if(N.nuke_team) - nuke_team = N.nuke_team - return - nuke_team = new /datum/team/nuclear - nuke_team.update_objectives() - assign_nuke() //This is bit ugly - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - nuke_team = new_team - -/datum/antagonist/nukeop/admin_add(datum/mind/new_owner,mob/admin) - new_owner.assigned_role = ROLE_SYNDICATE - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has nuke op'ed [new_owner.current].") - log_admin("[key_name(admin)] has nuke op'ed [new_owner.current].") - -/datum/antagonist/nukeop/get_admin_commands() - . = ..() - .["Send to base"] = CALLBACK(src,.proc/admin_send_to_base) - .["Tell code"] = CALLBACK(src,.proc/admin_tell_code) - -/datum/antagonist/nukeop/proc/admin_send_to_base(mob/admin) - owner.current.forceMove(pick(GLOB.nukeop_start)) - -/datum/antagonist/nukeop/proc/admin_tell_code(mob/admin) - var/code - for (var/obj/machinery/nuclearbomb/bombue in GLOB.machines) - if (length(bombue.r_code) <= 5 && bombue.r_code != initial(bombue.r_code)) - code = bombue.r_code - break - if (code) - antag_memory += "Syndicate Nuclear Bomb Code: [code]
" - to_chat(owner.current, "The nuclear authorization code is: [code]") - else - to_chat(admin, "No valid nuke found!") - -/datum/antagonist/nukeop/leader - name = "Nuclear Operative Leader" - nukeop_outfit = /datum/outfit/syndicate/leader - always_new_team = TRUE - var/title - -/datum/antagonist/nukeop/leader/memorize_code() - ..() - if(nuke_team && nuke_team.memorized_code) - var/obj/item/paper/P = new - P.info = "The nuclear authorization code is: [nuke_team.memorized_code]" - P.name = "nuclear bomb code" - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - P.forceMove(get_turf(H)) - else - H.put_in_hands(P, TRUE) - H.update_icons() - -/datum/antagonist/nukeop/leader/give_alias() - title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") - if(nuke_team && nuke_team.syndicate_name) - owner.current.real_name = "[nuke_team.syndicate_name] [title]" - else - owner.current.real_name = "Syndicate [title]" - -/datum/antagonist/nukeop/leader/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) - to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") - to_chat(owner, "If you feel you are not up to this task, give your ID to another operative.") - to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") - owner.announce_objectives() - addtimer(CALLBACK(src, .proc/nuketeam_name_assign), 1) - - -/datum/antagonist/nukeop/leader/proc/nuketeam_name_assign() - if(!nuke_team) - return - nuke_team.rename_team(ask_name()) - -/datum/team/nuclear/proc/rename_team(new_name) - syndicate_name = new_name - name = "[syndicate_name] Team" - for(var/I in members) - var/datum/mind/synd_mind = I - var/mob/living/carbon/human/H = synd_mind.current - if(!istype(H)) - continue - var/chosen_name = H.dna.species.random_name(H.gender,0,syndicate_name) - H.fully_replace_character_name(H.real_name,chosen_name) - -/datum/antagonist/nukeop/leader/proc/ask_name() - var/randomname = pick(GLOB.last_names) - var/newname = stripped_input(owner.current,"You are the nuke operative [title]. Please choose a last name for your family.", "Name change",randomname) - if (!newname) - newname = randomname - else - newname = reject_bad_name(newname) - if(!newname) - newname = randomname - - return capitalize(newname) - -/datum/antagonist/nukeop/lone - name = "Lone Operative" - always_new_team = TRUE - send_to_spawnpoint = FALSE //Handled by event - nukeop_outfit = /datum/outfit/syndicate/full - -/datum/antagonist/nukeop/lone/assign_nuke() - if(nuke_team && !nuke_team.tracked_nuke) - nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list - if(nuke) - nuke_team.tracked_nuke = nuke - if(nuke.r_code == "ADMIN") - nuke.r_code = nuke_team.memorized_code - else //Already set by admins/something else? - nuke_team.memorized_code = nuke.r_code - else - stack_trace("Station self destruct ot found during lone op team creation.") - nuke_team.memorized_code = null - -/datum/antagonist/nukeop/reinforcement - send_to_spawnpoint = FALSE - nukeop_outfit = /datum/outfit/syndicate/no_crystals - -/datum/team/nuclear - var/syndicate_name - var/obj/machinery/nuclearbomb/tracked_nuke - var/core_objective = /datum/objective/nuclear - var/memorized_code - -/datum/team/nuclear/New() - ..() - syndicate_name = syndicate_name() - -/datum/team/nuclear/proc/update_objectives() - if(core_objective) - var/datum/objective/O = new core_objective - O.team = src - objectives += O - -/datum/team/nuclear/proc/disk_rescued() - for(var/obj/item/disk/nuclear/D in GLOB.poi_list) - if(!D.onCentCom()) - return FALSE - return TRUE - -/datum/team/nuclear/proc/operatives_dead() - for(var/I in members) - var/datum/mind/operative_mind = I - if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) - return FALSE - return TRUE - -/datum/team/nuclear/proc/syndies_escaped() - var/obj/docking_port/mobile/S = SSshuttle.getShuttle("syndicate") - return S && (is_centcom_level(S.z) || is_transit_level(S.z)) - -/datum/team/nuclear/proc/get_result() - var/evacuation = SSshuttle.emergency.mode == SHUTTLE_ENDGAME - var/disk_rescued = disk_rescued() - var/syndies_didnt_escape = !syndies_escaped() - var/station_was_nuked = SSticker.mode.station_was_nuked - var/nuke_off_station = SSticker.mode.nuke_off_station - - if(nuke_off_station == NUKE_SYNDICATE_BASE) - return NUKE_RESULT_FLUKE - else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) - return NUKE_RESULT_NUKE_WIN - else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) - return NUKE_RESULT_NOSURVIVORS - else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) - return NUKE_RESULT_WRONG_STATION - else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) - return NUKE_RESULT_WRONG_STATION_DEAD - else if ((disk_rescued || evacuation) && operatives_dead()) - return NUKE_RESULT_CREW_WIN_SYNDIES_DEAD - else if (disk_rescued) - return NUKE_RESULT_CREW_WIN - else if (!disk_rescued && operatives_dead()) - return NUKE_RESULT_DISK_LOST - else if (!disk_rescued && evacuation) - return NUKE_RESULT_DISK_STOLEN - else - return //Undefined result - -/datum/team/nuclear/roundend_report() - var/list/parts = list() - parts += "[syndicate_name] Operatives:" - - switch(get_result()) - if(NUKE_RESULT_FLUKE) - parts += "Humiliating Syndicate Defeat" - parts += "The crew of [station_name()] gave [syndicate_name] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!" - if(NUKE_RESULT_NUKE_WIN) - parts += "Syndicate Major Victory!" - parts += "[syndicate_name] operatives have destroyed [station_name()]!" - if(NUKE_RESULT_NOSURVIVORS) - parts += "Total Annihilation" - parts += "[syndicate_name] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!" - if(NUKE_RESULT_WRONG_STATION) - parts += "Crew Minor Victory" - parts += "[syndicate_name] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!" - if(NUKE_RESULT_WRONG_STATION_DEAD) - parts += "[syndicate_name] operatives have earned Darwin Award!" - parts += "[syndicate_name] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!" - if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) - parts += "Crew Major Victory!" - parts += "The Research Staff has saved the disk and killed the [syndicate_name] Operatives" - if(NUKE_RESULT_CREW_WIN) - parts += "Crew Major Victory" - parts += "The Research Staff has saved the disk and stopped the [syndicate_name] Operatives!" - if(NUKE_RESULT_DISK_LOST) - parts += "Neutral Victory!" - parts += "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name] Operatives!" - if(NUKE_RESULT_DISK_STOLEN) - parts += "Syndicate Minor Victory!" - parts += "[syndicate_name] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!" - else - parts += "Neutral Victory" - parts += "Mission aborted!" - - var/text = "
The syndicate operatives were:" - var/purchases = "" - var/TC_uses = 0 - for(var/I in members) - var/datum/mind/syndicate = I - var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[syndicate.key] - if(H) - TC_uses += H.total_spent - purchases += H.generate_render(show_key = FALSE) - text += printplayerlist(members) - text += "
" - text += "(Syndicates used [TC_uses] TC) [purchases]" - if(TC_uses == 0 && SSticker.mode.station_was_nuked && !operatives_dead()) - text += "[icon2html('icons/badass.dmi', world, "badass")]" - - parts += text - - return "
[parts.Join("
")]
" - -/datum/team/nuclear/antag_listing_name() - if(syndicate_name) - return "[syndicate_name] Syndicates" - else - return "Syndicates" - -/datum/team/nuclear/antag_listing_entry() - var/disk_report = "Nuclear Disk(s)
" - disk_report += "" - for(var/obj/item/disk/nuclear/N in GLOB.poi_list) - disk_report += "" - disk_report += "
[N.name], " - var/atom/disk_loc = N.loc - while(!isturf(disk_loc)) - if(ismob(disk_loc)) - var/mob/M = disk_loc - disk_report += "carried by [M.real_name] " - if(isobj(disk_loc)) - var/obj/O = disk_loc - disk_report += "in \a [O.name] " - disk_loc = disk_loc.loc - disk_report += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])FLW
" - var/common_part = ..() - return common_part + disk_report - -/datum/team/nuclear/is_gamemode_hero() - return SSticker.mode.name == "nuclear emergency" \ No newline at end of file diff --git a/code/datums/antagonists/pirate.dm b/code/datums/antagonists/pirate.dm deleted file mode 100644 index cdd871ff35..0000000000 --- a/code/datums/antagonists/pirate.dm +++ /dev/null @@ -1,132 +0,0 @@ -/datum/antagonist/pirate - name = "Space Pirate" - job_rank = ROLE_TRAITOR - roundend_category = "space pirates" - antagpanel_category = "Pirate" - var/datum/team/pirate/crew - -/datum/antagonist/pirate/greet() - to_chat(owner, "You are a Space Pirate!") - to_chat(owner, "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot.") - owner.announce_objectives() - -/datum/antagonist/pirate/get_team() - return crew - -/datum/antagonist/pirate/create_team(datum/team/pirate/new_team) - if(!new_team) - for(var/datum/antagonist/pirate/P in GLOB.antagonists) - if(!P.owner) - continue - if(P.crew) - crew = P.crew - return - if(!new_team) - crew = new /datum/team/pirate - crew.forge_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - crew = new_team - -/datum/antagonist/pirate/on_gain() - if(crew) - owner.objectives |= crew.objectives - . = ..() - -/datum/antagonist/pirate/on_removal() - if(crew) - owner.objectives -= crew.objectives - . = ..() - -/datum/team/pirate - name = "Pirate crew" - -/datum/team/pirate/proc/forge_objectives() - var/datum/objective/loot/getbooty = new() - getbooty.team = src - getbooty.storage_area = locate(/area/shuttle/pirate/vault) in GLOB.sortedAreas - getbooty.update_initial_value() - getbooty.update_explanation_text() - objectives += getbooty - for(var/datum/mind/M in members) - M.objectives |= objectives - - -GLOBAL_LIST_INIT(pirate_loot_cache, typecacheof(list( - /obj/structure/reagent_dispensers/beerkeg, - /mob/living/simple_animal/parrot, - /obj/item/stack/sheet/mineral/gold, - /obj/item/stack/sheet/mineral/diamond, - /obj/item/stack/spacecash, - /obj/item/melee/sabre,))) - -/datum/objective/loot - var/area/storage_area //Place where we we will look for the loot. - explanation_text = "Acquire valuable loot and store it in designated area." - var/target_value = 50000 - var/initial_value = 0 //Things in the vault at spawn time do not count - -/datum/objective/loot/update_explanation_text() - if(storage_area) - explanation_text = "Acquire loot and store [target_value] of credits worth in [storage_area.name]." - -/datum/objective/loot/proc/loot_listing() - //Lists notable loot. - if(!storage_area) - return "Nothing" - var/list/loot_table = list() - for(var/atom/movable/AM in storage_area.GetAllContents()) - if(is_type_in_typecache(AM,GLOB.pirate_loot_cache)) - var/lootname = AM.name - var/count = 1 - if(istype(AM,/obj/item/stack)) //Ugh. - var/obj/item/stack/S = AM - lootname = S.singular_name - count = S.amount - if(!loot_table[lootname]) - loot_table[lootname] = count - else - loot_table[lootname] += count - var/list/loot_texts = list() - for(var/key in loot_table) - var/amount = loot_table[key] - loot_texts += "[amount] [key][amount > 1 ? "s":""]" - return loot_texts.Join(", ") - -/datum/objective/loot/proc/get_loot_value() - if(!storage_area) - return 0 - var/value = 0 - for(var/turf/T in storage_area.contents) - value += export_item_and_contents(T,TRUE, TRUE, dry_run = TRUE) - return value - initial_value - -/datum/objective/loot/proc/update_initial_value() - initial_value = get_loot_value() - -/datum/objective/loot/check_completion() - return ..() || get_loot_value() >= target_value - -/datum/team/pirate/roundend_report() - var/list/parts = list() - - parts += "Space Pirates were:" - - var/all_dead = TRUE - for(var/datum/mind/M in members) - if(considered_alive(M)) - all_dead = FALSE - parts += printplayerlist(members) - - parts += "Loot stolen: " - var/datum/objective/loot/L = locate() in objectives - parts += L.loot_listing() - parts += "Total loot value : [L.get_loot_value()]/[L.target_value] credits" - - if(L.check_completion() && !all_dead) - parts += "The pirate crew was successful!" - else - parts += "The pirate crew has failed." - - return "
[parts.Join("
")]
" \ No newline at end of file diff --git a/code/datums/antagonists/revolution.dm b/code/datums/antagonists/revolution.dm deleted file mode 100644 index 5ac3bfe2aa..0000000000 --- a/code/datums/antagonists/revolution.dm +++ /dev/null @@ -1,368 +0,0 @@ -//How often to check for promotion possibility -#define HEAD_UPDATE_PERIOD 300 - -/datum/antagonist/rev - name = "Revolutionary" - roundend_category = "revolutionaries" // if by some miracle revolutionaries without revolution happen - antagpanel_category = "Revolution" - job_rank = ROLE_REV - var/hud_type = "rev" - var/datum/team/revolution/rev_team - -/datum/antagonist/rev/can_be_owned(datum/mind/new_owner) - . = ..() - if(.) - if(new_owner.assigned_role in GLOB.command_positions) - return FALSE - if(new_owner.unconvertable) - return FALSE - if(new_owner.current && new_owner.current.isloyal()) - return FALSE - -/datum/antagonist/rev/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_rev_icons_added(M) - -/datum/antagonist/rev/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_rev_icons_removed(M) - -/datum/antagonist/rev/proc/equip_rev() - return - -/datum/antagonist/rev/on_gain() - . = ..() - create_objectives() - equip_rev() - owner.current.log_message("Has been converted to the revolution!", INDIVIDUAL_ATTACK_LOG) - -/datum/antagonist/rev/on_removal() - remove_objectives() - . = ..() - -/datum/antagonist/rev/greet() - to_chat(owner, "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!") - owner.announce_objectives() - -/datum/antagonist/rev/create_team(datum/team/revolution/new_team) - if(!new_team) - //For now only one revolution at a time - for(var/datum/antagonist/rev/head/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.rev_team) - rev_team = H.rev_team - return - rev_team = new /datum/team/revolution - rev_team.update_objectives() - rev_team.update_heads() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - rev_team = new_team - -/datum/antagonist/rev/get_team() - return rev_team - -/datum/antagonist/rev/proc/create_objectives() - owner.objectives |= rev_team.objectives - -/datum/antagonist/rev/proc/remove_objectives() - owner.objectives -= rev_team.objectives - -//Bump up to head_rev -/datum/antagonist/rev/proc/promote() - var/old_team = rev_team - var/datum/mind/old_owner = owner - silent = TRUE - owner.remove_antag_datum(/datum/antagonist/rev) - var/datum/antagonist/rev/head/new_revhead = new() - new_revhead.silent = TRUE - old_owner.add_antag_datum(new_revhead,old_team) - new_revhead.silent = FALSE - to_chat(old_owner, "You have proved your devotion to revolution! You are a head revolutionary now!") - -/datum/antagonist/rev/get_admin_commands() - . = ..() - .["Promote"] = CALLBACK(src,.proc/admin_promote) - -/datum/antagonist/rev/proc/admin_promote(mob/admin) - var/datum/mind/O = owner - promote() - message_admins("[key_name_admin(admin)] has head-rev'ed [O].") - log_admin("[key_name(admin)] has head-rev'ed [O].") - -/datum/antagonist/rev/head/admin_add(datum/mind/new_owner,mob/admin) - give_flash = TRUE - give_hud = TRUE - remove_clumsy = TRUE - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has head-rev'ed [new_owner.current].") - log_admin("[key_name(admin)] has head-rev'ed [new_owner.current].") - to_chat(new_owner.current, "You are a member of the revolutionaries' leadership now!") - -/datum/antagonist/rev/head/get_admin_commands() - . = ..() - . -= "Promote" - .["Take flash"] = CALLBACK(src,.proc/admin_take_flash) - .["Give flash"] = CALLBACK(src,.proc/admin_give_flash) - .["Repair flash"] = CALLBACK(src,.proc/admin_repair_flash) - .["Demote"] = CALLBACK(src,.proc/admin_demote) - -/datum/antagonist/rev/head/proc/admin_take_flash(mob/admin) - var/list/L = owner.current.get_contents() - var/obj/item/device/assembly/flash/flash = locate() in L - if (!flash) - to_chat(admin, "Deleting flash failed!") - return - qdel(flash) - -/datum/antagonist/rev/head/proc/admin_give_flash(mob/admin) - //This is probably overkill but making these impact state annoys me - var/old_give_flash = give_flash - var/old_give_hud = give_hud - var/old_remove_clumsy = remove_clumsy - give_flash = TRUE - give_hud = FALSE - remove_clumsy = FALSE - equip_rev() - give_flash = old_give_flash - give_hud = old_give_hud - remove_clumsy = old_remove_clumsy - -/datum/antagonist/rev/head/proc/admin_repair_flash(mob/admin) - var/list/L = owner.current.get_contents() - var/obj/item/device/assembly/flash/flash = locate() in L - if (!flash) - to_chat(admin, "Repairing flash failed!") - else - flash.crit_fail = 0 - flash.update_icon() - -/datum/antagonist/rev/head/proc/admin_demote(datum/mind/target,mob/user) - message_admins("[key_name_admin(user)] has demoted [owner.current] from head revolutionary.") - log_admin("[key_name(user)] has demoted [owner.current] from head revolutionary.") - demote() - -/datum/antagonist/rev/head - name = "Head Revolutionary" - hud_type = "rev_head" - var/remove_clumsy = FALSE - var/give_flash = FALSE - var/give_hud = TRUE - -/datum/antagonist/rev/head/antag_listing_name() - return ..() + "(Leader)" - -/datum/antagonist/rev/proc/update_rev_icons_added(mob/living/M) - var/datum/atom_hud/antag/revhud = GLOB.huds[ANTAG_HUD_REV] - revhud.join_hud(M) - set_antag_hud(M,hud_type) - -/datum/antagonist/rev/proc/update_rev_icons_removed(mob/living/M) - var/datum/atom_hud/antag/revhud = GLOB.huds[ANTAG_HUD_REV] - revhud.leave_hud(M) - set_antag_hud(M, null) - -/datum/antagonist/rev/proc/can_be_converted(mob/living/candidate) - if(!candidate.mind) - return FALSE - if(!can_be_owned(candidate.mind)) - return FALSE - var/mob/living/carbon/C = candidate //Check to see if the potential rev is implanted - if(!istype(C)) //Can't convert simple animals - return FALSE - return TRUE - -/datum/antagonist/rev/proc/add_revolutionary(datum/mind/rev_mind,stun = TRUE) - if(!can_be_converted(rev_mind.current)) - return FALSE - if(stun) - if(iscarbon(rev_mind.current)) - var/mob/living/carbon/carbon_mob = rev_mind.current - carbon_mob.silent = max(carbon_mob.silent, 5) - carbon_mob.flash_act(1, 1) - rev_mind.current.Stun(100) - rev_mind.add_antag_datum(/datum/antagonist/rev,rev_team) - rev_mind.special_role = ROLE_REV - return TRUE - -/datum/antagonist/rev/head/proc/demote() - var/datum/mind/old_owner = owner - var/old_team = rev_team - silent = TRUE - owner.remove_antag_datum(/datum/antagonist/rev/head) - var/datum/antagonist/rev/new_rev = new /datum/antagonist/rev() - new_rev.silent = TRUE - old_owner.add_antag_datum(new_rev,old_team) - new_rev.silent = FALSE - to_chat(old_owner, "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!") - -/datum/antagonist/rev/farewell() - if(ishuman(owner.current)) - owner.current.visible_message("[owner.current] looks like they just remembered their real allegiance!", null, null, null, owner.current) - to_chat(owner, "You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...") - else if(issilicon(owner.current)) - owner.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.", null, null, null, owner.current) - to_chat(owner, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.") - -/datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter) - log_attack("[owner.current] (Key: [key_name(owner.current)]) has been deconverted from the revolution by [deconverter] (Key: [key_name(deconverter)])!") - if(borged) - message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]") - owner.special_role = null - if(iscarbon(owner.current)) - var/mob/living/carbon/C = owner.current - C.Unconscious(100) - owner.remove_antag_datum(type) - -/datum/antagonist/rev/head/remove_revolutionary(borged,deconverter) - if(!borged) - return - . = ..() - -/datum/antagonist/rev/head/equip_rev() - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - return - - if(remove_clumsy && owner.assigned_role == "Clown") - to_chat(owner, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - H.dna.remove_mutation(CLOWNMUT) - - if(give_flash) - var/obj/item/device/assembly/flash/T = new(H) - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store - ) - var/where = H.equip_in_one_of_slots(T, slots) - if (!where) - to_chat(H, "The Syndicate were unfortunately unable to get you a flash.") - else - to_chat(H, "The flash in your [where] will help you to persuade the crew to join your cause.") - - if(give_hud) - var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new(H) - S.Insert(H, special = FALSE, drop_if_replaced = FALSE) - to_chat(H, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.") - -/datum/team/revolution - name = "Revolution" - var/max_headrevs = 3 - -/datum/team/revolution/proc/update_objectives(initial = FALSE) - var/untracked_heads = SSjob.get_all_heads() - for(var/datum/objective/mutiny/O in objectives) - untracked_heads -= O.target - for(var/datum/mind/M in untracked_heads) - var/datum/objective/mutiny/new_target = new() - new_target.team = src - new_target.target = M - new_target.update_explanation_text() - objectives += new_target - for(var/datum/mind/M in members) - M.objectives |= objectives - - addtimer(CALLBACK(src,.proc/update_objectives),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) - -/datum/team/revolution/proc/head_revolutionaries() - . = list() - for(var/datum/mind/M in members) - if(M.has_antag_datum(/datum/antagonist/rev/head)) - . += M - -/datum/team/revolution/proc/update_heads() - if(SSticker.HasRoundStarted()) - var/list/datum/mind/head_revolutionaries = head_revolutionaries() - var/list/datum/mind/heads = SSjob.get_all_heads() - var/list/sec = SSjob.get_all_sec() - - if(head_revolutionaries.len < max_headrevs && head_revolutionaries.len < round(heads.len - ((8 - sec.len) / 3))) - var/list/datum/mind/non_heads = members - head_revolutionaries - var/list/datum/mind/promotable = list() - for(var/datum/mind/khrushchev in non_heads) - if(khrushchev.current && !khrushchev.current.incapacitated() && !khrushchev.current.restrained() && khrushchev.current.client && khrushchev.current.stat != DEAD) - if(ROLE_REV in khrushchev.current.client.prefs.be_special) - promotable += khrushchev - if(promotable.len) - var/datum/mind/new_leader = pick(promotable) - var/datum/antagonist/rev/rev = new_leader.has_antag_datum(/datum/antagonist/rev) - rev.promote() - - addtimer(CALLBACK(src,.proc/update_heads),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) - - -/datum/team/revolution/roundend_report() - if(!members.len) - return - - var/list/result = list() - - result += "
" - - var/num_revs = 0 - var/num_survivors = 0 - for(var/mob/living/carbon/survivor in GLOB.alive_mob_list) - if(survivor.ckey) - num_survivors++ - if(survivor.mind) - if(is_revolutionary(survivor)) - num_revs++ - if(num_survivors) - result += "Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%
" - - - var/list/targets = list() - var/list/datum/mind/headrevs = get_antagonists(/datum/antagonist/rev/head) - var/list/datum/mind/revs = get_antagonists(/datum/antagonist/rev,TRUE) - if(headrevs.len) - var/list/headrev_part = list() - headrev_part += "The head revolutionaries were:" - headrev_part += printplayerlist(headrevs,TRUE) - result += headrev_part.Join("
") - - if(revs.len) - var/list/rev_part = list() - rev_part += "The revolutionaries were:" - rev_part += printplayerlist(revs,TRUE) - result += rev_part.Join("
") - - var/list/heads = SSjob.get_all_heads() - if(heads.len) - var/head_text = "The heads of staff were:" - head_text += "
    " - for(var/datum/mind/head in heads) - var/target = (head in targets) - head_text += "
  • " - if(target) - head_text += "Target" - head_text += "[printplayer(head, 1)]
  • " - head_text += "

" - result += head_text - - result += "
" - - return result.Join() - -/datum/team/revolution/antag_listing_entry() - var/common_part = ..() - var/heads_report = "Heads of Staff
" - heads_report += "" - for(var/datum/mind/N in SSjob.get_living_heads()) - var/mob/M = N.current - if(M) - heads_report += "" - heads_report += "" - heads_report += "" - var/turf/mob_loc = get_turf(M) - heads_report += "" - else - heads_report += "" - heads_report += "" - heads_report += "
[M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""]PMFLW[mob_loc.loc]
[N.name]([N.key])Head body destroyed!PM
" - return common_part + heads_report - -/datum/team/revolution/is_gamemode_hero() - return SSticker.mode.name == "revolution" \ No newline at end of file diff --git a/code/datums/antagonists/wizard.dm b/code/datums/antagonists/wizard.dm deleted file mode 100644 index 8aba74f70a..0000000000 --- a/code/datums/antagonists/wizard.dm +++ /dev/null @@ -1,339 +0,0 @@ -#define APPRENTICE_DESTRUCTION "destruction" -#define APPRENTICE_BLUESPACE "bluespace" -#define APPRENTICE_ROBELESS "robeless" -#define APPRENTICE_HEALING "healing" - -/datum/antagonist/wizard - name = "Space Wizard" - roundend_category = "wizards/witches" - antagpanel_category = "Wizard" - job_rank = ROLE_WIZARD - var/give_objectives = TRUE - var/strip = TRUE //strip before equipping - var/allow_rename = TRUE - var/hud_version = "wizard" - var/datum/team/wizard/wiz_team //Only created if wizard summons apprentices - var/move_to_lair = TRUE - var/outfit_type = /datum/outfit/wizard - var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */ - -/datum/antagonist/wizard/on_gain() - register() - if(give_objectives) - create_objectives() - equip_wizard() - if(move_to_lair) - send_to_lair() - . = ..() - if(allow_rename) - rename_wizard() - -/datum/antagonist/wizard/proc/register() - SSticker.mode.wizards |= owner - -/datum/antagonist/wizard/proc/unregister() - SSticker.mode.wizards -= src - -/datum/antagonist/wizard/create_team(datum/team/wizard/new_team) - if(!new_team) - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - wiz_team = new_team - -/datum/antagonist/wizard/get_team() - return wiz_team - -/datum/team/wizard - name = "wizard team" - var/datum/antagonist/wizard/master_wizard - -/datum/antagonist/wizard/proc/create_wiz_team() - wiz_team = new(owner) - wiz_team.name = "[owner.current.real_name] team" - wiz_team.master_wizard = src - update_wiz_icons_added(owner.current) - -/datum/antagonist/wizard/proc/send_to_lair() - if(!owner || !owner.current) - return - if(!GLOB.wizardstart.len) - SSjob.SendToLateJoin(owner.current) - to_chat(owner, "HOT INSERTION, GO GO GO") - owner.current.forceMove(pick(GLOB.wizardstart)) - -/datum/antagonist/wizard/proc/create_objectives() - switch(rand(1,100)) - if(1 to 30) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - objectives += kill_objective - - if (!(locate(/datum/objective/escape) in owner.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - - if(31 to 60) - var/datum/objective/steal/steal_objective = new - steal_objective.owner = owner - steal_objective.find_target() - objectives += steal_objective - - if (!(locate(/datum/objective/escape) in owner.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - - if(61 to 85) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - objectives += kill_objective - - var/datum/objective/steal/steal_objective = new - steal_objective.owner = owner - steal_objective.find_target() - objectives += steal_objective - - if (!(locate(/datum/objective/survive) in owner.objectives)) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - objectives += survive_objective - - else - if (!(locate(/datum/objective/hijack) in owner.objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = owner - objectives += hijack_objective - - for(var/datum/objective/O in objectives) - owner.objectives += O - -/datum/antagonist/wizard/on_removal() - unregister() - for(var/objective in objectives) - owner.objectives -= objective - owner.RemoveAllSpells() // TODO keep track which spells are wizard spells which innate stuff - return ..() - -/datum/antagonist/wizard/proc/equip_wizard() - if(!owner) - return - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - return - if(strip) - H.delete_equipment() - //Wizards are human by default. Use the mirror if you want something else. - H.set_species(/datum/species/human) - if(H.age < wiz_age) - H.age = wiz_age - H.equipOutfit(outfit_type) - -/datum/antagonist/wizard/greet() - to_chat(owner, "You are the Space Wizard!") - to_chat(owner, "The Space Wizards Federation has given you the following tasks:") - owner.announce_objectives() - to_chat(owner, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.") - to_chat(owner, "The spellbook is bound to you, and others cannot use it.") - to_chat(owner, "In your pockets you will find a teleport scroll. Use it as needed.") - to_chat(owner,"Remember: do not forget to prepare your spells.") - -/datum/antagonist/wizard/farewell() - to_chat(owner, "You have been brainwashed! You are no longer a wizard!") - -/datum/antagonist/wizard/proc/rename_wizard() - set waitfor = FALSE - - var/wizard_name_first = pick(GLOB.wizard_first) - var/wizard_name_second = pick(GLOB.wizard_second) - var/randomname = "[wizard_name_first] [wizard_name_second]" - var/mob/living/wiz_mob = owner.current - var/newname = copytext(sanitize(input(wiz_mob, "You are the [name]. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN) - - if (!newname) - newname = randomname - - wiz_mob.fully_replace_character_name(wiz_mob.real_name, newname) - -/datum/antagonist/wizard/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_wiz_icons_added(M, wiz_team ? TRUE : FALSE) //Don't bother showing the icon if you're solo wizard - M.faction |= ROLE_WIZARD - -/datum/antagonist/wizard/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_wiz_icons_removed(M) - M.faction -= ROLE_WIZARD - - -/datum/antagonist/wizard/get_admin_commands() - . = ..() - .["Send to Lair"] = CALLBACK(src,.proc/admin_send_to_lair) - -/datum/antagonist/wizard/proc/admin_send_to_lair(mob/admin) - owner.current.forceMove(pick(GLOB.wizardstart)) - -/datum/antagonist/wizard/apprentice - name = "Wizard Apprentice" - hud_version = "apprentice" - var/datum/mind/master - var/school = APPRENTICE_DESTRUCTION - outfit_type = /datum/outfit/wizard/apprentice - wiz_age = APPRENTICE_AGE_MIN - -/datum/antagonist/wizard/apprentice/greet() - to_chat(owner, "You are [master.current.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.") - owner.announce_objectives() - -/datum/antagonist/wizard/apprentice/register() - SSticker.mode.apprentices |= owner - -/datum/antagonist/wizard/apprentice/unregister() - SSticker.mode.apprentices -= owner - -/datum/antagonist/wizard/apprentice/equip_wizard() - . = ..() - if(!owner) - return - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - return - switch(school) - if(APPRENTICE_DESTRUCTION) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.") - if(APPRENTICE_BLUESPACE) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.") - if(APPRENTICE_HEALING) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null)) - H.put_in_hands(new /obj/item/gun/magic/staff/healing(H)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.") - if(APPRENTICE_ROBELESS) - owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.") - -/datum/antagonist/wizard/apprentice/create_objectives() - var/datum/objective/protect/new_objective = new /datum/objective/protect - new_objective.owner = owner - new_objective.target = master - new_objective.explanation_text = "Protect [master.current.real_name], the wizard." - owner.objectives += new_objective - objectives += new_objective - -//Random event wizard -/datum/antagonist/wizard/apprentice/imposter - name = "Wizard Imposter" - allow_rename = FALSE - move_to_lair = FALSE - -/datum/antagonist/wizard/apprentice/imposter/greet() - to_chat(owner, "You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!") - owner.announce_objectives() - -/datum/antagonist/wizard/apprentice/imposter/equip_wizard() - var/mob/living/carbon/human/master_mob = master.current - var/mob/living/carbon/human/H = owner.current - if(!istype(master_mob) || !istype(H)) - return - if(master_mob.ears) - H.equip_to_slot_or_del(new master_mob.ears.type, slot_ears) - if(master_mob.w_uniform) - H.equip_to_slot_or_del(new master_mob.w_uniform.type, slot_w_uniform) - if(master_mob.shoes) - H.equip_to_slot_or_del(new master_mob.shoes.type, slot_shoes) - if(master_mob.wear_suit) - H.equip_to_slot_or_del(new master_mob.wear_suit.type, slot_wear_suit) - if(master_mob.head) - H.equip_to_slot_or_del(new master_mob.head.type, slot_head) - if(master_mob.back) - H.equip_to_slot_or_del(new master_mob.back.type, slot_back) - - //Operation: Fuck off and scare people - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null)) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) - -/datum/antagonist/wizard/proc/update_wiz_icons_added(mob/living/wiz,join = TRUE) - var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ] - wizhud.join_hud(wiz) - set_antag_hud(wiz, hud_version) - -/datum/antagonist/wizard/proc/update_wiz_icons_removed(mob/living/wiz) - var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ] - wizhud.leave_hud(wiz) - set_antag_hud(wiz, null) - - -/datum/antagonist/wizard/academy - name = "Academy Teacher" - outfit_type = /datum/outfit/wizard/academy - -/datum/antagonist/wizard/academy/equip_wizard() - . = ..() - - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt) - owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile) - owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball) - - var/mob/living/M = owner.current - if(!istype(M)) - return - - var/obj/item/implant/exile/Implant = new/obj/item/implant/exile(M) - Implant.implant(M) - -/datum/antagonist/wizard/academy/create_objectives() - var/datum/objective/new_objective = new("Protect Wizard Academy from the intruders") - new_objective.owner = owner - owner.objectives += new_objective - objectives += new_objective - -//Solo wizard report -/datum/antagonist/wizard/roundend_report() - var/list/parts = list() - - parts += printplayer(owner) - - var/count = 1 - var/wizardwin = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!" - else - parts += "Objective #[count]: [objective.explanation_text] Fail." - wizardwin = 0 - count++ - - if(wizardwin) - parts += "The wizard was successful!" - else - parts += "The wizard has failed!" - - if(owner.spell_list.len>0) - parts += "[owner.name] used the following spells: " - var/list/spell_names = list() - for(var/obj/effect/proc_holder/spell/S in owner.spell_list) - spell_names += S.name - parts += spell_names.Join(", ") - - return parts.Join("
") - -//Wizard with apprentices report -/datum/team/wizard/roundend_report() - var/list/parts = list() - - parts += "Wizards/witches of [master_wizard.owner.name] team were:" - parts += master_wizard.roundend_report() - parts += " " - parts += "[master_wizard.owner.name] apprentices were:" - parts += printplayerlist(members - master_wizard.owner) - - return "
[parts.Join("
")]
" \ No newline at end of file diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 88c7d09005..a1a4c11ca6 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -142,9 +142,6 @@ var/link = FOLLOW_LINK(M, owner) to_chat(M, "[link] [dead_rendered]") -/mob/camera/imaginary_friend/emote(act,m_type=1,message = null) - return - /mob/camera/imaginary_friend/forceMove(atom/destination) dir = get_dir(get_turf(src), destination) loc = destination diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 87e0cb3457..9a523cb39f 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -43,6 +43,9 @@ /datum/brain_trauma/mild/dumbness/on_gain() owner.add_trait(TRAIT_DUMB, TRAUMA_TRAIT) + GET_COMPONENT_FROM(mood, /datum/component/mood, owner) + if(mood) + mood.add_event("dumb", /datum/mood_event/oblivious) ..() /datum/brain_trauma/mild/dumbness/on_life() @@ -56,6 +59,9 @@ /datum/brain_trauma/mild/dumbness/on_lose() owner.remove_trait(TRAIT_DUMB, TRAUMA_TRAIT) owner.derpspeech = 0 + GET_COMPONENT_FROM(mood, /datum/component/mood, owner) + if(mood) + mood.clear_event("dumb") ..() /datum/brain_trauma/mild/speech_impediment @@ -211,4 +217,4 @@ to_chat(owner, "Your arm spasms!") log_attack("[key_name(owner)] threw [I] due to a Muscle Spasm.") owner.throw_item(pick(targets)) - ..() \ No newline at end of file + ..() diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index 15db4a3d3e..7557e8fd9c 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -85,6 +85,8 @@ /datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word) next_scare = world.time + 120 + if(owner.stat == DEAD) + return var/message = pick("spooks you to the bone", "shakes you up", "terrifies you", "sends you into a panic", "sends chills down your spine") if(reason) to_chat(owner, "Seeing [reason] [message]!") diff --git a/code/datums/browser.dm b/code/datums/browser.dm index d525b52ca5..fa5b054f48 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -223,25 +223,27 @@ /datum/browser/modal/listpicker var/valueslist = list() -/datum/browser/modal/listpicker/New(User,Message,Title,Button1="Ok",Button2,Button3,StealFocus = 1, Timeout = FALSE,list/values,inputtype="checkbox") +/datum/browser/modal/listpicker/New(User,Message,Title,Button1="Ok",Button2,Button3,StealFocus = 1, Timeout = FALSE,list/values,inputtype="checkbox", width, height, slidecolor) if (!User) return var/output = {"
    "} - if (inputtype == "checkbox" || inputtype == "radio") for (var/i in values) + var/div_slider = slidecolor + if(!i["allowed_edit"]) + div_slider = "locked" output += {"
  • - -
  • "} + + "} else for (var/i in values) output += {"
  • -
  • "} + "} output += {"
"} @@ -252,7 +254,7 @@ output += {""} output += {"
"} - ..(User, ckey("[User]-[Message]-[Title]-[world.time]-[rand(1,10000)]"), Title, 350, 350, src, StealFocus, Timeout) + ..(User, ckey("[User]-[Message]-[Title]-[world.time]-[rand(1,10000)]"), Title, width, height, src, StealFocus, Timeout) set_content(output) /datum/browser/modal/listpicker/Topic(href,href_list) @@ -272,30 +274,32 @@ opentime = 0 close() -/proc/presentpicker(var/mob/User,Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1,Timeout = 6000,list/values, inputtype = "checkbox") +/proc/presentpicker(var/mob/User,Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1,Timeout = 6000,list/values, inputtype = "checkbox", width, height, slidecolor) if (!istype(User)) if (istype(User, /client/)) var/client/C = User User = C.mob else return - var/datum/browser/modal/listpicker/A = new(User, Message, Title, Button1, Button2, Button3, StealFocus,Timeout, values, inputtype) + var/datum/browser/modal/listpicker/A = new(User, Message, Title, Button1, Button2, Button3, StealFocus,Timeout, values, inputtype, width, height, slidecolor) A.open() A.wait() if (A.selectedbutton) return list("button" = A.selectedbutton, "values" = A.valueslist) -/proc/input_bitfield(var/mob/User, title, bitfield, current_value) +/proc/input_bitfield(var/mob/User, title, bitfield, current_value, nwidth = 350, nheight = 350, nslidecolor, allowed_edit_list = null) if (!User || !(bitfield in GLOB.bitfields)) return var/list/pickerlist = list() for (var/i in GLOB.bitfields[bitfield]) + var/can_edit = 1 + if(!isnull(allowed_edit_list) && !(allowed_edit_list & GLOB.bitfields[bitfield][i])) + can_edit = 0 if (current_value & GLOB.bitfields[bitfield][i]) - pickerlist += list(list("checked" = 1, "value" = GLOB.bitfields[bitfield][i], "name" = i)) + pickerlist += list(list("checked" = 1, "value" = GLOB.bitfields[bitfield][i], "name" = i, "allowed_edit" = can_edit)) else - pickerlist += list(list("checked" = 0, "value" = GLOB.bitfields[bitfield][i], "name" = i)) - var/list/result = presentpicker(User, "", title, Button1="Save", Button2 = "Cancel", Timeout=FALSE, values = pickerlist) - + pickerlist += list(list("checked" = 0, "value" = GLOB.bitfields[bitfield][i], "name" = i, "allowed_edit" = can_edit)) + var/list/result = presentpicker(User, "", title, Button1="Save", Button2 = "Cancel", Timeout=FALSE, values = pickerlist, width = nwidth, height = nheight, slidecolor = nslidecolor) if (islist(result)) if (result["button"] == 2) // If the user pressed the cancel button return @@ -305,6 +309,106 @@ else return +/datum/browser/modal/preflikepicker + var/settings = list() + var/icon/preview_icon = null + var/datum/callback/preview_update + +/datum/browser/modal/preflikepicker/New(User,Message,Title,Button1="Ok",Button2,Button3,StealFocus = 1, Timeout = FALSE,list/settings,inputtype="checkbox", width = 600, height, slidecolor) + if (!User) + return + src.settings = settings + + ..(User, ckey("[User]-[Message]-[Title]-[world.time]-[rand(1,10000)]"), Title, width, height, src, StealFocus, Timeout) + set_content(ShowChoices(User)) + +/datum/browser/modal/preflikepicker/proc/ShowChoices(mob/user) + if (settings["preview_callback"]) + var/datum/callback/callback = settings["preview_callback"] + preview_icon = callback.Invoke(settings) + if (preview_icon) + user << browse_rsc(preview_icon, "previewicon.png") + var/dat = "" + + for (var/name in settings["mainsettings"]) + var/setting = settings["mainsettings"][name] + if (setting["type"] == "datum") + if (setting["subtypesonly"]) + dat += "[setting["desc"]]: [setting["value"]]
" + else + dat += "[setting["desc"]]: [setting["value"]]
" + else + dat += "[setting["desc"]]: [setting["value"]]
" + + if (preview_icon) + dat += "" + + dat += "
" + + dat += "" + + dat += "" + + dat += "
Ok " + + dat += "
" + + return dat + +/datum/browser/modal/preflikepicker/Topic(href,href_list) + if (href_list["close"] || !user || !user.client) + opentime = 0 + return + if (href_list["task"] == "input") + var/setting = href_list["setting"] + switch (href_list["type"]) + if ("datum") + var/oldval = settings["mainsettings"][setting]["value"] + if (href_list["subtypesonly"]) + settings["mainsettings"][setting]["value"] = pick_closest_path(null, make_types_fancy(subtypesof(text2path(href_list["path"])))) + else + settings["mainsettings"][setting]["value"] = pick_closest_path(null, make_types_fancy(typesof(text2path(href_list["path"])))) + if (isnull(settings["mainsettings"][setting]["value"])) + settings["mainsettings"][setting]["value"] = oldval + if ("string") + settings["mainsettings"][setting]["value"] = stripped_input(user, "Enter new value for [settings["mainsettings"][setting]["desc"]]", "Enter new value for [settings["mainsettings"][setting]["desc"]]") + if ("number") + settings["mainsettings"][setting]["value"] = input(user, "Enter new value for [settings["mainsettings"][setting]["desc"]]", "Enter new value for [settings["mainsettings"][setting]["desc"]]") as num + if ("boolean") + settings["mainsettings"][setting]["value"] = input(user, "[settings["mainsettings"][setting]["desc"]]?") in list("Yes","No") + if ("ckey") + settings["mainsettings"][setting]["value"] = input(user, "[settings["mainsettings"][setting]["desc"]]?") in list("none") + GLOB.directory + if (settings["mainsettings"][setting]["callback"]) + var/datum/callback/callback = settings["mainsettings"][setting]["callback"] + settings = callback.Invoke(settings) + if (href_list["button"]) + var/button = text2num(href_list["button"]) + if (button <= 3 && button >= 1) + selectedbutton = button + if (selectedbutton != 1) + set_content(ShowChoices(user)) + open() + return + for (var/item in href_list) + switch(item) + if ("close", "button", "src") + continue + opentime = 0 + close() + +/proc/presentpreflikepicker(var/mob/User,Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1,Timeout = 6000,list/settings, width, height, slidecolor) + if (!istype(User)) + if (istype(User, /client/)) + var/client/C = User + User = C.mob + else + return + var/datum/browser/modal/preflikepicker/A = new(User, Message, Title, Button1, Button2, Button3, StealFocus,Timeout, settings, width, height, slidecolor) + A.open() + A.wait() + if (A.selectedbutton) + return list("button" = A.selectedbutton, "settings" = A.settings) + // This will allow you to show an icon in the browse window // This is added to mob so that it can be used without a reference to the browser object // There is probably a better place for this... diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 5b8adf0175..9193651ee2 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -24,7 +24,7 @@ if(ishuman(AM)) var/mob/living/carbon/human/H = AM - if(PIERCEIMMUNE in H.dna.species.species_traits) + if(H.has_trait(TRAIT_PIERCEIMMUNE)) return if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK) @@ -46,6 +46,8 @@ return var/damage = rand(min_damage, max_damage) + if(H.has_trait(TRAIT_LIGHT_STEP)) + damage *= 0.75 H.apply_damage(damage, BRUTE, picked_def_zone) if(cooldown < world.time - 10) //cooldown to avoid message spam. diff --git a/code/datums/components/construction.dm b/code/datums/components/construction.dm new file mode 100644 index 0000000000..74b6f54a6c --- /dev/null +++ b/code/datums/components/construction.dm @@ -0,0 +1,158 @@ +#define FORWARD 1 +#define BACKWARD -1 + +#define ITEM_DELETE "delete" +#define ITEM_MOVE_INSIDE "move_inside" + + +/datum/component/construction + var/list/steps + var/result + var/index = 1 + var/desc + +/datum/component/construction/Initialize() + if(!isatom(parent)) + . = COMPONENT_INCOMPATIBLE + CRASH("A construction component was applied incorrectly to non-atom: [parent.type].") + + RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(COMSIG_PARENT_ATTACKBY,.proc/action) + update_parent(index) + +/datum/component/construction/proc/examine(mob/user) + if(desc) + to_chat(user, desc) + +/datum/component/construction/proc/on_step() + if(index > steps.len) + spawn_result() + else + update_parent(index) + +/datum/component/construction/proc/action(obj/item/I, mob/living/user) + return check_step(I, user) + +/datum/component/construction/proc/update_index(diff) + index += diff + on_step() + +/datum/component/construction/proc/check_step(obj/item/I, mob/living/user) + var/diff = is_right_key(I) + if(diff && custom_action(I, user, diff)) + update_index(diff) + return TRUE + return FALSE + +/datum/component/construction/proc/is_right_key(obj/item/I) // returns index step + var/list/L = steps[index] + if(check_used_item(I, L["key"])) + return FORWARD //to the first step -> forward + else if(check_used_item(I, L["back_key"])) + return BACKWARD //to the last step -> backwards + return FALSE + +/datum/component/construction/proc/check_used_item(obj/item/I, key) + if(!key) + return FALSE + + if(ispath(key) && istype(I, key)) + return TRUE + + else if(I.tool_behaviour == key) + return TRUE + + return FALSE + +/datum/component/construction/proc/custom_action(obj/item/I, mob/living/user, diff) + var/target_index = index + diff + var/list/current_step = steps[index] + var/list/target_step + + if(target_index > 0 && target_index <= steps.len) + target_step = steps[target_index] + + . = TRUE + + if(I.tool_behaviour) + . = I.use_tool(parent, user, 0, volume=50) + + else if(diff == FORWARD) + switch(current_step["action"]) + if(ITEM_DELETE) + . = user.transferItemToLoc(I, parent) + if(.) + qdel(I) + + if(ITEM_MOVE_INSIDE) + . = user.transferItemToLoc(I, parent) + + // Using stacks + else if(istype(I, /obj/item/stack)) + . = I.use_tool(parent, user, 0, volume=50, amount=current_step["amount"]) + + + // Going backwards? Undo the last action. Drop/respawn the items used in last action, if any. + if(. && diff == BACKWARD && target_step && !target_step["no_refund"]) + var/target_step_key = target_step["key"] + + switch(target_step["action"]) + if(ITEM_DELETE) + new target_step_key(drop_location()) + + if(ITEM_MOVE_INSIDE) + var/obj/item/located_item = locate(target_step_key) in parent + if(located_item) + located_item.forceMove(drop_location()) + + else if(ispath(target_step_key, /obj/item/stack)) + new target_step_key(drop_location(), target_step["amount"]) + +/datum/component/construction/proc/spawn_result() + // Some constructions result in new components being added. + if(ispath(result, /datum/component)) + parent.AddComponent(result) + qdel(src) + + else if(ispath(result, /atom)) + new result(drop_location()) + qdel(parent) + +/datum/component/construction/proc/update_parent(step_index) + var/list/step = steps[step_index] + var/atom/parent_atom = parent + + if(step["desc"]) + desc = step["desc"] + + if(step["icon_state"]) + parent_atom.icon_state = step["icon_state"] + +/datum/component/construction/proc/drop_location() + var/atom/parent_atom = parent + return parent_atom.drop_location() + + + +// Unordered construction. +// Takes a list of part types, to be added in any order, as steps. +// Calls spawn_result() when every type has been added. +/datum/component/construction/unordered/check_step(obj/item/I, mob/living/user) + for(var/typepath in steps) + if(istype(I, typepath) && custom_action(I, user, typepath)) + steps -= typepath + on_step() + return TRUE + return FALSE + +/datum/component/construction/unordered/on_step() + if(!steps.len) + spawn_result() + else + update_parent(steps.len) + +/datum/component/construction/unordered/update_parent(steps_left) + return + +/datum/component/construction/unordered/custom_action(obj/item/I, mob/living/user, typepath) + return TRUE diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm new file mode 100644 index 0000000000..2f0401302f --- /dev/null +++ b/code/datums/components/mood.dm @@ -0,0 +1,122 @@ +/datum/component/mood + var/mood //Real happiness + var/shown_mood //Shown happiness, this is what others can see when they try to examine you, prevents antag checking by noticing traitors are always very happy. + var/mood_level //To track what stage of moodies they're on + var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets + var/datum/mood_event/list/mood_events = list() + var/mob/living/owner + +/datum/component/mood/Initialize() + if(!isliving(parent)) + . = COMPONENT_INCOMPATIBLE + CRASH("Some good for nothing loser put a mood component on something that isn't even a living mob.") + START_PROCESSING(SSmood, src) + owner = parent + +/datum/component/mood/Destroy() + STOP_PROCESSING(SSmood, src) + return ..() + +/datum/component/mood/proc/print_mood() + var/msg = "*---------*\nYour current mood\n" + for(var/i in mood_events) + var/datum/mood_event/event = mood_events[i] + msg += event.description + to_chat(owner, msg) + +/datum/component/mood/proc/update_mood() //Called whenever a mood event is added or removed + mood = 0 + shown_mood = 0 + for(var/i in mood_events) + var/datum/mood_event/event = mood_events[i] + mood += event.mood_change + if(!event.hidden) + shown_mood += event.mood_change + mood *= mood_modifier + shown_mood *= mood_modifier + + switch(mood) + if(-INFINITY to MOOD_LEVEL_SAD4) + mood_level = 1 + if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3) + mood_level = 2 + if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2) + mood_level = 3 + if(MOOD_LEVEL_SAD2 to MOOD_LEVEL_SAD1) + mood_level = 4 + if(MOOD_LEVEL_SAD1 to MOOD_LEVEL_HAPPY1) + mood_level = 5 + if(MOOD_LEVEL_HAPPY1 to MOOD_LEVEL_HAPPY2) + mood_level = 6 + if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3) + mood_level = 7 + if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4) + mood_level = 8 + if(MOOD_LEVEL_HAPPY4 to INFINITY) + mood_level = 9 + + if(owner.client && owner.hud_used) + owner.hud_used.mood.icon_state = "mood[mood_level]" + +/datum/component/mood/process() //Called on SSmood process + switch(mood) + if(-INFINITY to MOOD_LEVEL_SAD4) + owner.overlay_fullscreen("depression", /obj/screen/fullscreen/depression, 3) + if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3) + owner.overlay_fullscreen("depression", /obj/screen/fullscreen/depression, 2) + if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2) + owner.overlay_fullscreen("depression", /obj/screen/fullscreen/depression, 1) + if(MOOD_LEVEL_SAD2 to INFINITY) + owner.clear_fullscreen("depression") + + if(owner.has_trait(TRAIT_DEPRESSION)) + if(prob(0.1)) + add_event("depression", /datum/mood_event/depression) + clear_event("jolly") + if(owner.has_trait(TRAIT_JOLLY)) + if(prob(0.1)) + add_event("jolly", /datum/mood_event/jolly) + clear_event("depression") + +/datum/component/mood/proc/add_event(category, type, param) //Category will override any events in the same category, should be unique unless the event is based on the same thing like hunger. + var/datum/mood_event/the_event + if(mood_events[category]) + the_event = mood_events[category] + if(the_event.type != type) + clear_event(category) + return .() + else + return 0 //Don't have to update the event. + else + the_event = new type(src, param) + + mood_events[category] = the_event + update_mood() + + if(the_event.timeout) + addtimer(CALLBACK(src, .proc/clear_event, category), the_event.timeout) + +/datum/component/mood/proc/clear_event(category) + var/datum/mood_event/event = mood_events[category] + if(!event) + return 0 + + mood_events -= category + qdel(event) + update_mood() + +/datum/component/mood/proc/update_beauty(var/area/A) + if(A.outdoors) //if we're outside, we don't care. + clear_event("area_beauty") + return FALSE + switch(A.beauty) + if(-INFINITY to BEAUTY_LEVEL_HORRID) + add_event("area_beauty", /datum/mood_event/disgustingroom) + if(BEAUTY_LEVEL_HORRID to BEAUTY_LEVEL_BAD) + add_event("area_beauty", /datum/mood_event/grossroom) + if(BEAUTY_LEVEL_BAD to BEAUTY_LEVEL_GOOD) + clear_event("area_beauty") + if(BEAUTY_LEVEL_GOOD to BEAUTY_LEVEL_GREAT) + add_event("area_beauty", /datum/mood_event/niceroom) + if(BEAUTY_LEVEL_GREAT to INFINITY) + add_event("area_beauty", /datum/mood_event/greatroom) diff --git a/code/datums/components/ntnet_interface.dm b/code/datums/components/ntnet_interface.dm index 3016e53c08..c346279b32 100644 --- a/code/datums/components/ntnet_interface.dm +++ b/code/datums/components/ntnet_interface.dm @@ -1,59 +1,62 @@ -//Thing meant for allowing datums and objects to access a NTnet network datum. -/datum/proc/ntnet_recieve(datum/netdata/data) - return - -/datum/proc/ntnet_send(datum/netdata/data, netid) - GET_COMPONENT(NIC, /datum/component/ntnet_interface) - if(!NIC) - return FALSE - return NIC.__network_send(data, netid) - -/datum/component/ntnet_interface - var/hardware_id //text - var/network_name = "" //text - var/list/networks_connected_by_id = list() //id = datum/ntnet - -/datum/component/ntnet_interface/Initialize(force_ID, force_name = "NTNet Device", autoconnect_station_network = TRUE) //Don't force ID unless you know what you're doing! - if(!force_ID) - hardware_id = "[SSnetworks.assignment_hardware_id++]" - else - hardware_id = force_ID - network_name = force_name - SSnetworks.register_interface(src) - if(autoconnect_station_network) - register_connection(SSnetworks.station_network) - -/datum/component/ntnet_interface/Destroy() - unregister_all_connections() - SSnetworks.unregister_interface(src) - return ..() - -/datum/component/ntnet_interface/proc/__network_recieve(datum/netdata/data) //Do not directly proccall! - parent.SendSignal(COMSIG_COMPONENT_NTNET_RECIEVE, data) - parent.ntnet_recieve(data) - -/datum/component/ntnet_interface/proc/__network_send(datum/netdata/data, netid) //Do not directly proccall! - if(netid) - if(networks_connected_by_id[netid]) - var/datum/ntnet/net = networks_connected_by_id[netid] - return net.process_data_transmit(src, data) - return FALSE - for(var/i in networks_connected_by_id) - var/datum/ntnet/net = networks_connected_by_id[i] - net.process_data_transmit(src, data) - return TRUE - -/datum/component/ntnet_interface/proc/register_connection(datum/ntnet/net) - if(net.interface_connect(src)) - networks_connected_by_id[net.network_id] = net - return TRUE - -/datum/component/ntnet_interface/proc/unregister_all_connections() - for(var/i in networks_connected_by_id) - unregister_connection(networks_connected_by_id[i]) - return TRUE - -/datum/component/ntnet_interface/proc/unregister_connection(datum/ntnet/net) - net.interface_disconnect(src) - networks_connected_by_id -= net.network_id - return TRUE +//Thing meant for allowing datums and objects to access a NTnet network datum. +/datum/proc/ntnet_recieve(datum/netdata/data) + return + +/datum/proc/ntnet_send(datum/netdata/data, netid) + GET_COMPONENT(NIC, /datum/component/ntnet_interface) + if(!NIC) + return FALSE + return NIC.__network_send(data, netid) + +/datum/component/ntnet_interface + var/hardware_id //text + var/network_name = "" //text + var/list/networks_connected_by_id = list() //id = datum/ntnet + +/datum/component/ntnet_interface/Initialize(force_ID, force_name = "NTNet Device", autoconnect_station_network = TRUE) //Don't force ID unless you know what you're doing! + if(!force_ID) + hardware_id = "[SSnetworks.assignment_hardware_id++]" + else + hardware_id = force_ID + network_name = force_name + SSnetworks.register_interface(src) + if(autoconnect_station_network) + register_connection(SSnetworks.station_network) + +/datum/component/ntnet_interface/Destroy() + unregister_all_connections() + SSnetworks.unregister_interface(src) + return ..() + +/datum/component/ntnet_interface/proc/__network_recieve(datum/netdata/data) //Do not directly proccall! + parent.SendSignal(COMSIG_COMPONENT_NTNET_RECIEVE, data) + parent.ntnet_recieve(data) + +/datum/component/ntnet_interface/proc/__network_send(datum/netdata/data, netid) //Do not directly proccall! + // Process data before sending it + data.pre_send(src) + + if(netid) + if(networks_connected_by_id[netid]) + var/datum/ntnet/net = networks_connected_by_id[netid] + return net.process_data_transmit(src, data) + return FALSE + for(var/i in networks_connected_by_id) + var/datum/ntnet/net = networks_connected_by_id[i] + net.process_data_transmit(src, data) + return TRUE + +/datum/component/ntnet_interface/proc/register_connection(datum/ntnet/net) + if(net.interface_connect(src)) + networks_connected_by_id[net.network_id] = net + return TRUE + +/datum/component/ntnet_interface/proc/unregister_all_connections() + for(var/i in networks_connected_by_id) + unregister_connection(networks_connected_by_id[i]) + return TRUE + +/datum/component/ntnet_interface/proc/unregister_connection(datum/ntnet/net) + net.interface_disconnect(src) + networks_connected_by_id -= net.network_id + return TRUE diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index ffc20cc9cb..c302059324 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -1,17 +1,17 @@ -/mob/proc/HasDisease(datum/disease/D) - for(var/thing in viruses) +/mob/living/proc/HasDisease(datum/disease/D) + for(var/thing in diseases) var/datum/disease/DD = thing if(D.IsSame(DD)) return TRUE return FALSE -/mob/proc/CanContractDisease(datum/disease/D) +/mob/living/proc/CanContractDisease(datum/disease/D) if(stat == DEAD) return FALSE - if(D.GetDiseaseID() in resistances) + if(D.GetDiseaseID() in disease_resistances) return FALSE if(HasDisease(D)) @@ -23,38 +23,10 @@ return TRUE -/mob/proc/ContactContractDisease(datum/disease/D) +/mob/living/proc/ContactContractDisease(datum/disease/D) if(!CanContractDisease(D)) return FALSE - AddDisease(D) - - -/mob/proc/AddDisease(datum/disease/D) - for(var/datum/disease/advance/P in viruses) - if(istype(D, /datum/disease/advance)) - var/datum/disease/advance/DD = D - if (P.totalResistance() < DD.totalTransmittable()) //Overwrite virus if the attacker's Transmission is lower than the defender's Resistance. This does not grant immunity to the lost virus. - P.remove_virus() - - if (!viruses.len) //Only add the new virus if it defeated the existing one - var/datum/disease/DD = new D.type(1, D, 0) - viruses += DD - DD.affected_mob = src - SSdisease.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed. - - //Copy properties over. This is so edited diseases persist. - var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed","symptoms","processing") - for(var/V in DD.vars) - if(V in skipped) - continue - if(islist(DD.vars[V])) - var/list/L = D.vars[V] - DD.vars[V] = L.Copy() - else - DD.vars[V] = D.vars[V] - - DD.after_add() - DD.affected_mob.med_hud_set_status() + D.try_infect(src) /mob/living/carbon/ContactContractDisease(datum/disease/D, target_zone) @@ -124,34 +96,36 @@ passed = prob((Cl.permeability_coefficient*100) - 1) if(passed) - AddDisease(D) + D.try_infect(src) -/mob/proc/AirborneContractDisease(datum/disease/D) - if((D.spread_flags & VIRUS_SPREAD_AIRBORNE) && prob((50*D.permeability_mod) - 1)) +/mob/living/proc/AirborneContractDisease(datum/disease/D, force_spread) + if( ((D.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob((50*D.permeability_mod) - 1)) ForceContractDisease(D) -/mob/living/carbon/AirborneContractDisease(datum/disease/D) +/mob/living/carbon/AirborneContractDisease(datum/disease/D, force_spread) if(internal) return - ..() - -/mob/living/carbon/human/AirborneContractDisease(datum/disease/D) - if(dna && (NOBREATH in dna.species.species_traits)) + if(has_trait(TRAIT_NOBREATH)) return ..() -//Proc to use when you 100% want to infect someone, as long as they aren't immune -/mob/proc/ForceContractDisease(datum/disease/D) +//Proc to use when you 100% want to try to infect someone (ignoreing protective clothing and such), as long as they aren't immune +/mob/living/proc/ForceContractDisease(datum/disease/D, make_copy = TRUE, del_on_fail = FALSE) if(!CanContractDisease(D)) + if(del_on_fail) + qdel(D) return FALSE - AddDisease(D) + if(!D.try_infect(src, make_copy)) + if(del_on_fail) + qdel(D) + return FALSE + return TRUE /mob/living/carbon/human/CanContractDisease(datum/disease/D) - if(dna) - if((VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity) + if(has_trait(TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity) return FALSE var/can_infect = FALSE @@ -165,4 +139,4 @@ for(var/thing in D.required_organs) if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) return FALSE - return ..() \ No newline at end of file + return ..() diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 5d49d7a523..614cd14abb 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -2,7 +2,7 @@ //Flags var/visibility_flags = 0 var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST - var/spread_flags = VIRUS_SPREAD_AIRBORNE | VIRUS_SPREAD_CONTACT_FLUIDS | VIRUS_SPREAD_CONTACT_SKIN + var/spread_flags = DISEASE_SPREAD_AIRBORNE | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN //Fluff var/form = "Virus" @@ -26,7 +26,7 @@ var/carrier = FALSE //If our host is only a carrier var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses var/permeability_mod = 1 - var/severity = VIRUS_SEVERITY_POSITIVE + var/severity = DISEASE_SEVERITY_NONTHREAT var/list/required_organs = list() var/needs_all_cures = TRUE var/list/strain_data = list() //dna_spread special bullshit @@ -34,9 +34,27 @@ var/process_dead = FALSE //if this ticks while the host is dead /datum/disease/Destroy() - affected_mob = null + . = ..() + if(affected_mob) + remove_disease() SSdisease.active_diseases.Remove(src) - return ..() + +//add this disease if the host does not already have too many +/datum/disease/proc/try_infect(var/mob/living/infectee, make_copy = TRUE) + if(infectee.diseases.len < DISEASE_LIMIT) + infect(infectee, make_copy) + return TRUE + return FALSE + +//add the disease with no checks +/datum/disease/proc/infect(var/mob/living/infectee, make_copy = TRUE) + var/datum/disease/D = make_copy ? Copy() : src + infectee.diseases += D + D.affected_mob = infectee + SSdisease.active_diseases += D //Add it to the active diseases list, now that it's actually in a mob and being processed. + + D.after_add() + infectee.med_hud_set_status() /datum/disease/proc/stage_act() var/cure = has_cure() @@ -74,7 +92,7 @@ if(!affected_mob) return - if(!(spread_flags & VIRUS_SPREAD_AIRBORNE) && !force_spread) + if(!(spread_flags & DISEASE_SPREAD_AIRBORNE) && !force_spread) return if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) @@ -89,24 +107,25 @@ if(istype(T)) for(var/mob/living/carbon/C in oview(spread_range, affected_mob)) var/turf/V = get_turf(C) - if(V) - while(TRUE) - if(V == T) - C.AirborneContractDisease(src) - break - var/turf/Temp = get_step_towards(V, T) - if(!CANATMOSPASS(V, Temp)) - break - V = Temp + if(disease_air_spread_walk(T, V)) + C.AirborneContractDisease(src, force_spread) + +/proc/disease_air_spread_walk(turf/start, turf/end) + if(!start || !end) + return FALSE + while(TRUE) + if(end == start) + return TRUE + var/turf/Temp = get_step_towards(end, start) + if(!CANATMOSPASS(end, Temp)) + return FALSE + end = Temp /datum/disease/proc/cure(add_resistance = TRUE) if(affected_mob) - if(disease_flags & CAN_RESIST) - var/id = GetDiseaseID() - if(add_resistance && !(id in affected_mob.resistances)) - affected_mob.resistances += id - remove_virus() + if(add_resistance && (disease_flags & CAN_RESIST)) + affected_mob.disease_resistances |= GetDiseaseID() qdel(src) /datum/disease/proc/IsSame(datum/disease/D) @@ -116,8 +135,19 @@ /datum/disease/proc/Copy() + //note that stage is not copied over - the copy starts over at stage 1 + var/static/list/copy_vars = list("name", "visibility_flags", "disease_flags", "spread_flags", "form", "desc", "agent", "spread_text", + "cure_text", "max_stages", "stage_prob", "viable_mobtypes", "cures", "infectivity", "cure_chance", + "bypasses_immunity", "permeability_mod", "severity", "required_organs", "needs_all_cures", "strain_data", + "infectable_hosts", "process_dead") + var/datum/disease/D = new type() - D.strain_data = strain_data.Copy() + for(var/V in copy_vars) + var/val = vars[V] + if(islist(val)) + var/list/L = val + val = L.Copy() + D.vars[V] = val return D /datum/disease/proc/after_add() @@ -127,7 +157,7 @@ /datum/disease/proc/GetDiseaseID() return "[type]" -//don't use this proc directly. this should only ever be called by cure() -/datum/disease/proc/remove_virus() - affected_mob.viruses -= src //remove the datum from the list +/datum/disease/proc/remove_disease() + affected_mob.diseases -= src //remove the datum from the list affected_mob.med_hud_set_status() + affected_mob = null diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index d2ded9f907..67eb33277a 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -7,7 +7,6 @@ */ -#define SYMPTOM_LIMIT 6 @@ -31,6 +30,7 @@ var/list/symptoms = list() // The symptoms of the disease. var/id = "" var/processing = FALSE + var/mutable = TRUE //set to FALSE to prevent most in-game methods of altering the disease via virology // The order goes from easy to cure to hard to cure. var/static/list/advance_cures = list( @@ -46,23 +46,8 @@ */ -/datum/disease/advance/New(var/process = 1, var/datum/disease/advance/D) - if(!istype(D)) - D = null - // Generate symptoms if we weren't given any. - - if(!symptoms || !symptoms.len) - - if(!D || !D.symptoms || !D.symptoms.len) - symptoms = GenerateSymptoms(0, 2) - else - for(var/datum/symptom/S in D.symptoms) - var/datum/symptom/new_symp = S.Copy() - symptoms += new_symp - +/datum/disease/advance/New() Refresh() - ..(process, D) - return /datum/disease/advance/Destroy() if(processing) @@ -70,6 +55,26 @@ S.End(src) return ..() +/datum/disease/advance/try_infect(var/mob/living/infectee, make_copy = TRUE) + var/replace_num = infectee.diseases.len + 1 - DISEASE_LIMIT + if(replace_num > 0) + //see if we are more transmittable than enough diseases to replace them + //diseases replaced in this way do not confer immunity + var/list/L = list() + for(var/datum/disease/advance/P in infectee.diseases) + L += P + sortTim(L, /proc/cmp_advdisease_resistance_asc) + var/datum/disease/advance/competition = L[replace_num] + if(totalTransmittable() > competition.totalResistance()) + for(var/i in 1 to replace_num) + var/datum/disease/advance/A = L[replace_num] + A.cure(FALSE) + else + //we are not strong enough to bully our way in + return FALSE + infect(infectee, make_copy) + return TRUE + // Randomly pick a symptom to activate. /datum/disease/advance/stage_act() ..() @@ -85,8 +90,6 @@ for(var/datum/symptom/S in symptoms) S.Activate(src) - else - CRASH("We do not have any symptoms during stage_act()!") // Compares type then ID. /datum/disease/advance/IsSame(datum/disease/advance/D) @@ -99,8 +102,16 @@ return 1 // Returns the advance disease with a different reference memory. -/datum/disease/advance/Copy(process = 0) - return new /datum/disease/advance(process, src, 1) +/datum/disease/advance/Copy() + var/datum/disease/advance/A = ..() + QDEL_LIST(A.symptoms) + for(var/datum/symptom/S in symptoms) + A.symptoms += S.Copy() + A.properties = properties.Copy() + A.id = id + A.mutable = mutable + //this is a new disease starting over at stage 1, so processing is not copied + return A /* @@ -130,7 +141,7 @@ var/list/possible_symptoms = list() for(var/symp in SSdisease.list_symptoms) var/datum/symptom/S = new symp - if(S.level >= level_min && S.level <= level_max) + if(S.naturally_occuring && S.level >= level_min && S.level <= level_max) if(!HasSymptom(S)) possible_symptoms += S @@ -154,22 +165,15 @@ AssignProperties() id = null - if(!SSdisease.archive_diseases[GetDiseaseID()]) + var/the_id = GetDiseaseID() + if(!SSdisease.archive_diseases[the_id]) + SSdisease.archive_diseases[the_id] = src // So we don't infinite loop + SSdisease.archive_diseases[the_id] = Copy() if(new_name) AssignName() - SSdisease.archive_diseases[GetDiseaseID()] = src // So we don't infinite loop - SSdisease.archive_diseases[GetDiseaseID()] = new /datum/disease/advance(0, src, 1) - - var/datum/disease/advance/A = SSdisease.archive_diseases[GetDiseaseID()] - AssignName(A.name) //Generate disease properties based on the effects. Returns an associated list. /datum/disease/advance/proc/GenerateProperties() - - if(!symptoms || !symptoms.len) - CRASH("We did not have any symptoms before generating properties.") - return - properties = list("resistance" = 0, "stealth" = 0, "stage_rate" = 0, "transmittable" = 0, "severity" = 0) for(var/datum/symptom/S in symptoms) @@ -179,7 +183,6 @@ properties["transmittable"] += S.transmittable if(!S.neutered) properties["severity"] = max(properties["severity"], S.severity) // severity is based on the highest severity non-neutered symptom - return // Assign the properties that are in the list. /datum/disease/advance/proc/AssignProperties() @@ -188,7 +191,7 @@ if(properties["stealth"] >= 2) visibility_flags = HIDDEN_SCANNER - SetSpread(CLAMP(2 ** (properties["transmittable"] - symptoms.len), VIRUS_SPREAD_BLOOD, VIRUS_SPREAD_AIRBORNE)) + SetSpread(CLAMP(2 ** (properties["transmittable"] - symptoms.len), DISEASE_SPREAD_BLOOD, DISEASE_SPREAD_AIRBORNE)) permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) cure_chance = 15 - CLAMP(properties["resistance"], -5, 5) // can be between 10 and 20 @@ -202,23 +205,23 @@ // Assign the spread type and give it the correct description. /datum/disease/advance/proc/SetSpread(spread_id) switch(spread_id) - if(VIRUS_SPREAD_NON_CONTAGIOUS) - spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS + if(DISEASE_SPREAD_NON_CONTAGIOUS) + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS spread_text = "None" - if(VIRUS_SPREAD_SPECIAL) - spread_flags = VIRUS_SPREAD_SPECIAL + if(DISEASE_SPREAD_SPECIAL) + spread_flags = DISEASE_SPREAD_SPECIAL spread_text = "None" - if(VIRUS_SPREAD_BLOOD) - spread_flags = VIRUS_SPREAD_BLOOD + if(DISEASE_SPREAD_BLOOD) + spread_flags = DISEASE_SPREAD_BLOOD spread_text = "Blood" - if(VIRUS_SPREAD_CONTACT_FLUIDS) - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_FLUIDS + if(DISEASE_SPREAD_CONTACT_FLUIDS) + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_FLUIDS spread_text = "Fluids" - if(VIRUS_SPREAD_CONTACT_SKIN) - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_FLUIDS | VIRUS_SPREAD_CONTACT_SKIN + if(DISEASE_SPREAD_CONTACT_SKIN) + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN spread_text = "On contact" - if(VIRUS_SPREAD_AIRBORNE) - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_FLUIDS | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_AIRBORNE + if(DISEASE_SPREAD_AIRBORNE) + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_AIRBORNE spread_text = "Airborne" /datum/disease/advance/proc/SetSeverity(level_sev) @@ -226,19 +229,19 @@ switch(level_sev) if(-INFINITY to 0) - severity = VIRUS_SEVERITY_POSITIVE + severity = DISEASE_SEVERITY_POSITIVE if(1) - severity = VIRUS_SEVERITY_NONTHREAT + severity = DISEASE_SEVERITY_NONTHREAT if(2) - severity = VIRUS_SEVERITY_MINOR + severity = DISEASE_SEVERITY_MINOR if(3) - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM if(4) - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL if(5) - severity = VIRUS_SEVERITY_DANGEROUS + severity = DISEASE_SEVERITY_DANGEROUS if(6 to INFINITY) - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD else severity = "Unknown" @@ -253,11 +256,10 @@ var/datum/reagent/D = GLOB.chemical_reagents_list[cures[1]] cure_text = D.name - - return - // Randomly generate a symptom, has a chance to lose or gain a symptom. -/datum/disease/advance/proc/Evolve(min_level, max_level) +/datum/disease/advance/proc/Evolve(min_level, max_level, ignore_mutable = FALSE) + if(!mutable && !ignore_mutable) + return var/s = safepick(GenerateSymptoms(min_level, max_level, 1)) if(s) AddSymptom(s) @@ -265,27 +267,32 @@ return // Randomly remove a symptom. -/datum/disease/advance/proc/Devolve() +/datum/disease/advance/proc/Devolve(ignore_mutable = FALSE) + if(!mutable && !ignore_mutable) + return if(symptoms.len > 1) var/s = safepick(symptoms) if(s) RemoveSymptom(s) Refresh(TRUE) - return // Randomly neuter a symptom. -/datum/disease/advance/proc/Neuter() +/datum/disease/advance/proc/Neuter(ignore_mutable = FALSE) + if(!mutable && !ignore_mutable) + return if(symptoms.len) var/s = safepick(symptoms) if(s) NeuterSymptom(s) Refresh(TRUE) - return // Name the disease. /datum/disease/advance/proc/AssignName(name = "Unknown") - src.name = name - return + Refresh() + var/datum/disease/advance/A = SSdisease.archive_diseases[GetDiseaseID()] + A.name = name + for(var/datum/disease/advance/AD in SSdisease.active_diseases) + AD.Refresh() // Return a unique ID of the disease. /datum/disease/advance/GetDiseaseID() @@ -309,17 +316,15 @@ if(HasSymptom(S)) return - if(symptoms.len < (SYMPTOM_LIMIT - 1) + rand(-1, 1)) + if(symptoms.len < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1)) symptoms += S else RemoveSymptom(pick(symptoms)) symptoms += S - return // Simply removes the symptom. /datum/disease/advance/proc/RemoveSymptom(datum/symptom/S) symptoms -= S - return // Neuter a symptom, so it will only affect stats /datum/disease/advance/proc/NeuterSymptom(datum/symptom/S) @@ -377,7 +382,7 @@ if(!user) return - var/i = SYMPTOM_LIMIT + var/i = VIRUS_SYMPTOM_LIMIT var/datum/disease/advance/D = new(0, null) D.symptoms = list() @@ -434,5 +439,3 @@ /datum/disease/advance/proc/totalTransmittable() return properties["transmittable"] - -#undef RANDOM_STARTING_LEVEL diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm index d2f6a73365..9574338b51 100644 --- a/code/datums/diseases/advance/presets.dm +++ b/code/datums/diseases/advance/presets.dm @@ -1,59 +1,52 @@ // Cold -/datum/disease/advance/cold/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Cold" - symptoms = list(new/datum/symptom/sneeze) - ..(process, D, copy) +/datum/disease/advance/cold/New() + name = "Cold" + symptoms = list(new/datum/symptom/sneeze) + ..() // Flu -/datum/disease/advance/flu/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Flu" - symptoms = list(new/datum/symptom/cough) - ..(process, D, copy) +/datum/disease/advance/flu/New() + name = "Flu" + symptoms = list(new/datum/symptom/cough) + ..() // Voice Changing -/datum/disease/advance/voice_change/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Epiglottis Mutation" - symptoms = list(new/datum/symptom/voice_change) - ..(process, D, copy) +/datum/disease/advance/voice_change/New() + name = "Epiglottis Mutation" + symptoms = list(new/datum/symptom/voice_change) + ..() // Toxin Filter -/datum/disease/advance/heal/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Liver Enhancer" - symptoms = list(new/datum/symptom/heal) - ..(process, D, copy) +/datum/disease/advance/heal/New() + name = "Liver Enhancer" + symptoms = list(new/datum/symptom/heal) + ..() // Hallucigen -/datum/disease/advance/hallucigen/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Second Sight" - symptoms = list(new/datum/symptom/hallucigen) - ..(process, D, copy) +/datum/disease/advance/hallucigen/New() + name = "Second Sight" + symptoms = list(new/datum/symptom/hallucigen) + ..() // Sensory Restoration -/datum/disease/advance/mind_restoration/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Intelligence Booster" - symptoms = list(new/datum/symptom/mind_restoration) - ..(process, D, copy) +/datum/disease/advance/mind_restoration/New() + name = "Intelligence Booster" + symptoms = list(new/datum/symptom/mind_restoration) + ..() // Sensory Destruction -/datum/disease/advance/narcolepsy/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Experimental Insomnia Cure" - symptoms = list(new/datum/symptom/narcolepsy) - ..(process, D, copy) \ No newline at end of file +/datum/disease/advance/narcolepsy/New() + name = "Experimental Insomnia Cure" + symptoms = list(new/datum/symptom/narcolepsy) + ..() \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index 323f794eee..1633b41352 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -40,7 +40,7 @@ BONUS return if(A.properties["stealth"] >= 4) suppress_warning = TRUE - if(A.spread_flags &= VIRUS_SPREAD_AIRBORNE) //infect bystanders + if(A.spread_flags &= DISEASE_SPREAD_AIRBORNE) //infect bystanders infective = TRUE if(A.properties["resistance"] >= 3) //strong enough to drop items power = 1.5 diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index 84e5884ffb..e42b68cc05 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -28,6 +28,7 @@ //A neutered symptom has no effect, and only affects statistics. var/neutered = FALSE var/list/thresholds + var/naturally_occuring = TRUE //if this symptom can appear from /datum/disease/advance/GenerateSymptoms() /datum/symptom/New() var/list/S = SSdisease.list_symptoms diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm index 4673d2e980..2d96157bb0 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/anxiety.dm @@ -3,13 +3,13 @@ form = "Infection" max_stages = 4 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Ethanol" cures = list("ethanol") agent = "Excess Lepidopticides" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated subject will regurgitate butterflies." - severity = VIRUS_SEVERITY_MINOR + severity = DISEASE_SEVERITY_MINOR /datum/disease/anxiety/stage_act() ..() diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 61d1519e7d..5708447542 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -7,9 +7,9 @@ viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 1 desc = "If left untreated the subject will become very weak, and may vomit often." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM disease_flags = CAN_CARRY|CAN_RESIST - spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/appendix) bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index dc848ab622..f6504fa464 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -3,13 +3,13 @@ form = "Infection" max_stages = 4 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Sugar" cures = list("sugar") agent = "Apidae Infection" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated subject will regurgitate bees." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM infectable_hosts = list(SPECIES_ORGANIC, SPECIES_UNDEAD) //bees nesting in corpses /datum/disease/beesease/stage_act() diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 49f8afcaff..0a34501763 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -2,7 +2,7 @@ name = "Brainrot" max_stages = 4 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Mannitol" cures = list("mannitol") agent = "Cryptococcus Cosmosis" @@ -10,7 +10,7 @@ cure_chance = 15//higher chance to cure, since two reagents are required desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." required_organs = list(/obj/item/organ/brain) - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL /datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR ..() diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index e9f02b91b6..22d45ffb29 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -7,7 +7,7 @@ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) permeability_mod = 0.5 desc = "If left untreated the subject will contract the flu." - severity = VIRUS_SEVERITY_NONTHREAT + severity = DISEASE_SEVERITY_NONTHREAT /datum/disease/cold/stage_act() ..() @@ -47,7 +47,7 @@ if(prob(1)) to_chat(affected_mob, "Mucous runs down the back of your throat.") if(prob(1) && prob(50)) - if(!affected_mob.resistances.Find(/datum/disease/flu)) - var/datum/disease/Flu = new /datum/disease/flu(0) - affected_mob.ForceContractDisease(Flu) + if(!affected_mob.disease_resistances.Find(/datum/disease/flu)) + var/datum/disease/Flu = new /datum/disease/flu() + affected_mob.ForceContractDisease(Flu, FALSE, TRUE) cure() \ No newline at end of file diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index c68ee196c1..da5e67a4fb 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -2,13 +2,13 @@ name = "The Cold" max_stages = 3 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Common Cold Anti-bodies & Spaceacillin" cures = list("spaceacillin") agent = "ICE9-rhinovirus" viable_mobtypes = list(/mob/living/carbon/human) desc = "If left untreated the subject will slow, as if partly frozen." - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL /datum/disease/cold9/stage_act() ..() diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index fefdabd9c8..267dd711a3 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -2,7 +2,7 @@ name = "Space Retrovirus" max_stages = 4 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Mutadone" cures = list("mutadone") disease_flags = CAN_CARRY|CAN_RESIST|CURABLE @@ -11,7 +11,7 @@ var/datum/dna/original_dna = null var/transformed = 0 desc = "This disease transplants the genetic code of the initial vector into new hosts." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM /datum/disease/dnaspread/stage_act() diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm index e62a8b491d..add60c73f1 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/fake_gbs.dm @@ -2,13 +2,13 @@ name = "GBS" max_stages = 5 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Synaptizine & Sulfur" cures = list("synaptizine","sulfur") agent = "Gravitokinetic Bipotential SADS-" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated death will occur." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD /datum/disease/fake_gbs/stage_act() ..() diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 206b61fb35..e1943937ba 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) permeability_mod = 0.75 desc = "If left untreated the subject will feel quite unwell." - severity = VIRUS_SEVERITY_MINOR + severity = DISEASE_SEVERITY_MINOR /datum/disease/flu/stage_act() ..() diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index 22787cc23a..9577ca43d0 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 0.75 desc = "If left untreated the subject will burn to death for being a heretic." - severity = VIRUS_SEVERITY_DANGEROUS + severity = DISEASE_SEVERITY_DANGEROUS /datum/disease/fluspanish/stage_act() ..() diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 6d77acd3ae..0487b1c815 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -2,7 +2,7 @@ name = "GBS" max_stages = 4 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Synaptizine & Sulfur" cures = list("synaptizine","sulfur") cure_chance = 15//higher chance to cure, since two reagents are required @@ -10,7 +10,7 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CAN_CARRY|CAN_RESIST|CURABLE permeability_mod = 1 - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD /datum/disease/gbs/stage_act() ..() diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm index 06687cc12d..a9adf39812 100644 --- a/code/datums/diseases/heart_failure.dm +++ b/code/datums/diseases/heart_failure.dm @@ -10,12 +10,17 @@ desc = "If left untreated the subject will die!" severity = "Dangerous!" disease_flags = CAN_CARRY|CAN_RESIST - spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/heart) bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus var/sound = FALSE +/datum/disease/heart_failure/Copy() + var/datum/disease/heart_failure/D = ..() + D.sound = sound + return D + /datum/disease/heart_failure/stage_act() ..() var/obj/item/organ/heart/O = affected_mob.getorgan(/obj/item/organ/heart) diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index 91ce1ca71e..13959e9bda 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -9,7 +9,7 @@ disease_flags = CAN_CARRY|CAN_RESIST|CURABLE permeability_mod = 0.75 desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM infectable_hosts = list(SPECIES_ORGANIC, SPECIES_ROBOTIC) process_dead = TRUE diff --git a/code/datums/diseases/parrotpossession.dm b/code/datums/diseases/parrotpossession.dm index 284c3bd7f2..4fe0dc21b0 100644 --- a/code/datums/diseases/parrotpossession.dm +++ b/code/datums/diseases/parrotpossession.dm @@ -2,7 +2,7 @@ name = "Parrot Possession" max_stages = 1 spread_text = "Paranormal" - spread_flags = VIRUS_SPREAD_SPECIAL + spread_flags = DISEASE_SPREAD_SPECIAL disease_flags = CURABLE cure_text = "Holy Water." cures = list("holywater") @@ -10,7 +10,7 @@ agent = "Avian Vengence" viable_mobtypes = list(/mob/living/carbon/human) desc = "Subject is possesed by the vengeful spirit of a parrot. Call the priest." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM infectable_hosts = list(SPECIES_ORGANIC, SPECIES_UNDEAD, SPECIES_INORGANIC, SPECIES_ROBOTIC) bypasses_immunity = TRUE //2spook var/mob/living/simple_animal/parrot/Poly/ghost/parrot diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 89dce44536..8f13d2e2fa 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 0.75 desc = "If left untreated the subject will probably drive others to insanity." - severity = VIRUS_SEVERITY_MEDIUM + severity = DISEASE_SEVERITY_MEDIUM /datum/disease/pierrot_throat/stage_act() ..() diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index ae5fa9655f..fe099e495b 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -2,20 +2,17 @@ name = "Retrovirus" max_stages = 4 spread_text = "Contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Rest or an injection of mutadone" cure_chance = 6 agent = "" viable_mobtypes = list(/mob/living/carbon/human) desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly." - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL permeability_mod = 0.4 stage_prob = 2 - var/SE - var/UI var/restcure = 0 - /datum/disease/dna_retrovirus/New() ..() agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]" @@ -24,6 +21,10 @@ else restcure = 1 +/datum/disease/dna_retrovirus/Copy() + var/datum/disease/dna_retrovirus/D = ..() + D.restcure = restcure + return D /datum/disease/dna_retrovirus/stage_act() ..() diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 8217364fb5..1aee35741a 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -2,13 +2,13 @@ name = "The Rhumba Beat" max_stages = 5 spread_text = "On contact" - spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS + spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Chick Chicky Boom!" cures = list("plasma") agent = "Unknown" viable_mobtypes = list(/mob/living/carbon/human) permeability_mod = 1 - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD process_dead = TRUE /datum/disease/rhumba_beat/stage_act() diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 17aebc4629..db88bd6777 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -2,11 +2,11 @@ name = "Transformation" max_stages = 5 spread_text = "Acute" - spread_flags = VIRUS_SPREAD_SPECIAL + spread_flags = DISEASE_SPREAD_SPECIAL cure_text = "A coder's love (theoretical)." agent = "Shenanigans" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey, /mob/living/carbon/alien) - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD stage_prob = 10 visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC disease_flags = CURABLE @@ -17,6 +17,16 @@ var/list/stage5 = list("Oh the humanity!") var/new_form = /mob/living/carbon/human +/datum/disease/transformation/Copy() + var/datum/disease/transformation/D = ..() + D.stage1 = stage1.Copy() + D.stage2 = stage2.Copy() + D.stage3 = stage3.Copy() + D.stage4 = stage4.Copy() + D.stage5 = stage5.Copy() + D.new_form = D.new_form + return D + /datum/disease/transformation/stage_act() ..() switch(stage) @@ -68,13 +78,13 @@ cure_text = "Death." cures = list("adminordrazine") spread_text = "Monkey Bites" - spread_flags = VIRUS_SPREAD_SPECIAL + spread_flags = DISEASE_SPREAD_SPECIAL viable_mobtypes = list(/mob/living/carbon/monkey, /mob/living/carbon/human) permeability_mod = 1 cure_chance = 1 disease_flags = CAN_CARRY|CAN_RESIST desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD stage_prob = 4 visibility_flags = 0 agent = "Kongey Vibrion M-909" @@ -131,7 +141,7 @@ cure_chance = 5 agent = "R2D2 Nanomachines" desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = null stage2 = list("Your joints feel stiff.", "Beep...boop..") @@ -163,7 +173,7 @@ cure_chance = 5 agent = "Rip-LEY Alien Microbes" desc = "This disease changes the victim into a xenomorph." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = null stage2 = list("Your throat feels scratchy.", "Kill...") @@ -191,7 +201,7 @@ cure_chance = 80 agent = "Advanced Mutation Toxin" desc = "This highly concentrated extract converts anything into more of itself." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = list("You don't feel very well.") stage2 = list("Your skin feels a little slimy.") @@ -219,7 +229,7 @@ cures = list("adminordrazine") agent = "Fell Doge Majicks" desc = "This disease transforms the victim into a corgi." - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = list("BARK.") stage2 = list("You feel the need to wear silly hats.") @@ -245,7 +255,7 @@ agent = "Gluttony's Blessing" desc = "A 'gift' from somewhere terrible." stage_prob = 20 - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = list("Your stomach rumbles.") stage2 = list("Your skin feels saggy.") diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index c8524fd038..e413891e75 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -10,7 +10,7 @@ cure_chance = 5//like hell are you getting out of hell desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." required_organs = list(/obj/item/organ/lungs) - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing. /datum/disease/tuberculosis/stage_act() //it begins diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index 612418b1ca..cfc848000b 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -10,7 +10,7 @@ disease_flags = CAN_CARRY|CAN_RESIST|CURABLE permeability_mod = 0.75 desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. Subjects affected show the signs of mental retardation, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition." - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL required_organs = list(/obj/item/bodypart/head) /* diff --git a/code/datums/ert.dm b/code/datums/ert.dm new file mode 100644 index 0000000000..d3c256308d --- /dev/null +++ b/code/datums/ert.dm @@ -0,0 +1,55 @@ +/datum/ert + var/mobtype = /mob/living/carbon/human + var/team = /datum/team/ert + var/opendoors = TRUE + var/leader_role = /datum/antagonist/ert/commander + var/enforce_human = TRUE + var/roles = list(/datum/antagonist/ert/security, /datum/antagonist/ert/medic, /datum/antagonist/ert/engineer) //List of possible roles to be assigned to ERT members. + var/rename_team + var/code + var/mission = "Assist the station." + var/teamsize = 5 + var/polldesc + +/datum/ert/New() + if (!polldesc) + polldesc = "a Code [code] Nanotrasen Emergency Response Team" + +/datum/ert/blue + opendoors = FALSE + code = "Blue" + +/datum/ert/amber + code = "Amber" + +/datum/ert/red + leader_role = /datum/antagonist/ert/commander/red + roles = list(/datum/antagonist/ert/security/red, /datum/antagonist/ert/medic/red, /datum/antagonist/ert/engineer/red) + code = "Red" + +/datum/ert/deathsquad + roles = list(/datum/antagonist/ert/deathsquad) + leader_role = /datum/antagonist/ert/deathsquad/leader + rename_team = "Deathsquad" + code = "Delta" + mission = "Leave no witnesses." + polldesc = "an elite Nanotrasen Strike Team" + +/datum/ert/centcom_official + code = "Green" + teamsize = 1 + opendoors = FALSE + leader_role = /datum/antagonist/official + roles = list(/datum/antagonist/official) + rename_team = "CentCom Officials" + polldesc = "a CentCom Official" + +/datum/ert/centcom_official/New() + mission = "Conduct a routine performance review of [station_name()] and its Captain." + +/datum/ert/inquisition + roles = list(/datum/antagonist/ert/chaplain/inquisitor, /datum/antagonist/ert/security/inquisitor, /datum/antagonist/ert/medic/inquisitor) + leader_role = /datum/antagonist/ert/commander/inquisitor + rename_team = "Inquisition" + mission = "Destroy any traces of paranormal activity aboard the station." + polldesc = "a Nanotrasen paranormal response team" diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm deleted file mode 100644 index d457c60ade..0000000000 --- a/code/datums/helper_datums/construction_datum.dm +++ /dev/null @@ -1,104 +0,0 @@ -#define FORWARD 1 -#define BACKWARD -1 - -#define ITEM_DELETE "delete" -#define ITEM_MOVE_INSIDE "move_inside" - - -/datum/construction - var/list/steps - var/atom/holder - var/result - var/index = 1 - -/datum/construction/New(atom) - ..() - holder = atom - if(!holder) //don't want this without a holder - qdel(src) - update_holder(index) - -/datum/construction/proc/on_step() - if(index > steps.len) - spawn_result() - else - update_holder(index) - -/datum/construction/proc/action(obj/item/I, mob/living/user) - return check_step(I, user) - -/datum/construction/proc/update_index(diff) - index += diff - on_step() - -/datum/construction/proc/check_step(obj/item/I, mob/living/user) - var/diff = is_right_key(I) - if(diff && custom_action(I, user, diff)) - update_index(diff) - return TRUE - return FALSE - -/datum/construction/proc/is_right_key(obj/item/I) // returns index step - var/list/L = steps[index] - if(check_used_item(I, L["key"])) - return FORWARD //to the first step -> forward - else if(check_used_item(I, L["back_key"])) - return BACKWARD //to the last step -> backwards - return FALSE - -/datum/construction/proc/check_used_item(obj/item/I, key) - if(!key) - return FALSE - - if(ispath(key) && istype(I, key)) - return TRUE - - else if(I.tool_behaviour == key) - return TRUE - - return FALSE - -/datum/construction/proc/custom_action(obj/item/I, mob/living/user, diff) - return TRUE - -/datum/construction/proc/spawn_result() - if(result) - new result(drop_location()) - qdel(holder) - -/datum/construction/proc/update_holder(step_index) - var/list/step = steps[step_index] - - if(step["desc"]) - holder.desc = step["desc"] - - if(step["icon_state"]) - holder.icon_state = step["icon_state"] - -/datum/construction/proc/drop_location() - return holder.drop_location() - - - -// Unordered construction. -// Takes a list of part types, to be added in any order, as steps. -// Calls spawn_result() when every type has been added. -/datum/construction/unordered/check_step(obj/item/I, mob/living/user) - for(var/typepath in steps) - if(istype(I, typepath) && custom_action(I, user, typepath)) - steps -= typepath - on_step() - return TRUE - return FALSE - -/datum/construction/unordered/on_step() - if(!steps.len) - spawn_result() - else - update_holder(steps.len) - -/datum/construction/unordered/update_holder(steps_left) - return - -/datum/construction/unordered/custom_action(obj/item/I, mob/living/user, typepath) - return TRUE diff --git a/code/datums/hud.dm b/code/datums/hud.dm index fc6c09be14..54b28deeee 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -11,6 +11,7 @@ GLOBAL_LIST_INIT(huds, list( DATA_HUD_DIAGNOSTIC_BASIC = new/datum/atom_hud/data/diagnostic/basic(), DATA_HUD_DIAGNOSTIC_ADVANCED = new/datum/atom_hud/data/diagnostic/advanced(), DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(), + DATA_HUD_SENTIENT_DISEASE = new/datum/atom_hud/sentient_disease(), ANTAG_HUD_CULT = new/datum/atom_hud/antag(), ANTAG_HUD_REV = new/datum/atom_hud/antag(), ANTAG_HUD_OPS = new/datum/atom_hud/antag(), @@ -32,6 +33,9 @@ GLOBAL_LIST_INIT(huds, list( var/list/mob/hudusers = list() //list with all mobs who can see the hud var/list/hud_icons = list() //these will be the indexes for the atom's hud_list + var/list/next_time_allowed = list() //mobs associated with the next time this hud can be added to them + var/list/queued_to_see = list() //mobs that have triggered the cooldown and are queued to see the hud, but do not yet + /datum/atom_hud/New() GLOB.all_huds += src @@ -48,8 +52,11 @@ GLOBAL_LIST_INIT(huds, list( return if (!--hudusers[M]) hudusers -= M - for(var/atom/A in hudatoms) - remove_from_single_hud(M, A) + if(queued_to_see[M]) + queued_to_see -= M + else + for(var/atom/A in hudatoms) + remove_from_single_hud(M, A) /datum/atom_hud/proc/remove_from_hud(atom/A) if(!A) @@ -68,13 +75,26 @@ GLOBAL_LIST_INIT(huds, list( /datum/atom_hud/proc/add_hud_to(mob/M) if(!M) return - if (!hudusers[M]) + if(!hudusers[M]) hudusers[M] = 1 - for(var/atom/A in hudatoms) - add_to_single_hud(M, A) + if(next_time_allowed[M] > world.time) + if(!queued_to_see[M]) + addtimer(CALLBACK(src, .proc/show_hud_images_after_cooldown, M), next_time_allowed[M] - world.time) + queued_to_see[M] = TRUE + else + next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN + for(var/atom/A in hudatoms) + add_to_single_hud(M, A) else hudusers[M]++ +/datum/atom_hud/proc/show_hud_images_after_cooldown(M) + if(queued_to_see[M]) + queued_to_see -= M + next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN + for(var/atom/A in hudatoms) + add_to_single_hud(M, A) + /datum/atom_hud/proc/add_to_hud(atom/A) if(!A) return FALSE diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index a1061e4e77..aabcc19fcc 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -18,6 +18,8 @@ var/map_file = "BoxStation.dmm" var/traits = null + var/space_ruin_levels = 7 + var/space_empty_levels = 1 var/minetype = "lavaland" @@ -106,6 +108,20 @@ log_world("map_config traits is not a list!") return + var/temp = json["space_ruin_levels"] + if (isnum(temp)) + space_ruin_levels = temp + else if (!isnull(temp)) + log_world("map_config space_ruin_levels is not a number!") + return + + temp = json["space_empty_levels"] + if (isnum(temp)) + space_empty_levels = temp + else if (!isnull(temp)) + log_world("map_config space_empty_levels is not a number!") + return + if ("minetype" in json) minetype = json["minetype"] diff --git a/code/datums/martial/mushpunch.dm b/code/datums/martial/mushpunch.dm new file mode 100644 index 0000000000..6a6d4c3fb2 --- /dev/null +++ b/code/datums/martial/mushpunch.dm @@ -0,0 +1,36 @@ +/datum/martial_art/mushpunch + name = "Mushroom Punch" + +/datum/martial_art/mushpunch/basic_hit(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/atk_verb + to_chat(A, "You begin to wind up an attack...") + if(do_after(A, 25, target = D)) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + atk_verb = pick("punches", "smashes", "ruptures", "cracks") + D.visible_message("[A] [atk_verb] [D] with inhuman strength, sending [D.p_them()] flying backwards!", \ + "[A] [atk_verb] you with inhuman strength, sending you flying backwards!") + D.apply_damage(rand(15,30), BRUTE) + playsound(get_turf(D), 'sound/effects/meteorimpact.ogg', 25, 1, -1) + var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A))) + D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time. + D.Knockdown(20) + if(atk_verb) + add_logs(A, D, "[atk_verb] (Mushroom Punch)") + return TRUE + return FALSE + +/obj/item/mushpunch + name = "mysterious mushroom" + desc = "Sapienza Ophioglossoides:An odd mushroom from the flesh of a mushroom person. it has apparently retained some innate power of it's owner, as it quivers with barely-contained POWER!" + icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' + icon_state = "mycelium-angel" + +/obj/item/mushpunch/attack_self(mob/living/carbon/human/user) + if(!istype(user) || !user) + return + var/message = "You devour [src], and a confluence of skill and power from the mushroom enhances your punches! You do need a short moment to charge these powerful punches." + to_chat(user, message) + var/datum/martial_art/mushpunch/mush = new(null) + mush.teach(user) + qdel(src) + visible_message("[user] devours [src].") diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm new file mode 100644 index 0000000000..5d585ab6b2 --- /dev/null +++ b/code/datums/mood_events/drug_events.dm @@ -0,0 +1,39 @@ +/datum/mood_event/drugs/high + mood_change = 6 + description = "Woooow duudeeeeee...I'm tripping baaalls...\n" + +/datum/mood_event/drugs/smoked + description = "I have had a smoke recently.\n" + mood_change = 2 + timeout = 3600 + +/datum/mood_event/drugs/overdose + mood_change = -8 + timeout = 3000 + +/datum/mood_event/drugs/overdose/add_effects(drug_name) + description = "I think I took a bit too much of that [drug_name]\n" + +/datum/mood_event/drugs/withdrawal_light + mood_change = -2 + +/datum/mood_event/drugs/withdrawal_light/add_effects(drug_name) + description = "I could use some [drug_name]\n" + +/datum/mood_event/drugs/withdrawal_medium + mood_change = -5 + +/datum/mood_event/drugs/withdrawal_medium/add_effects(drug_name) + description = "I really need [drug_name]\n" + +/datum/mood_event/drugs/withdrawal_severe + mood_change = -8 + +/datum/mood_event/drugs/withdrawal_severe/add_effects(drug_name) + description = "Oh god I need some [drug_name]\n" + +/datum/mood_event/drugs/withdrawal_critical + mood_change = -10 + +/datum/mood_event/drugs/withdrawal_critical/add_effects(drug_name) + description = "[drug_name]! [drug_name]! [drug_name]!\n" diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm new file mode 100644 index 0000000000..786131b7fc --- /dev/null +++ b/code/datums/mood_events/generic_negative_events.dm @@ -0,0 +1,115 @@ +/datum/mood_event/handcuffed + description = "I guess my antics have finally caught up with me..\n" + mood_change = -1 + +/datum/mood_event/broken_vow //Used for when mimes break their vow of silence + description = "I have brought shame upon my name, and betrayed my fellow mimes by breaking our sacred vow...\n" + mood_change = -8 + +/datum/mood_event/on_fire + description = "I'M ON FIRE!!!\n" + mood_change = -8 + +/datum/mood_event/suffocation + description = "CAN'T... BREATHE...\n" + mood_change = -6 + +/datum/mood_event/burnt_thumb + description = "I shouldn't play with lighters...\n" + mood_change = -1 + timeout = 1200 + +/datum/mood_event/cold + description = "It's way too cold in here.\n" + mood_change = -2 + +/datum/mood_event/hot + description = "It's getting hot in here.\n" + mood_change = -2 + +/datum/mood_event/creampie + description = "I've been creamed. Tastes like pie flavor.\n" + mood_change = -2 + timeout = 1800 + +/datum/mood_event/slipped + description = "I slipped. I should be more careful next time...\n" + mood_change = -2 + timeout = 1800 + +/datum/mood_event/eye_stab + description = "I used to be an adventurer like you, until I took a screwdriver to the eye.\n" + mood_change = -4 + timeout = 1800 + +/datum/mood_event/delam //SM delamination + description = "Those God damn engineers can't do anything right...\n" + mood_change = -2 + timeout = 2400 + +/datum/mood_event/depression + description = "I feel sad for no particular reason.\n" + mood_change = -6 + timeout = 1200 + +/datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord + description = "I can't even end it all!\n" + mood_change = -10 + timeout = 600 + +/datum/mood_event/dismembered + description = "AHH! I WAS USING THAT LIMB!\n" + mood_change = -8 + timeout = 2400 + +/datum/mood_event/noshoes + description = "I am a disgrace to comedy everywhere!\n" + mood_change = -3 + +/datum/mood_event/tased + description = "There's no \"z\" in \"taser\". It's in the zap.\n" + mood_change = -3 + timeout = 1200 + +/datum/mood_event/embedded + description = "Pull it out!\n" + mood_change = -6 + +/datum/mood_event/table + description = "Someone threw me on a table!\n" + mood_change = -2 + timeout = 1200 + +/datum/mood_event/brain_damage + mood_change = -3 + +/datum/mood_event/brain_damage/add_effects() + var/damage_message = pick_list_replacements("brain_damage_lines.json", "brain_damage") + description = "Hurr durr... [damage_message]\n" + +/datum/mood_event/hulk //Entire duration of having the hulk mutation + description = "HULK SMASH!\n" + mood_change = -4 + +/datum/mood_event/epilepsy //Only when the mutation causes a seizure + description = "I should have paid attention to the epilepsy warning.\n" + mood_change = -3 + timeout = 3000 + + +/datum/mood_event/grossroom + description = "This room is kind of dirty...\n" + mood_change = -3 + +/datum/mood_event/disgustingroom + description = "This room is disgusting!\n" + mood_change = -5 + +//These are unused so far but I want to remember them to use them later +/datum/mood_event/cloned_corpse + description = "I recently saw my own corpse...\n" + mood_change = -6 + +/datum/mood_event/surgery + description = "HE'S CUTTING ME OPEN!!\n" + mood_change = -8 diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm new file mode 100644 index 0000000000..f5c5bb9807 --- /dev/null +++ b/code/datums/mood_events/generic_positive_events.dm @@ -0,0 +1,71 @@ +/datum/mood_event/hug + description = "Hugs are nice.\n" + mood_change = 1 + timeout = 1200 + +/datum/mood_event/arcade + description = "I beat the arcade game!\n" + mood_change = 3 + timeout = 3000 + +/datum/mood_event/blessing + description = "I've been blessed.\n" + mood_change = 3 + timeout = 3000 + +/datum/mood_event/book_nerd + description = "I have recently read a book.\n" + mood_change = 3 + timeout = 3000 + +/datum/mood_event/pet_corgi + description = "Corgis are adorable! I can't stop petting them!\n" + mood_change = 3 + timeout = 3000 + +/datum/mood_event/honk + description = "Maybe clowns aren't so bad after all. Honk!\n" + mood_change = 2 + timeout = 2400 + +/datum/mood_event/perform_cpr + description = "It feels good to save a life.\n" + mood_change = 6 + timeout = 3000 + +/datum/mood_event/oblivious + description = "What a lovely day.\n" + mood_change = 3 + +/datum/mood_event/happytable + description = "They want to play on the table!\n" + mood_change = 2 + timeout = 1200 + +/datum/mood_event/jolly + description = "I feel happy for no particular reason.\n" + mood_change = 6 + timeout = 1200 + +/datum/mood_event/focused + description = "I have a goal, and I will reach it, whatever it takes!\n" //Used for syndies, nukeops etc so they can focus on their goals + mood_change = 12 + hidden = TRUE + +/datum/mood_event/revolution + description = "VIVA LA REVOLUTION!\n" + mood_change = 3 + hidden = TRUE + +/datum/mood_event/cult + description = "I have seen the truth, praise the almighty one!\n" + mood_change = 40 //maybe being a cultist isnt that bad after all + hidden = TRUE + +/datum/mood_event/niceroom + description = "This room looks really pretty!\n" + mood_change = 4 + +/datum/mood_event/greatroom + description = "This room is beautiful!\n" + mood_change = 7 diff --git a/code/datums/mood_events/mood_event.dm b/code/datums/mood_events/mood_event.dm new file mode 100644 index 0000000000..6b4301b83a --- /dev/null +++ b/code/datums/mood_events/mood_event.dm @@ -0,0 +1,19 @@ +/datum/mood_event + var/description ///For descriptions, use the span classes bold nicegreen, nicegreen, none, warning and boldwarning in order from great to horrible. + var/mood_change = 0 + var/timeout = 0 + var/hidden = FALSE//Not shown on examine + var/mob/owner + +/datum/mood_event/New(mob/M, param) + owner = M + add_effects(param) + +/datum/mood_event/Destroy() + remove_effects() + +/datum/mood_event/proc/add_effects(param) + return + +/datum/mood_event/proc/remove_effects() + return diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm new file mode 100644 index 0000000000..6059d2e7b6 --- /dev/null +++ b/code/datums/mood_events/needs_events.dm @@ -0,0 +1,54 @@ +//nutrition +/datum/mood_event/nutrition/fat + description = "I'm so fat..\n" //muh fatshaming + mood_change = -4 + +/datum/mood_event/nutrition/wellfed + description = "My belly feels round and full.\n" + mood_change = 6 + +/datum/mood_event/nutrition/fed + description = "I have recently had some food.\n" + mood_change = 3 + +/datum/mood_event/nutrition/hungry + description = "I'm getting a bit hungry.\n" + mood_change = -8 + +/datum/mood_event/nutrition/starving + description = "I'm starving!\n" + mood_change = -15 + +//Disgust +/datum/mood_event/disgust/gross + description = "I saw something gross.\n" + mood_change = -2 + +/datum/mood_event/disgust/verygross + description = "I think I'm going to puke...\n" + mood_change = -5 + +/datum/mood_event/disgust/disgusted + description = "Oh god that's disgusting...\n" + mood_change = -8 + +//Generic needs events +/datum/mood_event/favorite_food + description = "I really enjoyed eating that.\n" + mood_change = 3 + timeout = 2400 + +/datum/mood_event/gross_food + description = "I really didn't like that food.\n" + mood_change = -2 + timeout = 2400 + +/datum/mood_event/disgusting_food + description = "That food was disgusting!\n" + mood_change = -4 + timeout = 2400 + +/datum/mood_event/nice_shower + description = "I have recently had a nice shower.\n" + mood_change = 2 + timeout = 1800 diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 418b783b94..fd0dd077b7 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -11,6 +11,9 @@ owner.visible_message("[owner] starts having a seizure!", "You have a seizure!") owner.Unconscious(200) owner.Jitter(1000) + GET_COMPONENT_FROM(mood, /datum/component/mood, owner) + if(mood) + mood.add_event("epilepsy", /datum/mood_event/epilepsy) addtimer(CALLBACK(src, .proc/jitter_less, owner), 90) /datum/mutation/human/epilepsy/proc/jitter_less(mob/living/carbon/human/owner) diff --git a/code/datums/mutations/cold_resistance.dm b/code/datums/mutations/cold_resistance.dm index 6281514e71..b221ac95ca 100644 --- a/code/datums/mutations/cold_resistance.dm +++ b/code/datums/mutations/cold_resistance.dm @@ -14,6 +14,18 @@ /datum/mutation/human/cold_resistance/get_visual_indicator(mob/living/carbon/human/owner) return visual_indicators[1] +/datum/mutation/human/cold_resistance/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.add_trait(TRAIT_RESISTCOLD, "cold_resistance") + owner.add_trait(TRAIT_RESISTLOWPRESSURE, "cold_resistance") + +/datum/mutation/human/cold_resistance/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.remove_trait(TRAIT_RESISTCOLD, "cold_resistance") + owner.remove_trait(TRAIT_RESISTLOWPRESSURE, "cold_resistance") + /datum/mutation/human/cold_resistance/on_life(mob/living/carbon/human/owner) if(owner.getFireLoss()) if(prob(1)) diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 8397c3b064..b12efbc452 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -14,6 +14,9 @@ owner.add_trait(TRAIT_STUNIMMUNE, TRAIT_HULK) owner.add_trait(TRAIT_PUSHIMMUNE, TRAIT_HULK) owner.update_body_parts() + GET_COMPONENT_FROM(mood, /datum/component/mood, owner) + if(mood) + mood.add_event("hulk", /datum/mood_event/hulk) /datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity) if(proximity) //no telekinetic hulk attack @@ -30,7 +33,10 @@ owner.remove_trait(TRAIT_STUNIMMUNE, TRAIT_HULK) owner.remove_trait(TRAIT_PUSHIMMUNE, TRAIT_HULK) owner.update_body_parts() - + GET_COMPONENT_FROM(mood, /datum/component/mood, owner) + if(mood) + mood.clear_event("hulk") + /datum/mutation/human/hulk/say_mod(message) if(message) message = "[uppertext(replacetext(message, ".", "!"))]!!" diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 3c3ab905ea..853d2dbafc 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -85,6 +85,8 @@ if(backpack_contents) for(var/path in backpack_contents) var/number = backpack_contents[path] + if(!isnum(number))//Default to 1 + number = 1 for(var/i=0,iYour arm suddenly grows back with the Rod of Asclepius still attached!") + else + //Otherwise get rid of whatever else is in their hand and return the rod to said hand + itemUser.dropItemToGround(itemUser.get_item_for_held_index(hand)) + if(((hand % 2) == 0)) + itemUser.put_in_r_hand(newRod) + else + itemUser.put_in_l_hand(newRod) + to_chat(itemUser, "The Rod of Asclepius suddenly grows back out of your arm!") + //Because a servant of medicines stops at nothing to help others, lets keep them on their toes and give them an additional boost. + if(itemUser.health < itemUser.maxHealth) + new /obj/effect/temp_visual/heal(get_turf(itemUser), "#375637") + itemUser.adjustBruteLoss(-1.5) + itemUser.adjustFireLoss(-1.5) + itemUser.adjustToxLoss(-1.5, forced = TRUE) //Because Slime People are people too + itemUser.adjustOxyLoss(-1.5) + itemUser.adjustStaminaLoss(-1.5) + itemUser.adjustBrainLoss(-1.5) + itemUser.adjustCloneLoss(-0.5) //Becasue apparently clone damage is the bastion of all health + //Heal all those around you, unbiased + for(var/mob/living/L in view(7, owner)) + if(L.health < L.maxHealth) + new /obj/effect/temp_visual/heal(get_turf(L), "#375637") + if(iscarbon(L)) + L.adjustBruteLoss(-3.5) + L.adjustFireLoss(-3.5) + L.adjustToxLoss(-3.5, forced = TRUE) //Because Slime People are people too + L.adjustOxyLoss(-3.5) + L.adjustStaminaLoss(-3.5) + L.adjustBrainLoss(-3.5) + L.adjustCloneLoss(-1) //Becasue apparently clone damage is the bastion of all health + else + var/mob/living/simple_animal/SM = L + SM.adjustHealth(-3.5, forced = TRUE) \ No newline at end of file diff --git a/code/datums/traits/_trait.dm b/code/datums/traits/_trait.dm new file mode 100644 index 0000000000..b7cf589ef5 --- /dev/null +++ b/code/datums/traits/_trait.dm @@ -0,0 +1,127 @@ +//every trait in this folder should be coded around being applied on spawn +//these are NOT "mob traits" like GOTTAGOFAST, but exist as a medium to apply them and other different effects +/datum/trait + var/name = "Test Trait" + var/desc = "This is a test trait." + var/value = 0 + var/human_only = TRUE + var/gain_text + var/lose_text + var/medical_record_text //This text will appear on medical records for the trait. Not yet implemented + var/mob_trait //if applicable, apply and remove this mob trait + var/mob/living/trait_holder + +/datum/trait/New(mob/living/trait_mob, spawn_effects) + ..() + if(!trait_mob || (human_only && !ishuman(trait_mob)) || trait_mob.has_trait_datum(type)) + qdel(src) + trait_holder = trait_mob + SStraits.trait_objects += src + to_chat(trait_holder, gain_text) + trait_holder.roundstart_traits += src + if(mob_trait) + trait_holder.add_trait(mob_trait, ROUNDSTART_TRAIT) + START_PROCESSING(SStraits, src) + add() + if(spawn_effects) + on_spawn() + addtimer(CALLBACK(src, .proc/post_add), 30) + +/datum/trait/Destroy() + STOP_PROCESSING(SStraits, src) + remove() + if(trait_holder) + to_chat(trait_holder, lose_text) + trait_holder.roundstart_traits -= src + if(mob_trait) + trait_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT, TRUE) + SStraits.trait_objects -= src + return ..() + +/datum/trait/proc/transfer_mob(mob/living/to_mob) + trait_holder.roundstart_traits -= src + to_mob.roundstart_traits += src + trait_holder = to_mob + on_transfer() + +/datum/trait/proc/add() //special "on add" effects +/datum/trait/proc/on_spawn() //these should only trigger when the character is being created for the first time, i.e. roundstart/latejoin +/datum/trait/proc/remove() //special "on remove" effects +/datum/trait/proc/on_process() //process() has some special checks, so this is the actual process +/datum/trait/proc/post_add() //for text, disclaimers etc. given after you spawn in with the trait +/datum/trait/proc/on_transfer() //code called when the trait is transferred to a new mob + +/datum/trait/process() + if(QDELETED(trait_holder)) + qdel(src) + return + if(trait_holder.stat == DEAD) + return + on_process() + +/mob/living/proc/get_trait_string(medical) //helper string. gets a string of all the traits the mob has + var/list/dat = list() + if(!medical) + for(var/V in roundstart_traits) + var/datum/trait/T = V + dat += T.name + if(!dat.len) + return "None" + return dat.Join(", ") + else + for(var/V in roundstart_traits) + var/datum/trait/T = V + dat += T.medical_record_text + if(!dat.len) + return "None" + return dat.Join("
") + +/mob/living/proc/cleanse_trait_datums() //removes all trait datums + for(var/V in roundstart_traits) + var/datum/trait/T = V + qdel(T) + +/mob/living/proc/transfer_trait_datums(mob/living/to_mob) + for(var/V in roundstart_traits) + var/datum/trait/T = V + T.transfer_mob(to_mob) + +/* + +Commented version of Nearsighted to help you add your own traits +Use this as a guideline + +/datum/trait/nearsighted + name = "Nearsighted" + ///The trait's name + + desc = "You are nearsighted without prescription glasses, but spawn with a pair." + ///Short description, shows next to name in the trait panel + + value = -1 + ///If this is above 0, it's a positive trait; if it's not, it's a negative one; if it's 0, it's a neutral + + mob_trait = TRAIT_NEARSIGHT + ///This define is in __DEFINES/traits.dm and is the actual "trait" that the game tracks + ///You'll need to use "has_trait(X, sources)" checks around the code to check this; for instance, the Ageusia trait is checked in taste code + ///If you need help finding where to put it, the declaration finder on GitHub is the best way to locate it + + gain_text = "Things far away from you start looking blurry." + lose_text = "You start seeing faraway things normally again." + medical_record_text = "Subject has permanent nearsightedness." + ///These three are self-explanatory + +/datum/trait/nearsighted/on_spawn() + var/mob/living/carbon/human/H = trait_holder + var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) + H.put_in_hands(glasses) + H.equip_to_slot(glasses, slot_glasses) + H.regenerate_icons() + +//This whole proc is called automatically +//It spawns a set of prescription glasses on the user, then attempts to put it into their hands, then attempts to make them equip it. +//This means that if they fail to equip it, they glasses spawn in their hands, and if they fail to be put into the hands, they spawn on the ground +//Hooray for fallbacks! +//If you don't need any special effects like spawning glasses, then you don't need an add() + +*/ diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm new file mode 100644 index 0000000000..1bad7b3352 --- /dev/null +++ b/code/datums/traits/good.dm @@ -0,0 +1,106 @@ +//predominantly positive traits +//this file is named weirdly so that positive traits are listed above negative ones + +/datum/trait/alcohol_tolerance + name = "Alcohol Tolerance" + desc = "You become drunk more slowly and suffer fewer drawbacks from alcohol." + value = 1 + mob_trait = TRAIT_ALCOHOL_TOLERANCE + gain_text = "You feel like you could drink a whole keg!" + lose_text = "You don't feel as resistant to alcohol anymore. Somehow." + + + +/datum/trait/freerunning + name = "Freerunning" + desc = "You're great at quick moves! You can climb tables more quickly." + value = 2 + mob_trait = TRAIT_FREERUNNING + gain_text = "You feel lithe on your feet!" + lose_text = "You feel clumsy again." + + + +/datum/trait/light_step + name = "Light Step" + desc = "You walk with a gentle step, making stepping on sharp objects quieter and less painful." + value = 1 + mob_trait = TRAIT_LIGHT_STEP + gain_text = "You walk with a little more litheness." + lose_text = "You start tromping around like a barbarian." + + + +/datum/trait/night_vision + name = "Night Vision" + desc = "You can see slightly more clearly in full darkness than most people." + value = 1 + mob_trait = TRAIT_NIGHT_VISION + gain_text = "The shadows seem a little less dark." + lose_text = "Everything seems a little darker." + +/datum/trait/night_vision/on_spawn() + var/mob/living/carbon/human/H = trait_holder + var/obj/item/organ/eyes/eyes = H.getorgan(/obj/item/organ/eyes) + if(!eyes || eyes.lighting_alpha) + return + eyes.Insert(H) //refresh their eyesight and vision + + + +/datum/trait/selfaware + name = "Self-Aware" + desc = "You know your body well, and can accurately assess the extent of your wounds." + value = 2 + mob_trait = TRAIT_SELF_AWARE + + + +/datum/trait/skittish + name = "Skittish" + desc = "You can conceal yourself in danger. Ctrl-shift-click a closed locker to jump into it, as long as you have access." + value = 2 + mob_trait = TRAIT_SKITTISH + + + +/datum/trait/spiritual + name = "Spiritual" + desc = "You're in tune with the gods, and your prayers may be more likely to be heard. Or not." + value = 1 + mob_trait = TRAIT_SPIRITUAL + gain_text = "You feel a little more faithful to the gods today." + lose_text = "You feel less faithful in the gods." + + + +/datum/trait/voracious + name = "Voracious" + desc = "Nothing gets between you and your food. You eat twice as fast as everyone else!" + value = 1 + mob_trait = TRAIT_VORACIOUS + gain_text = "You feel HONGRY." + lose_text = "You no longer feel HONGRY." + + +/datum/trait/jolly + name = "Jolly" + desc = "You sometimes just feel happy, for no reason at all." + value = 1 + mob_trait = TRAIT_JOLLY + + +/datum/trait/apathetic + name = "Apathetic" + desc = "You just don't care as much as other people, that's nice to have in a place like this, I guess." + value = 1 + +/datum/trait/apathetic/add() + GET_COMPONENT_FROM(mood, /datum/component/mood, trait_holder) + if(mood) + mood.mood_modifier = 0.8 + +/datum/trait/apathetic/remove() + GET_COMPONENT_FROM(mood, /datum/component/mood, trait_holder) + if(mood) + mood.mood_modifier = 1 //Change this once/if species get their own mood modifiers. diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm new file mode 100644 index 0000000000..023a8c2197 --- /dev/null +++ b/code/datums/traits/negative.dm @@ -0,0 +1,165 @@ +//predominantly negative traits + + + +/datum/trait/heavy_sleeper + name = "Heavy Sleeper" + desc = "You sleep like a rock! Whenever you're put to sleep, you sleep for a little bit longer." + value = -1 + mob_trait = TRAIT_HEAVY_SLEEPER + gain_text = "You feel sleepy." + lose_text = "You feel awake again." + medical_record_text = "Patient has abnormal sleep study results and is difficult to wake up." + + + +/datum/trait/nearsighted //t. errorage + name = "Nearsighted" + desc = "You are nearsighted without prescription glasses, but spawn with a pair." + value = -1 + gain_text = "Things far away from you start looking blurry." + lose_text = "You start seeing faraway things normally again." + medical_record_text = "Patient requires prescription glasses in order to counteract nearsightedness." + +/datum/trait/nearsighted/add() + trait_holder.become_nearsighted(ROUNDSTART_TRAIT) + +/datum/trait/nearsighted/on_spawn() + var/mob/living/carbon/human/H = trait_holder + var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) + H.put_in_hands(glasses) + H.equip_to_slot(glasses, slot_glasses) + H.regenerate_icons() //this is to remove the inhand icon, which persists even if it's not in their hands + + + +/datum/trait/nonviolent + name = "Pacifist" + desc = "The thought of violence makes you sick. So much so, in fact, that you can't hurt anyone." + value = -2 + mob_trait = TRAIT_PACIFISM + gain_text = "You feel repulsed by the thought of violence!" + lose_text = "You think you can defend yourself again." + medical_record_text = "Patient is unusually pacifistic and cannot bring themselves to cause physical harm." + +/datum/trait/nonviolent/on_process() + if(trait_holder.mind && LAZYLEN(trait_holder.mind.antag_datums)) + to_chat(trait_holder, "Your antagonistic nature has caused you to renounce your pacifism.") + qdel(src) + + + +/datum/trait/poor_aim + name = "Poor Aim" + desc = "You're terrible with guns and can't line up a straight shot to save your life. Dual-wielding is right out." + value = -1 + mob_trait = TRAIT_POOR_AIM + medical_record_text = "Patient possesses a strong tremor in both hands." + + + +/datum/trait/prosopagnosia + name = "Prosopagnosia" + desc = "You have a mental disorder that prevents you from being able to recognize faces at all." + value = -1 + mob_trait = TRAIT_PROSOPAGNOSIA + medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces." + + + +/datum/trait/prosthetic_limb + name = "Prosthetic Limb" + desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!" + value = -1 + var/slot_string = "limb" + +/datum/trait/prosthetic_limb/on_spawn() + var/limb_slot = pick("l_arm", "r_arm", "l_leg", "r_leg") + var/mob/living/carbon/human/H = trait_holder + var/obj/item/bodypart/old_part = H.get_bodypart(limb_slot) + var/obj/item/bodypart/prosthetic + switch(limb_slot) + if("l_arm") + prosthetic = new/obj/item/bodypart/l_arm/robot/surplus(trait_holder) + slot_string = "left arm" + if("r_arm") + prosthetic = new/obj/item/bodypart/r_arm/robot/surplus(trait_holder) + slot_string = "right arm" + if("l_leg") + prosthetic = new/obj/item/bodypart/l_leg/robot/surplus(trait_holder) + slot_string = "left leg" + if("r_leg") + prosthetic = new/obj/item/bodypart/r_leg/robot/surplus(trait_holder) + slot_string = "right leg" + prosthetic.replace_limb(H) + qdel(old_part) + H.regenerate_icons() + +/datum/trait/prosthetic_limb/post_add() + to_chat(trait_holder, "Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \ + you need to use a welding tool and cables to repair it, instead of bruise packs and ointment.") + + + +/datum/trait/insanity + name = "Reality Dissociation Syndrome" + desc = "You suffer from a severe disorder that causes very vivid hallucinations. Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. This is not a license to grief." + value = -2 + //no mob trait because it's handled uniquely + gain_text = "..." + lose_text = "You feel in tune with the world again." + medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations." + +/datum/trait/insanity/on_process() + if(trait_holder.reagents.has_reagent("mindbreaker")) + trait_holder.hallucination = 0 + return + if(prob(2)) //we'll all be mad soon enough + madness() + +/datum/trait/insanity/proc/madness(mad_fools) + set waitfor = FALSE + if(!mad_fools) + mad_fools = prob(20) + if(mad_fools) + var/hallucination_type = pick(subtypesof(/datum/hallucination/rds)) + new hallucination_type (trait_holder, FALSE) + else + trait_holder.hallucination += rand(10, 50) + +/datum/trait/insanity/post_add() //I don't /think/ we'll need this but for newbies who think "roleplay as insane" = "license to kill" it's probably a good thing to have + if(!trait_holder.mind || trait_holder.mind.special_role) + return + to_chat(trait_holder, "Please note that your dissociation syndrome does NOT give you the right to attack people or otherwise cause any interference to \ + the round. You are not an antagonist, and the rules will treat you the same as other crewmembers.") + + + +/datum/trait/social_anxiety + name = "Social Anxiety" + desc = "Talking to people is very difficult for you, and you often stutter or even lock up." + value = -1 + gain_text = "You start worrying about what you're saying." + lose_text = "You feel easier about talking again." //if only it were that easy! + medical_record_text = "Patient is usually anxious in social encounters and prefers to avoid them." + var/dumb_thing = TRUE + +/datum/trait/social_anxiety/on_process() + var/mob/living/carbon/human/H = trait_holder + if(prob(5)) + H.stuttering = max(3, H.stuttering) + else if(prob(1) && !H.silent) + to_chat(H, "You retreat into yourself. You really don't feel up to talking.") + H.silent = max(10, H.silent) + else if(prob(0.5) && dumb_thing) + to_chat(H, "You think of a dumb thing you said a long time ago and scream internally.") + dumb_thing = FALSE //only once per life + +/datum/trait/depression + name = "Depression" + desc = "You sometimes just hate life." + mob_trait = TRAIT_DEPRESSION + value = -1 + gain_text = "You start feeling depressed." + lose_text = "You no longer feel depressed." //if only it were that easy! + medical_record_text = "Patient has a severe mood disorder causing them to experience sudden moments of sadness." diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm new file mode 100644 index 0000000000..140b751fd8 --- /dev/null +++ b/code/datums/traits/neutral.dm @@ -0,0 +1,33 @@ +//traits with no real impact that can be taken freely +//MAKE SURE THESE DO NOT MAJORLY IMPACT GAMEPLAY. those should be positive or negative traits. + +/datum/trait/no_taste + name = "Ageusia" + desc = "You can't taste anything! Toxic food will still poison you." + value = 0 + mob_trait = TRAIT_AGEUSIA + gain_text = "You can't taste anything!" + lose_text = "You can taste again!" + medical_record_text = "Patient suffers from ageusia and is incapable of tasting food or reagents." + + + +/datum/trait/deviant_tastes + name = "Deviant Tastes" + desc = "You dislike food that most people enjoy, and find delicious what they don't." + value = 0 + gain_text = "You start craving something that tastes strange." + lose_text = "You feel like eating normal food again." + +/datum/trait/deviant_tastes/add() + var/mob/living/carbon/human/H = trait_holder + var/datum/species/species = H.dna.species + var/liked = species.liked_food + species.liked_food = species.disliked_food + species.disliked_food = liked + +/datum/trait/deviant_tastes/remove() + var/mob/living/carbon/human/H = trait_holder + var/datum/species/species = H.dna.species + species.liked_food = initial(species.liked_food) + species.disliked_food = initial(species.disliked_food) diff --git a/code/datums/votablemap.dm b/code/datums/votablemap.dm deleted file mode 100644 index c1c0c7d818..0000000000 --- a/code/datums/votablemap.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/votablemap - var/name = "" - var/friendlyname = "" - var/minusers = 0 - var/maxusers = 0 - var/voteweight = 1 - -/datum/votablemap/New(name) - src.name = name - src.friendlyname = name \ No newline at end of file diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 9c9bde19fc..0906a7e053 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -33,16 +33,15 @@ if(prob(40)) if(ishuman(L)) var/mob/living/carbon/human/H = L - if(H.dna && H.dna.species) - if(!(RADIMMUNE in H.dna.species.species_traits)) - if(prob(max(0,100-resist))) - H.randmuti() - if(prob(50)) - if(prob(90)) - H.randmutb() - else - H.randmutg() - H.domutcheck() + if(H.dna && !H.has_trait(TRAIT_RADIMMUNE)) + if(prob(max(0,100-resist))) + H.randmuti() + if(prob(50)) + if(prob(90)) + H.randmutb() + else + H.randmutg() + H.domutcheck() L.rad_act(20) /datum/weather/rad_storm/end() diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 5a01227b03..31156491f5 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -48,17 +48,15 @@ return if(!A.requiresID() || A.check_access(null)) if(A.density) - A.open() + INVOKE_ASYNC(A, /obj/machinery/door/airlock.proc/open) else - A.close() + INVOKE_ASYNC(A, /obj/machinery/door/airlock.proc/close) if(WIRE_BOLTS) // Pulse to toggle bolts (but only raise if power is on). if(!A.locked) A.bolt() - A.audible_message("You hear a click from the bottom of the door.", null, 1) else if(A.hasPower()) A.unbolt() - A.audible_message("You hear a click from the bottom of the door.", null, 1) A.update_icon() if(WIRE_IDSCAN) // Pulse to disable emergency access and flash red lights. if(A.hasPower() && A.density) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 450d70508e..0f3bfb12b1 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -31,6 +31,9 @@ var/outdoors = FALSE //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room) + var/beauty = 0 //To see how clean/dirty this area is, only works with indoors areas. + var/areasize = 0 //Size of the area in tiles, only calculated for indoors areas. + var/power_equip = TRUE var/power_light = TRUE var/power_environ = TRUE @@ -145,6 +148,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(!areas_in_z["[z]"]) areas_in_z["[z]"] = list() areas_in_z["[z]"] += src + update_area_size() return INITIALIZE_HINT_LATELOAD @@ -497,6 +501,10 @@ GLOBAL_LIST_EMPTY(teleportlocs) L.client.played = TRUE addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600) + GET_COMPONENT_FROM(mood, /datum/component/mood, L) + if(mood) + mood.update_beauty(src) + /client/proc/ResetAmbiencePlayed() played = FALSE @@ -524,6 +532,13 @@ GLOBAL_LIST_EMPTY(teleportlocs) blob_allowed = FALSE addSorted() +/area/proc/update_area_size() + if(outdoors) + return FALSE + areasize = 0 + for(var/turf/T in src.contents) + areasize++ + /area/AllowDrop() CRASH("Bad op: area/AllowDrop() called") diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index 0f57c0ce3b..13b9905874 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -466,4 +466,8 @@ /area/ruin/space/has_grav/powered/scp_294 name = "Abandoned SCP-294 Containment" + icon_state = "yellow" + +/area/ruin/space/has_grav/powered/ancient_shuttle + name = "Ancient Shuttle" icon_state = "yellow" \ No newline at end of file diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 8024322037..24fa11eda0 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -63,6 +63,9 @@ /datum/atom_hud/abductor hud_icons = list(GLAND_HUD) +/datum/atom_hud/sentient_disease + hud_icons = list(SENTIENT_DISEASE_HUD) + /* MED/SEC/DIAG HUD HOOKS */ /* @@ -78,7 +81,7 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() var/threat - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing if(!(D.visibility_flags & HIDDEN_SCANNER)) if(!threat || D.severity > threat) //a buffing virus gets an icon @@ -175,19 +178,19 @@ holder.icon_state = "huddead" else switch(virus_threat) - if(VIRUS_SEVERITY_BIOHAZARD) + if(DISEASE_SEVERITY_BIOHAZARD) holder.icon_state = "hudill5" - if(VIRUS_SEVERITY_DANGEROUS) + if(DISEASE_SEVERITY_DANGEROUS) holder.icon_state = "hudill4" - if(VIRUS_SEVERITY_HARMFUL) + if(DISEASE_SEVERITY_HARMFUL) holder.icon_state = "hudill3" - if(VIRUS_SEVERITY_MEDIUM) + if(DISEASE_SEVERITY_MEDIUM) holder.icon_state = "hudill2" - if(VIRUS_SEVERITY_MINOR) + if(DISEASE_SEVERITY_MINOR) holder.icon_state = "hudill1" - if(VIRUS_SEVERITY_NONTHREAT) + if(DISEASE_SEVERITY_NONTHREAT) holder.icon_state = "hudill0" - if(VIRUS_SEVERITY_POSITIVE) + if(DISEASE_SEVERITY_POSITIVE) holder.icon_state = "hudbuff" if(null) holder.icon_state = "hudhealthy" diff --git a/code/game/gamemodes/antag_spawner_cit.dm b/code/game/gamemodes/antag_spawner_cit.dm deleted file mode 100644 index 4cdc096072..0000000000 --- a/code/game/gamemodes/antag_spawner_cit.dm +++ /dev/null @@ -1,57 +0,0 @@ -////////////Syndicate Cortical Borer -obj/item/antag_spawner/syndi_borer - name = "syndicate brain-slug container" - desc = "Releases a modified cortical borer to assist the user." - icon = 'icons/obj/device.dmi' //Temporary? Doesn't really look like a container for xenofauna... but IDK what else could work. - icon_state = "locator" - var/polling = FALSE - -obj/item/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner) - var/mob/living/simple_animal/borer/syndi_borer/B = new /mob/living/simple_animal/borer/syndi_borer(T) - - B.key = C.key - if (owner) - B.owner = owner - B.faction = B.faction | owner.faction.Copy() - - B.mind.assigned_role = B.name - B.mind.special_role = B.name - var/datum/objective/syndi_borer/new_objective - new_objective = new /datum/objective/syndi_borer - new_objective.owner = B.mind - new_objective.target = owner.mind - new_objective.explanation_text = "You are a modified cortical borer. You obey [owner.real_name] and must assist them in completing their objectives." - B.mind.objectives += new_objective - - to_chat(B, "You are awake at last! Seek out whoever released you and aid them as best you can!") - if(new_objective) - to_chat(B, "Objective #[1]: [new_objective.explanation_text]") - -/obj/item/antag_spawner/syndi_borer/proc/check_usability(mob/user) - if(used) - to_chat(user, "[src] appears to be empty!") - return 0 - if(polling == TRUE) - to_chat(user, "[src] is busy activating!") - return 0 - return 1 - -/obj/item/antag_spawner/syndi_borer/attack_self(mob/user) - if(!(check_usability(user))) - return - polling = TRUE - var/list/borer_candidates = pollCandidatesForMob("Do you want to play as a syndicate cortical borer?", ROLE_BORER, null, ROLE_BORER, 150, src) - if(borer_candidates.len) - polling = FALSE - if(!(check_usability(user))) - return - used = 1 - var/mob/dead/observer/theghost = pick(borer_candidates) - spawn_antag(theghost.client, get_turf(src), user) - var/datum/effect_system/spark_spread/S = new /datum/effect_system/spark_spread - S.set_up(4, 1, src) - S.start() - qdel(src) - else - polling = FALSE - to_chat(user, "Unable to connect to release specimen. Please wait and try again later or use the container on your uplink to get your points refunded.") \ No newline at end of file diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index 2143bba338..41b583852d 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -37,7 +37,7 @@ var/datum/team/brother_team/team = new var/team_size = prob(10) ? min(3, possible_brothers.len) : 2 for(var/k = 1 to team_size) - var/datum/mind/bro = pick(possible_brothers) + var/datum/mind/bro = antag_pick(possible_brothers) possible_brothers -= bro antag_candidates -= bro team.add_member(bro) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 1f95688fa3..a77bf196c2 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -45,7 +45,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th for(var/i = 0, i < num_changelings, i++) if(!antag_candidates.len) break - var/datum/mind/changeling = pick(antag_candidates) + var/datum/mind/changeling = antag_pick(antag_candidates) antag_candidates -= changeling changelings += changeling changeling.special_role = ROLE_CHANGELING diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index e59cf40ca4..d2f5accea4 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -46,7 +46,7 @@ for(var/j = 0, j < num_changelings, j++) if(!possible_changelings.len) break - var/datum/mind/changeling = pick(possible_changelings) + var/datum/mind/changeling = antag_pick(possible_changelings) antag_candidates -= changeling possible_changelings -= changeling changeling.special_role = ROLE_CHANGELING diff --git a/code/game/gamemodes/cit_objectives.dm b/code/game/gamemodes/cit_objectives.dm deleted file mode 100644 index fbcfc675e3..0000000000 --- a/code/game/gamemodes/cit_objectives.dm +++ /dev/null @@ -1,106 +0,0 @@ -#define MIN_LATE_TARGET_TIME 600 //lower bound of re-rolled timer, 1 min -#define MAX_LATE_TARGET_TIME 6000 //upper bound of re-rolled timer, 10 min -#define LATE_TARGET_HIT_CHANCE 70 //How often would the find_target succeed, otherwise it re-rolls later and tries again. -//Hit chance is here to avoid people checking github and then hovering around new arrivals within the max minute range every round. - -/datum/objective/assassinate/late - martyr_compatible = FALSE - - -/datum/objective/assassinate/late/find_target() - var/list/possible_targets = list() - for(var/mob/M in GLOB.latejoiners) - var/datum/mind/possible_target = M.mind - if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && is_unique_objective(possible_target)) - possible_targets += possible_target - if(possible_targets.len > 0 && prob(LATE_TARGET_HIT_CHANCE)) - target = pick(possible_targets) - martyr_compatible = TRUE //Might never matter, but I guess if an admin gives another random objective, this should now be compatible - update_explanation_text() - - message_admins("[target] has been selected as the assassination target of [owner].") - log_game("[target] has been selected as the assassination target of [owner].") - - to_chat(owner, "You hear a crackling noise in your ears, as a one-way syndicate message plays:") - to_chat(owner, "You target has been located. To succeed, find and eliminate [target], the [!target_role_type ? target.assigned_role : target.special_role].") - return target - else - update_explanation_text() - addtimer(CALLBACK(src, .proc/find_target),rand(MIN_LATE_TARGET_TIME, MAX_LATE_TARGET_TIME)) - return null - -/datum/objective/assassinate/late/find_target_by_role(role, role_type=0, invert=0) - var/list/possible_targets = list() - for(var/mob/M in GLOB.latejoiners) - var/datum/mind/possible_target = M.mind - if((possible_target != owner) && ishuman(possible_target.current)) - var/is_role = 0 - if(role_type) - if(possible_target.special_role == role) - is_role++ - else - if(possible_target.assigned_role == role) - is_role++ - - if(invert) - if(is_role) - continue - possible_targets += possible_target - //break - else if(is_role) - possible_targets += possible_target - //break - if(possible_targets && prob(LATE_TARGET_HIT_CHANCE)) - target = pick(possible_targets) - update_explanation_text() - - message_admins("[target] has been selected as the assassination target of [owner].") - log_game("[target] has been selected as the assassination target of [owner].") - - to_chat(owner, "You hear a crackling noise in your ears, as a one-way syndicate message plays:") - to_chat(owner, "You target has been located. To succeed, find and eliminate [target], the [!target_role_type ? target.assigned_role : target.special_role].") - else - update_explanation_text() - addtimer(CALLBACK(src, .proc/find_target_by_role, role, role_type, invert),rand(MIN_LATE_TARGET_TIME, MAX_LATE_TARGET_TIME)) - - - -/datum/objective/assassinate/late/check_completion() - if(target && target.current) //If target WAS assigned - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return TRUE - return FALSE - else //If no target was ever given - if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current)) - return FALSE - if(!is_special_character(owner.current)) - return FALSE - return TRUE - -/datum/objective/assassinate/late/update_explanation_text() - //..() - if(target && target.current) - explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Stay alive until your target arrives on the station, you will be notified when the target has been identified." - - - -//BORER STUFF -//Because borers didn't use to have objectives -/datum/objective/normal_borer //Default objective, should technically never be used unmodified but CAN work unmodified. - explanation_text = "You must escape with at least one borer with host on the shuttle." - target_amount = 1 - martyr_compatible = 0 - -/datum/objective/normal_borer/check_completion() - var/total_borer_hosts = 0 - for(var/mob/living/carbon/C in GLOB.mob_list) - var/mob/living/simple_animal/borer/D = C.has_brain_worms() - var/turf/location = get_turf(C) - if(is_centcom_level(location.z) && D && D.stat != DEAD) - total_borer_hosts++ - if(target_amount <= total_borer_hosts) - return TRUE - else - return FALSE diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 730c8bff77..bd6a8bf77d 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -155,7 +155,7 @@ Credit where due: starter_servants += round(number_players / 10) starter_servants = min(starter_servants, 8) //max 8 servants (that sould only happen with a ton of players) while(starter_servants) - var/datum/mind/servant = pick(antag_candidates) + var/datum/mind/servant = antag_pick(antag_candidates) servants_to_serve += servant antag_candidates -= servant servant.assigned_role = ROLE_SERVANT_OF_RATVAR diff --git a/code/game/gamemodes/cult/blood_magic.dm b/code/game/gamemodes/cult/blood_magic.dm deleted file mode 100644 index dd66edcfb1..0000000000 --- a/code/game/gamemodes/cult/blood_magic.dm +++ /dev/null @@ -1,769 +0,0 @@ -/datum/action/innate/cult/blood_magic //Blood magic handles the creation of blood spells (formerly talismans) - name = "Prepare Blood Magic" - button_icon_state = "carve" - desc = "Prepare blood magic by carving runes into your flesh. This rite is most effective with an empowering rune" - var/list/spells = list() - var/channeling = FALSE - -/datum/action/innate/cult/blood_magic/Grant() - ..() - button.screen_loc = "6:-29,4:-2" - button.moved = "6:-29,4:-2" - button.locked = TRUE - -/datum/action/innate/cult/blood_magic/Remove() - for(var/X in spells) - qdel(X) - ..() - -/datum/action/innate/cult/blood_magic/IsAvailable() - if(!iscultist(owner)) - return FALSE - return ..() - -/datum/action/innate/cult/blood_magic/proc/Positioning() - for(var/datum/action/innate/cult/blood_spell/B in spells) - var/pos = -29+spells.Find(B)*31 - B.button.screen_loc = "6:[pos],4:-2" - B.button.moved = B.button.screen_loc - B.button.locked = TRUE - -/datum/action/innate/cult/blood_magic/Activate() - var/rune = FALSE - var/limit = RUNELESS_MAX_BLOODCHARGE - for(var/obj/effect/rune/empower/R in range(1, owner)) - rune = TRUE - break - if(rune) - limit = MAX_BLOODCHARGE - if(spells.len >= limit) - if(rune) - to_chat(owner, "Your body has reached its limit, you cannot store more than [MAX_BLOODCHARGE] spells at once. Pick a spell to nullify.") - else - to_chat(owner, "Your body has reached its limit, you cannot have more than [RUNELESS_MAX_BLOODCHARGE] spells at once without an empowering rune! Pick a spell to nullify.") - var/nullify_spell = input(owner, "Choose a spell to remove.", "Current Spells") as null|anything in spells - if(nullify_spell) - qdel(nullify_spell) - return - var/entered_spell_name - var/datum/action/innate/cult/blood_spell/BS - var/list/possible_spells = list() - for(var/I in subtypesof(/datum/action/innate/cult/blood_spell)) - var/datum/action/innate/cult/blood_spell/J = I - var/cult_name = initial(J.name) - possible_spells[cult_name] = J - possible_spells += "(REMOVE SPELL)" - entered_spell_name = input(owner, "Pick a blood spell to prepare...", "Spell Choices") as null|anything in possible_spells - if(entered_spell_name == "(REMOVE SPELL)") - var/nullify_spell = input(owner, "Choose a spell to remove.", "Current Spells") as null|anything in spells - if(nullify_spell) - qdel(nullify_spell) - return - BS = possible_spells[entered_spell_name] - if(QDELETED(src) || owner.incapacitated() || !BS) - return - to_chat(owner,"You begin to carve unnatural symbols into your flesh!") - SEND_SOUND(owner, sound('sound/weapons/slice.ogg',0,1,10)) - if(!channeling) - channeling = TRUE - else - to_chat(owner, "You are already invoking blood magic!") - return - if(do_after(owner, 100 - rune*65, target = owner)) - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.bleed(30 - rune*25) - var/datum/action/innate/cult/blood_spell/new_spell = new BS(owner) - new_spell.Grant(owner, src) - spells += new_spell - Positioning() - to_chat(owner, "Your wounds glows with power, you have prepared a [new_spell.name] invocation!") - channeling = FALSE - -/datum/action/innate/cult/blood_spell //The next generation of talismans - name = "Blood Magic" - button_icon_state = "telerune" - desc = "Fear the Old Blood." - var/charges = 1 - var/magic_path = null - var/obj/item/melee/blood_magic/hand_magic - var/datum/action/innate/cult/blood_magic/all_magic - var/base_desc //To allow for updating tooltips - var/invocation - var/health_cost = 0 - -/datum/action/innate/cult/blood_spell/Grant(mob/living/owner, datum/action/innate/cult/blood_magic/BM) - if(health_cost) - desc += "
Deals [health_cost] damage to your arm per use." - base_desc = desc - desc += "
Has [charges] use\s remaining." - all_magic = BM - ..() - -/datum/action/innate/cult/blood_spell/Remove() - if(all_magic) - all_magic.spells -= src - if(hand_magic) - qdel(hand_magic) - hand_magic = null - ..() - -/datum/action/innate/cult/blood_spell/IsAvailable() - if(!iscultist(owner) || owner.incapacitated() || !charges) - return FALSE - return ..() - -/datum/action/innate/cult/blood_spell/Activate() - if(magic_path) //If this spell flows from the hand - if(!hand_magic) - hand_magic = new magic_path(owner, src) - if(!owner.put_in_hands(hand_magic)) - qdel(hand_magic) - hand_magic = null - to_chat(owner, "You have no empty hand for invoking blood magic!") - return - to_chat(owner, "Your old wounds glow again as you invoke the [name].") - return - if(hand_magic) - qdel(hand_magic) - hand_magic = null - to_chat(owner, "You snuff out the spell with your hand, saving its power for another time.") - - -//Cult Blood Spells -/datum/action/innate/cult/blood_spell/stun - name = "Stun" - desc = "A potent spell that will stun and mute victims upon contact." - button_icon_state = "hand" - magic_path = "/obj/item/melee/blood_magic/stun" - health_cost = 10 - -/datum/action/innate/cult/blood_spell/teleport - name = "Teleport" - desc = "A useful spell that teleport cultists to a chosen destination on contact." - button_icon_state = "tele" - magic_path = "/obj/item/melee/blood_magic/teleport" - health_cost = 7 - -/datum/action/innate/cult/blood_spell/emp - name = "Electromagnetic Pulse" - desc = "A large spell that immediately disables all electronics in the area." - button_icon_state = "emp" - health_cost = 10 - invocation = "Ta'gh fara'qha fel d'amar det!" - -/datum/action/innate/cult/blood_spell/emp/Activate() - owner.visible_message("[owner]'s hand flashes a bright blue!", \ - "You speak the cursed words, emitting an EMP blast from your hand.") - empulse(owner, 3, 6) - owner.whisper(invocation, language = /datum/language/common) - charges-- - if(charges<=0) - qdel(src) - -/datum/action/innate/cult/blood_spell/shackles - name = "Shadow Shackles" - desc = "A stealthy spell that will handcuff and temporarily silence your victim." - button_icon_state = "cuff" - charges = 4 - magic_path = "/obj/item/melee/blood_magic/shackles" - -/datum/action/innate/cult/blood_spell/construction - name = "Twisted Construction" - desc = "A sinister spell used to convert:
Plasteel into runed metal
25 metal into a construct shell
Cyborgs directly into constructs
Cyborg shells into construct shells
Airlocks into runed airlocks (harm intent)" - button_icon_state = "transmute" - magic_path = "/obj/item/melee/blood_magic/construction" - -/datum/action/innate/cult/blood_spell/equipment - name = "Summon Equipment" - desc = "A crucial spell that enables you to summon either a ritual dagger or combat gear including armored robes, the nar'sien bola, and an eldritch longsword." - button_icon_state = "equip" - magic_path = "/obj/item/melee/blood_magic/armor" - -/datum/action/innate/cult/blood_spell/equipment/Activate() - var/choice = alert(owner,"Choose your equipment type",,"Combat Equipment","Ritual Dagger","Cancel") - if(choice == "Ritual Dagger") - var/turf/T = get_turf(owner) - owner.visible_message("[owner]'s hand glows red for a moment.", \ - "Red light begins to shimmer and take form within your hand!") - var/obj/O = new /obj/item/melee/cultblade/dagger(T) - if(owner.put_in_hands(O)) - to_chat(owner, "A ritual dagger appears in your hand!") - else - owner.visible_message("A ritual dagger appears at [owner]'s feet!", \ - "A ritual dagger materializes at your feet.") - SEND_SOUND(owner, sound('sound/effects/magic.ogg',0,1,25)) - charges-- - desc = base_desc - desc += "
Has [charges] use\s remaining." - if(charges<=0) - qdel(src) - else if(choice == "Combat Equipment") - ..() - -/datum/action/innate/cult/blood_spell/horror - name = "Hallucinations" - desc = "A ranged yet stealthy spell that will break the mind of the victim with nightmarish hallucinations." - button_icon_state = "horror" - var/obj/effect/proc_holder/horror/PH - charges = 4 - -/datum/action/innate/cult/blood_spell/horror/New() - PH = new() - PH.attached_action = src - ..() - -/datum/action/innate/cult/blood_spell/horror/Destroy() - var/obj/effect/proc_holder/horror/destroy = PH - . = ..() - if(destroy && !QDELETED(destroy)) - QDEL_NULL(destroy) - -/datum/action/innate/cult/blood_spell/horror/Activate() - PH.toggle(owner) //the important bit - return TRUE - -/obj/effect/proc_holder/horror - active = FALSE - ranged_mousepointer = 'icons/effects/cult_target.dmi' - var/datum/action/innate/cult/blood_spell/attached_action - -/obj/effect/proc_holder/horror/Destroy() - var/datum/action/innate/cult/blood_spell/AA = attached_action - . = ..() - if(AA && !QDELETED(AA)) - QDEL_NULL(AA) - -/obj/effect/proc_holder/horror/proc/toggle(mob/user) - if(active) - remove_ranged_ability("You dispel the magic...") - else - add_ranged_ability(user, "You prepare to horrify a target...") - -/obj/effect/proc_holder/horror/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return - if(ranged_ability_user.incapacitated() || !iscultist(caller)) - remove_ranged_ability() - return - var/turf/T = get_turf(ranged_ability_user) - if(!isturf(T)) - return FALSE - if(target in view(7, get_turf(ranged_ability_user))) - if(!ishuman(target) || iscultist(target)) - return - var/mob/living/carbon/human/H = target - H.hallucination = max(H.hallucination, 240) - SEND_SOUND(ranged_ability_user, sound('sound/effects/ghost.ogg',0,1,50)) - var/image/C = image('icons/effects/cult_effects.dmi',H,"bloodsparkles", ABOVE_MOB_LAYER) - add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, FALSE) - addtimer(CALLBACK(H,/atom/.proc/remove_alt_appearance,"cult_apoc",TRUE), 2400, TIMER_OVERRIDE|TIMER_UNIQUE) - to_chat(ranged_ability_user,"[H] has been cursed with living nightmares!") - attached_action.charges-- - attached_action.desc = attached_action.base_desc - attached_action.desc += "
Has [attached_action.charges] use\s remaining." - attached_action.UpdateButtonIcon() - if(attached_action.charges <= 0) - remove_mousepointer(ranged_ability_user.client) - remove_ranged_ability("You have exhausted the spell's power!") - qdel(src) - -/datum/action/innate/cult/blood_spell/veiling - name = "Conceal Presence" - desc = "A multi-function spell that alternates between hiding and revealing nearby cult runes, structures, turf, and airlocks." - invocation = "Kla'atu barada nikt'o!" - button_icon_state = "gone" - charges = 10 - var/revealing = FALSE //if it reveals or not - -/datum/action/innate/cult/blood_spell/veiling/Activate() - if(!revealing) - owner.visible_message("Thin grey dust falls from [owner]'s hand!", \ - "You invoke the veiling spell, hiding nearby runes.") - charges-- - SEND_SOUND(owner, sound('sound/magic/smoke.ogg',0,1,25)) - owner.whisper(invocation, language = /datum/language/common) - for(var/obj/effect/rune/R in range(5,owner)) - R.conceal() - for(var/obj/structure/destructible/cult/S in range(5,owner)) - S.conceal() - for(var/turf/open/floor/engine/cult/T in range(5,owner)) - T.realappearance.alpha = 0 - for(var/obj/machinery/door/airlock/cult/AL in range(5, owner)) - AL.conceal() - revealing = TRUE - name = "Reveal Runes" - button_icon_state = "back" - else - owner.visible_message("A flash of light shines from [owner]'s hand!", \ - "You invoke the counterspell, revealing nearby runes.") - charges-- - owner.whisper(invocation, language = /datum/language/common) - SEND_SOUND(owner, sound('sound/magic/enter_blood.ogg',0,1,25)) - for(var/obj/effect/rune/R in range(7,owner)) //More range in case you weren't standing in exactly the same spot - R.reveal() - for(var/obj/structure/destructible/cult/S in range(6,owner)) - S.reveal() - for(var/turf/open/floor/engine/cult/T in range(6,owner)) - T.realappearance.alpha = initial(T.realappearance.alpha) - for(var/obj/machinery/door/airlock/cult/AL in range(6, owner)) - AL.reveal() - revealing = FALSE - name = "Conceal Runes" - button_icon_state = "gone" - if(charges<= 0) - qdel(src) - desc = base_desc - desc += "
Has [charges] use\s remaining." - UpdateButtonIcon() - -/datum/action/innate/cult/blood_spell/manipulation - name = "Blood Rites" - desc = "A complex spell that allows you to gather blood and use it for healing or other powerful spells." - invocation = "Fel'th Dol Ab'orod!" - button_icon_state = "manip" - charges = 5 - magic_path = "/obj/item/melee/blood_magic/manipulator" - - -// The "magic hand" items -/obj/item/melee/blood_magic - name = "\improper magical aura" - desc = "Sinister looking aura that distorts the flow of reality around it." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "disintegrate" - item_state = null - flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 - w_class = WEIGHT_CLASS_HUGE - throwforce = 0 - throw_range = 0 - throw_speed = 0 - var/invocation - var/uses = 1 - var/health_cost = 0 //The amount of health taken from the user when invoking the spell - var/datum/action/innate/cult/blood_spell/source - -/obj/item/melee/blood_magic/New(loc, spell) - source = spell - uses = source.charges - health_cost = source.health_cost - ..() - -/obj/item/melee/blood_magic/Destroy() - if(!QDELETED(source)) - if(uses <= 0) - source.hand_magic = null - qdel(source) - source = null - else - source.hand_magic = null - source.charges = uses - source.desc = source.base_desc - source.desc += "
Has [uses] use\s remaining." - source.UpdateButtonIcon() - ..() - -/obj/item/melee/blood_magic/attack_self(mob/living/user) - afterattack(user, user, TRUE) - -/obj/item/melee/blood_magic/attack(mob/living/M, mob/living/carbon/user) - if(!iscarbon(user) || !iscultist(user)) - uses = 0 - qdel(src) - return - add_logs(user, M, "used a cult spell on", source.name, "") - M.lastattacker = user.real_name - M.lastattackerckey = user.ckey - -/obj/item/melee/blood_magic/afterattack(atom/target, mob/living/carbon/user, proximity) - if(invocation) - user.whisper(invocation, language = /datum/language/common) - if(health_cost) - if(user.active_hand_index == 1) - user.apply_damage(health_cost, BRUTE, "l_arm") - else - user.apply_damage(health_cost, BRUTE, "r_arm") - if(uses <= 0) - qdel(src) - else if(source) - source.desc = source.base_desc - source.desc += "
Has [uses] use\s remaining." - source.UpdateButtonIcon() - -//Stun -/obj/item/melee/blood_magic/stun - color = "#ff0000" // red - invocation = "Fuu ma'jin!" - -/obj/item/melee/blood_magic/stun/afterattack(atom/target, mob/living/carbon/user, proximity) - if(!isliving(target) || !proximity) - return - var/mob/living/L = target - if(iscultist(target)) - return - if(iscultist(user)) - user.visible_message("[user] holds up their hand, which explodes in a flash of red light!", \ - "You stun [L] with the spell!") - var/obj/item/nullrod/N = locate() in L - if(N) - target.visible_message("[L]'s holy weapon absorbs the light!", \ - "Your holy weapon absorbs the blinding light!") - else - L.Knockdown(180) - L.flash_act(1,1) - if(issilicon(target)) - var/mob/living/silicon/S = L - S.emp_act(EMP_HEAVY) - else if(iscarbon(target)) - var/mob/living/carbon/C = L - C.silent += 6 - C.stuttering += 15 - C.cultslurring += 15 - C.Jitter(15) - if(is_servant_of_ratvar(L)) - L.adjustBruteLoss(15) - uses-- - ..() - -//Teleportation -/obj/item/melee/blood_magic/teleport - color = RUNE_COLOR_TELEPORT - desc = "A potent spell that teleport cultists on contact." - invocation = "Sas'so c'arta forbici!" - -/obj/item/melee/blood_magic/teleport/afterattack(atom/target, mob/living/carbon/user, proximity) - if(!iscultist(target) || !proximity) - to_chat(user, "You can only teleport adjacent cultists with this spell!") - return - if(iscultist(user)) - var/list/potential_runes = list() - var/list/teleportnames = list() - for(var/R in GLOB.teleport_runes) - var/obj/effect/rune/teleport/T = R - potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T - - if(!potential_runes.len) - to_chat(user, "There are no valid runes to teleport to!") - log_game("Teleport talisman failed - no other teleport runes") - return - - var/turf/T = get_turf(src) - if(is_away_level(T.z)) - to_chat(user, "You are not in the right dimension!") - log_game("Teleport spell failed - user in away mission") - return - - var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked - var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? - if(QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated() || !actual_selected_rune || !proximity) - return - var/turf/dest = get_turf(actual_selected_rune) - if(is_blocked_turf(dest, TRUE)) - to_chat(user, "The target rune is blocked. Attempting to teleport to it would be massively unwise.") - return - uses-- - user.visible_message("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!", \ - "You speak the words of the talisman and find yourself somewhere else!", "You hear a sharp crack.") - var/mob/living/L = target - L.forceMove(dest) - dest.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.") - ..() - -//Shackles -/obj/item/melee/blood_magic/shackles - name = "Shadow Shackles" - desc = "Allows you to bind a victim and temporarily silence them." - invocation = "In'totum Lig'abis!" - color = "#000000" // black - -/obj/item/melee/blood_magic/shackles/afterattack(atom/target, mob/living/carbon/user, proximity) - if(iscultist(user) && iscarbon(target) && proximity) - var/mob/living/carbon/C = target - if(C.get_num_arms() >= 2 || C.get_arm_ignore()) - CuffAttack(C, user) - else - user.visible_message("This victim doesn't have enough arms to complete the restraint!") - return - ..() - -/obj/item/melee/blood_magic/shackles/proc/CuffAttack(mob/living/carbon/C, mob/living/user) - if(!C.handcuffed) - playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) - C.visible_message("[user] begins restraining [C] with dark magic!", \ - "[user] begins shaping a dark magic around your wrists!") - if(do_mob(user, C, 30)) - if(!C.handcuffed) - C.handcuffed = new /obj/item/restraints/handcuffs/energy/cult/used(C) - C.update_handcuffed() - C.silent += 5 - to_chat(user, "You shackle [C].") - add_logs(user, C, "shackled") - uses-- - else - to_chat(user, "[C] is already bound.") - else - to_chat(user, "You fail to shackle [C].") - else - to_chat(user, "[C] is already bound.") - - -/obj/item/restraints/handcuffs/energy/cult //For the shackling spell - name = "shadow shackles" - desc = "Shackles that bind the wrists with sinister magic." - trashtype = /obj/item/restraints/handcuffs/energy/used - flags_1 = DROPDEL_1 - -/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user) - user.visible_message("[user]'s shackles shatter in a discharge of dark magic!", \ - "Your [src] shatters in a discharge of dark magic!") - . = ..() - - -//Construction: Creates a construct shell out of 25 metal sheets, or converts plasteel into runed metal -/obj/item/melee/blood_magic/construction - name = "Twisted Construction" - desc = "Corrupts metal and plasteel into more sinister forms." - invocation = "Ethra p'ni dedol!" - color = "#000000" // black - -/obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(proximity_flag && iscultist(user)) - var/turf/T = get_turf(target) - if(istype(target, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/candidate = target - if(candidate.use(50)) - uses-- - to_chat(user, "A dark cloud eminates from your hand and swirls around the metal, twisting it into a construct shell!") - new /obj/structure/constructshell(T) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else - to_chat(user, "You need 50 metal to produce a construct shell!") - else if(istype(target, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/candidate = target - var/quantity = min(candidate.amount, uses) - uses -= quantity - new /obj/item/stack/sheet/runed_metal(T,quantity) - candidate.use(quantity) - to_chat(user, "A dark cloud eminates from you hand and swirls around the plasteel, transforming it into runed metal!") - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else if(istype(target,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/candidate = target - if(candidate.mmi) - user.visible_message("A dark cloud eminates from [user]'s hand and swirls around [candidate]!") - playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, 1) - var/prev_color = candidate.color - candidate.color = "black" - if(do_after(user, 90, target = candidate)) - candidate.emp_act(EMP_HEAVY) - var/construct_class = alert(user, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") - user.visible_message("The dark cloud receedes from what was formerly [candidate], revealing a\n [construct_class]!") - switch(construct_class) - if("Juggernaut") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, candidate, user, 0, T) - if("Wraith") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, candidate, user, 0, T) - if("Artificer") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, candidate, user, 0, T) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - uses-- - candidate.mmi = null - qdel(candidate) - else - candidate.color = prev_color - else - uses-- - to_chat(user, "A dark cloud eminates from you hand and swirls around [candidate] - twisting it into a construct shell!") - new /obj/structure/constructshell(T) - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else if(istype(target,/obj/machinery/door/airlock)) - target.narsie_act() - uses-- - user.visible_message("Black ribbons suddenly eminate from [user]'s hand and cling to the airlock - twisting and corrupting it!") - SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) - else - to_chat(user, "The spell will not work on [target]!") - ..() - -//Armor: Gives the target a basic cultist combat loadout -/obj/item/melee/blood_magic/armor - name = "Sinister Armaments" - desc = "A spell that will equip the target with cultist equipment if there is a slot to equip it to." - color = "#33cc33" // green - -/obj/item/melee/blood_magic/armor/afterattack(atom/target, mob/living/carbon/user, proximity) - if(iscarbon(target) && proximity) - uses-- - var/mob/living/carbon/C = target - C.visible_message("Otherworldly armor suddenly appears on [C]!") - C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,slot_w_uniform) - C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head) - C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit) - C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes) - C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back) - if(C == user) - qdel(src) //Clears the hands - C.put_in_hands(new /obj/item/melee/cultblade(user)) - C.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user)) - ..() - -/obj/item/melee/blood_magic/manipulator - name = "Blood Rite" - desc = "A spell that will absorb blood from anything you touch.
Touching cultists and constructs can heal them.
Clicking the hand will potentially let you focus the spell into something stronger." - color = "#7D1717" - -/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity) - if(proximity) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(NOBLOOD in H.dna.species.species_traits) - to_chat(user,"Blood rites do not work on species with no blood!") - return - if(iscultist(H)) - if(H.stat == DEAD) - to_chat(user,"Only a revive rune can bring back the dead!") - return - if(H.blood_volume < BLOOD_VOLUME_SAFE) - var/restore_blood = BLOOD_VOLUME_SAFE - H.blood_volume - if(uses*2 < restore_blood) - H.blood_volume += uses*2 - to_chat(user,"You use the last of your blood rites to restore what blood you could!") - uses = 0 - return ..() - else - H.blood_volume = BLOOD_VOLUME_SAFE - uses -= round(restore_blood/2) - to_chat(user,"Your blood rites have restored [H == user ? "your" : "their"] blood to safe levels!") - var/overall_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + H.getOxyLoss() - if(overall_damage == 0) - to_chat(user,"That cultist doesn't require healing!") - else - var/ratio = uses/overall_damage - if(H == user) - to_chat(user,"Your blood healing is far less efficient when used on yourself!") - ratio *= 0.35 // Healing is half as effective if you can't perform a full heal - uses -= round(overall_damage) // Healing is 65% more "expensive" even if you can still perform the full heal - if(ratio>1) - ratio = 1 - uses -= round(overall_damage) - H.visible_message("[H] is fully healed by [H==user ? "their":"[H]'s"]'s blood magic!") - else - H.visible_message("[H] is partially healed by [H==user ? "their":"[H]'s"] blood magic.") - uses = 0 - ratio *= -1 - H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0) - H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0) - H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0) - H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0) - H.updatehealth() - playsound(get_turf(H), 'sound/magic/staff_healing.ogg', 25) - new /obj/effect/temp_visual/cult/sparks(get_turf(H)) - user.Beam(H,icon_state="sendbeam",time=15) - else - if(H.stat == DEAD) - to_chat(user,"Their blood has stopped flowing, you'll have to find another way to extract it.") - return - if(H.cultslurring) - to_chat(user,"Their blood has been tainted by an even stronger form of blood magic, it's no use to us like this!") - return - if(H.blood_volume > BLOOD_VOLUME_SAFE) - H.blood_volume -= 100 - uses += 50 - user.Beam(H,icon_state="drainbeam",time=10) - playsound(get_turf(H), 'sound/magic/enter_blood.ogg', 50) - H.visible_message("[user] has drained some of [H]'s blood!") - to_chat(user,"Your blood rite gains 50 charges from draining [H]'s blood.") - new /obj/effect/temp_visual/cult/sparks(get_turf(H)) - else - to_chat(user,"They're missing too much blood - you cannot drain them further!") - return - if(isconstruct(target)) - var/mob/living/simple_animal/M = target - var/missing = M.maxHealth - M.health - if(missing) - if(uses > missing) - M.adjustHealth(-missing) - M.visible_message("[M] is fully-healed by [user]'s blood magic!") - uses -= missing - else - M.adjustHealth(-uses) - M.visible_message("[M] is healed by [user]'sblood magic!") - uses = 0 - playsound(get_turf(M), 'sound/magic/staff_healing.ogg', 25) - user.Beam(M,icon_state="sendbeam",time=10) - if(istype(target, /obj/effect/decal/cleanable/blood)) - blood_draw(target, user) - ..() - -/obj/item/melee/blood_magic/manipulator/proc/blood_draw(atom/target, mob/living/carbon/human/user) - var/temp = 0 - var/turf/T = get_turf(target) - if(T) - for(var/obj/effect/decal/cleanable/blood/B in view(T, 2)) - if(B.blood_state == "blood") - if(B.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam - temp += 30 - else - temp += max((B.bloodiness**2)/800,1) - new /obj/effect/temp_visual/cult/turf/floor(get_turf(B)) - qdel(B) - for(var/obj/effect/decal/cleanable/trail_holder/TH in view(T, 2)) - qdel(TH) - var/obj/item/clothing/shoes/shoecheck = user.shoes - if(shoecheck && shoecheck.bloody_shoes["blood"]) - temp += shoecheck.bloody_shoes["blood"]/20 - shoecheck.bloody_shoes["blood"] = 0 - if(temp) - user.Beam(T,icon_state="drainbeam",time=15) - new /obj/effect/temp_visual/cult/sparks(get_turf(user)) - playsound(T, 'sound/magic/enter_blood.ogg', 50) - to_chat(user, "Your blood rite has gained [round(temp)] charge\s from blood sources around you!") - uses += round(temp) - -/obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) - if(iscultist(user)) - var/list/options = list("Blood Spear (200)", "Blood Bolt Barrage (400)", "Blood Beam (600)") - var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options - if(!choice) - to_chat(user, "You decide against conducting a greater blood rite.") - return - switch(choice) - if("Blood Spear (200)") - if(uses < 200) - to_chat(user, "You need 200 charges to perform this rite.") - else - uses -= 200 - var/turf/T = get_turf(user) - qdel(src) - var/datum/action/innate/cult/spear/S = new(user) - var/obj/item/twohanded/cult_spear/rite = new(T) - S.Grant(user, rite) - rite.spear_act = S - if(user.put_in_hands(rite)) - to_chat(user, "A [rite.name] appears in your hand!") - else - user.visible_message("A [rite.name] appears at [user]'s feet!", \ - "A [rite.name] materializes at your feet.") - if("Blood Bolt Barrage (400)") - if(uses < 400) - to_chat(user, "You need 400 charges to perform this rite.") - else - var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood() - uses -= 400 - qdel(src) - if(user.put_in_hands(rite)) - to_chat(user, "Your hands glow with power!") - else - to_chat(user, "You need a free hand for this rite!") - qdel(rite) - if("Blood Beam (600)") - if(uses < 600) - to_chat(user, "You need 600 charges to perform this rite.") - else - var/obj/rite = new /obj/item/blood_beam() - uses -= 600 - qdel(src) - if(user.put_in_hands(rite)) - to_chat(user, "Your hands glow with POWER OVERWHELMING!!!") - else - to_chat(user, "You need a free hand for this rite!") - qdel(rite) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index fde8a16b13..2affa9ee2c 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -26,8 +26,8 @@ return FALSE else return FALSE - if(M.isloyal() || issilicon(M) || isbot(M) || isdrone(M) || is_servant_of_ratvar(M)) - return FALSE //can't convert machines, shielded, or ratvar's dogs + if(M.isloyal() || issilicon(M) || isbot(M) || isdrone(M) || is_servant_of_ratvar(M) || !M.client) + return FALSE //can't convert machines, shielded, braindead, or ratvar's dogs return TRUE /datum/game_mode/cult @@ -74,13 +74,13 @@ for(var/cultists_number = 1 to recommended_enemies) if(!antag_candidates.len) break - var/datum/mind/cultist = pick(antag_candidates) + var/datum/mind/cultist = antag_pick(antag_candidates) antag_candidates -= cultist cultists_to_cult += cultist cultist.special_role = ROLE_CULTIST cultist.restricted_roles = restricted_jobs log_game("[cultist.key] (ckey) has been selected as a cultist") - + return (cultists_to_cult.len>=required_enemies) diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index f25ba6c6b6..3007164465 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -36,7 +36,7 @@ for(var/j = 0, j < num_devils, j++) if (!antag_candidates.len) break - var/datum/mind/devil = pick(antag_candidates) + var/datum/mind/devil = antag_pick(antag_candidates) devils += devil devil.special_role = traitor_name devil.restricted_roles = restricted_jobs diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 56a929089d..50ad92d44b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -165,7 +165,7 @@ message_admins("The roundtype will be converted. If you have other plans for the station or feel the station is too messed up to inhabit stop the creation of antags or end the round now.") log_game("Roundtype converted to [replacementmode.name]") - + . = 1 sleep(rand(600,1800)) @@ -283,6 +283,61 @@ set_security_level(SEC_LEVEL_BLUE) +// This is a frequency selection system. You may imagine it like a raffle where each player can have some number of tickets. The more tickets you have the more likely you are to +// "win". The default is 100 tickets. If no players use any extra tickets (earned with the antagonist rep system) calling this function should be equivalent to calling the normal +// pick() function. By default you may use up to 100 extra tickets per roll, meaning at maximum a player may double their chances compared to a player who has no extra tickets. +// +// The odds of being picked are simply (your_tickets / total_tickets). Suppose you have one player using fifty (50) extra tickets, and one who uses no extra: +// Player A: 150 tickets +// Player B: 100 tickets +// Total: 250 tickets +// +// The odds become: +// Player A: 150 / 250 = 0.6 = 60% +// Player B: 100 / 250 = 0.4 = 40% +/datum/game_mode/proc/antag_pick(list/datum/candidates) + if(!CONFIG_GET(flag/use_antag_rep)) // || candidates.len <= 1) + return pick(candidates) + + // Tickets start at 100 + var/DEFAULT_ANTAG_TICKETS = CONFIG_GET(number/default_antag_tickets) + + // You may use up to 100 extra tickets (double your odds) + var/MAX_TICKETS_PER_ROLL = CONFIG_GET(number/max_tickets_per_roll) + + + var/total_tickets = 0 + + MAX_TICKETS_PER_ROLL += DEFAULT_ANTAG_TICKETS + + var/p_ckey + var/p_rep + + for(var/datum/mind/mind in candidates) + p_ckey = ckey(mind.key) + total_tickets += min(SSpersistence.antag_rep[p_ckey] + DEFAULT_ANTAG_TICKETS, MAX_TICKETS_PER_ROLL) + + var/antag_select = rand(1,total_tickets) + var/current = 1 + + for(var/datum/mind/mind in candidates) + p_ckey = ckey(mind.key) + p_rep = SSpersistence.antag_rep[p_ckey] + p_rep = p_rep == null ? 0 : p_rep + + if(current <= antag_select) + var/subtract = min(p_rep + DEFAULT_ANTAG_TICKETS, MAX_TICKETS_PER_ROLL) - DEFAULT_ANTAG_TICKETS + SSpersistence.antag_rep_change[p_ckey] = -subtract + +// WARNING("AR_DEBUG: Player [mind.key] won spending [subtract] tickets from starting value [SSpersistence.antag_rep[p_ckey]]") + + return mind + + current += min(p_rep + DEFAULT_ANTAG_TICKETS, MAX_TICKETS_PER_ROLL) + + WARNING("Something has gone terribly wrong. /datum/game_mode/proc/antag_pick failed to select a candidate. Falling back to pick()") + return pick(candidates) + /datum/game_mode/proc/get_players_for_role(role) var/list/players = list() var/list/candidates = list() @@ -370,7 +425,7 @@ //Reports player logouts// ////////////////////////// /proc/display_roundstart_logout_report() - var/msg = "Roundstart logout report\n\n" + var/list/msg = list("Roundstart logout report\n\n") for(var/i in GLOB.mob_living_list) var/mob/living/L = i var/mob/living/carbon/C = L @@ -382,22 +437,32 @@ if(L.ckey && L.client) + var/failed = FALSE if(L.client.inactivity >= (ROUNDSTART_LOGOUT_REPORT_TIME / 2)) //Connected, but inactive (alt+tabbed or something) msg += "[L.name] ([L.ckey]), the [L.job] (Connected, Inactive)\n" - continue //AFK client - if(L.stat) + failed = TRUE //AFK client + if(!failed && L.stat) if(L.suiciding) //Suicider msg += "[L.name] ([L.ckey]), the [L.job] (Suicide)\n" - continue //Disconnected client - if(L.stat == UNCONSCIOUS) + failed = TRUE //Disconnected client + if(!failed && L.stat == UNCONSCIOUS) msg += "[L.name] ([L.ckey]), the [L.job] (Dying)\n" - continue //Unconscious - if(L.stat == DEAD) + failed = TRUE //Unconscious + if(!failed && L.stat == DEAD) msg += "[L.name] ([L.ckey]), the [L.job] (Dead)\n" - continue //Dead + failed = TRUE //Dead + + var/p_ckey = L.client.ckey +// WARNING("AR_DEBUG: [p_ckey]: failed - [failed], antag_rep_change: [SSpersistence.antag_rep_change[p_ckey]]") + + // people who died or left should not gain any reputation + // people who rolled antagonist still lose it + if(failed && SSpersistence.antag_rep_change[p_ckey] > 0) +// WARNING("AR_DEBUG: Zeroed [p_ckey]'s antag_rep_change") + SSpersistence.antag_rep_change[p_ckey] = 0 continue //Happy connected client - for(var/mob/dead/observer/D in GLOB.mob_list) + for(var/mob/dead/observer/D in GLOB.dead_mob_list) if(D.mind && D.mind.current == L) if(L.stat == DEAD) if(L.suiciding) //Suicider @@ -415,7 +480,7 @@ for (var/C in GLOB.admins) - to_chat(C, msg) + to_chat(C, msg.Join()) //If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 /datum/game_mode/proc/age_check(client/C) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index b5e1224cc8..c6857cd222 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -21,13 +21,16 @@ /datum/game_mode/nuclear/pre_setup() var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible) - for(var/i = 0, i < n_agents, ++i) - var/datum/mind/new_op = pick_n_take(antag_candidates) - pre_nukeops += new_op - new_op.assigned_role = "Nuclear Operative" - new_op.special_role = "Nuclear Operative" - log_game("[new_op.key] (ckey) has been selected as a nuclear operative") - return TRUE + if(n_agents >= required_enemies) + for(var/i = 0, i < n_agents, ++i) + var/datum/mind/new_op = pick_n_take(antag_candidates) + pre_nukeops += new_op + new_op.assigned_role = "Nuclear Operative" + new_op.special_role = "Nuclear Operative" + log_game("[new_op.key] (ckey) has been selected as a nuclear operative") + return TRUE + else + return FALSE //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 45f85719d3..1553ee811f 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -52,7 +52,7 @@ for (var/i=1 to max_headrevs) if (antag_candidates.len==0) break - var/datum/mind/lenin = pick(antag_candidates) + var/datum/mind/lenin = antag_pick(antag_candidates) antag_candidates -= lenin headrev_candidates += lenin lenin.restricted_roles = restricted_jobs diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 7409faa706..80ce90722b 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -49,7 +49,7 @@ for(var/j = 0, j < num_traitors, j++) if (!antag_candidates.len) break - var/datum/mind/traitor = pick(antag_candidates) + var/datum/mind/traitor = antag_pick(antag_candidates) pre_traitors += traitor traitor.special_role = traitor_name traitor.restricted_roles = restricted_jobs @@ -100,4 +100,4 @@ /datum/game_mode/proc/update_traitor_icons_removed(datum/mind/traitor_mind) var/datum/atom_hud/antag/traitorhud = GLOB.huds[ANTAG_HUD_TRAITOR] traitorhud.leave_hud(traitor_mind.current) - set_antag_hud(traitor_mind.current, null) \ No newline at end of file + set_antag_hud(traitor_mind.current, null) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index dd8dad331f..8a6a7b7903 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -19,7 +19,7 @@ var/finished = 0 /datum/game_mode/wizard/pre_setup() - var/datum/mind/wizard = pick(antag_candidates) + var/datum/mind/wizard = antag_pick(antag_candidates) wizards += wizard wizard.assigned_role = ROLE_WIZARD wizard.special_role = ROLE_WIZARD diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 937742930c..3e121ad9ed 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -9,7 +9,7 @@ anchored = TRUE use_power = IDLE_POWER_USE idle_power_usage = 0 - var/obj/item/device/radio/beacon/Beacon + var/obj/item/device/beacon/Beacon /obj/machinery/bluespace_beacon/Initialize() . = ..() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 76709d438e..7b31c502e4 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -359,7 +359,7 @@ Class Procs: return 0 /obj/proc/can_be_unfasten_wrench(mob/user, silent) //if we can unwrench this object; returns SUCCESSFUL_UNFASTEN and FAILED_UNFASTEN, which are both TRUE, or CANT_UNFASTEN, which isn't. - if(!isfloorturf(loc) && !anchored) + if(!(isfloorturf(loc) || istype(loc, /turf/open/indestructible)) && !anchored) to_chat(user, "[src] needs to be on the floor to be secured!") return FAILED_UNFASTEN return SUCCESSFUL_UNFASTEN diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 0274c09fd6..ff90d9f834 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -131,7 +131,7 @@ flick("autolathe_o",src)//plays metal insertion animation if (MAT_GLASS) flick("autolathe_r",src)//plays glass insertion animation - use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * amount_inserted / 100))) + use_power(min(1000, amount_inserted / 100)) updateUsrDialog() /obj/machinery/autolathe/Topic(href, href_list) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 5d87f65537..36e06663f6 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -29,6 +29,7 @@ var/datum/mind/clonemind var/grab_ghost_when = CLONER_MATURE_CLONE + var/internal_radio = TRUE var/obj/item/device/radio/radio var/radio_key = /obj/item/device/encryptionkey/headset_med var/radio_channel = "Medical" @@ -38,24 +39,17 @@ var/list/unattached_flesh var/flesh_number = 0 - // The "brine" is the reagents that are automatically added in small - // amounts to the occupant. - var/static/list/brine_types = list( - "salbutamol", // anti-oxyloss - "bicaridine", // NOBREATHE species take brute in crit - "corazone", // prevents cardiac arrest and liver failure damage - "mimesbane", // stops them gasping from lack of air. - "mutetoxin") // stops them from killing themselves BY DEATHWHISPERING INSIDE A CLONE POD NICE JOB BREAKING IT HERO /obj/machinery/clonepod/Initialize() . = ..() countdown = new(src) - radio = new(src) - radio.keyslot = new radio_key - radio.subspace_transmission = TRUE - radio.canhear_range = 0 - radio.recalculateChannels() + if(internal_radio) + radio = new(src) + radio.keyslot = new radio_key + radio.subspace_transmission = TRUE + radio.canhear_range = 0 + radio.recalculateChannels() /obj/machinery/clonepod/Destroy() go_out() @@ -116,7 +110,7 @@ /obj/machinery/clonepod/return_air() // We want to simulate the clone not being in contact with // the atmosphere, so we'll put them in a constant pressure - // nitrogen. They'll breathe through the chemicals we pump into them. + // nitrogen. They don't need to breathe while cloning anyway. var/static/datum/gas_mixture/immutable/cloner/GM //global so that there's only one instance made for all cloning pods if(!GM) GM = new @@ -132,7 +126,7 @@ return examine(user) //Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, se, mindref, datum/species/mrace, list/features, factions) +/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, se, mindref, datum/species/mrace, list/features, factions, list/traits) if(panel_open) return FALSE if(mess || attempting) @@ -184,7 +178,11 @@ icon_state = "pod_1" //Get the clone body ready maim_clone(H) - check_brine() // put in chemicals NOW to stop death via cardiac arrest + H.add_trait(TRAIT_STABLEHEART, "cloning") + H.add_trait(TRAIT_EMOTEMUTE, "cloning") + H.add_trait(TRAIT_MUTE, "cloning") + H.add_trait(TRAIT_NOBREATH, "cloning") + H.add_trait(TRAIT_NOCRITDAMAGE, "cloning") H.Unconscious(80) clonemind.transfer_to(H) @@ -200,6 +198,9 @@ if(H) H.faction |= factions + for(var/V in traits) + new V(H) + H.set_cloned_appearance() H.suiciding = FALSE @@ -219,8 +220,9 @@ else if(mob_occupant && (mob_occupant.loc == src)) if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes. connected_message("Clone Rejected: Deceased.") - SPEAK("The cloning of [mob_occupant.real_name] has been \ - aborted due to unrecoverable tissue failure.") + if(internal_radio) + SPEAK("The cloning of [mob_occupant.real_name] has been \ + aborted due to unrecoverable tissue failure.") go_out() mob_occupant.apply_vore_prefs() @@ -248,13 +250,12 @@ //Premature clones may have brain damage. mob_occupant.adjustBrainLoss(-((speed_coeff / 2) * dmg_mult)) - check_brine() - use_power(7500) //This might need tweaking. else if((mob_occupant.cloneloss <= (100 - heal_level))) connected_message("Cloning Process Complete.") - SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.") + if(internal_radio) + SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.") // If the cloner is upgraded to debugging high levels, sometimes // organs and limbs can be missing. @@ -318,6 +319,7 @@ SPEAK("An emergency ejection of [clonemind.name] has occurred. Survival not guaranteed.") to_chat(user, "You force an emergency ejection. ") go_out() + mob_occupant.apply_vore_prefs() else return ..() @@ -356,6 +358,11 @@ if(!mob_occupant) return + mob_occupant.remove_trait(TRAIT_STABLEHEART, "cloning") + mob_occupant.remove_trait(TRAIT_EMOTEMUTE, "cloning") + mob_occupant.remove_trait(TRAIT_MUTE, "cloning") + mob_occupant.remove_trait(TRAIT_NOCRITDAMAGE, "cloning") + mob_occupant.remove_trait(TRAIT_NOBREATH, "cloning") if(grab_ghost_when == CLONER_MATURE_CLONE) mob_occupant.grab_ghost() @@ -402,6 +409,7 @@ connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0)) go_out() + mob_occupant.apply_vore_prefs() ..() /obj/machinery/clonepod/ex_act(severity, target) @@ -440,7 +448,7 @@ // brain function, they also have no limbs or internal organs. - if(!NODISMEMBER in H.dna.species.species_traits) + if(!H.has_trait(TRAIT_NODISMEMBER)) var/static/list/zones = list("r_arm", "l_arm", "r_leg", "l_leg") for(var/zone in zones) var/obj/item/bodypart/BP = H.get_bodypart(zone) @@ -459,15 +467,6 @@ flesh_number = unattached_flesh.len -/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(bt == "corazone" && occupant.reagents.get_reagent_amount(bt) < 2) - occupant.reagents.add_reagent(bt, 2)//pump it full of extra corazone as a safety, you can't OD on corazone. - else if(occupant.reagents.get_reagent_amount(bt) < 1) - occupant.reagents.add_reagent(bt, 1) - /* * Manual -- A big ol' manual. */ diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 90dc4f4f45..fbb5faedc2 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -67,7 +67,10 @@ return INITIALIZE_HINT_QDEL Reset() -/obj/machinery/computer/arcade/proc/prizevend() +/obj/machinery/computer/arcade/proc/prizevend(mob/user) + GET_COMPONENT_FROM(mood, /datum/component/mood, user) + if(mood) + mood.add_event("arcade", /datum/mood_event/arcade) if(prob(0.0001)) //1 in a million new /obj/item/gun/energy/pulse/prize(src) SSmedals.UnlockMedal(MEDAL_PULSE, usr.client) @@ -237,7 +240,7 @@ Reset() obj_flags &= ~EMAGGED else - prizevend() + prizevend(usr) SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("win", (obj_flags & EMAGGED ? "emagged":"normal"))) @@ -1031,7 +1034,7 @@ message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.") log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.") else - prizevend() + prizevend(usr) obj_flags &= ~EMAGGED name = "The Orion Trail" desc = "Learn how our ancestors got to Orion, and have fun in the process!" diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index d6cf184622..40f003ea34 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -71,7 +71,7 @@ if(pod.occupant) continue //how though? - if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"])) + if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["traits"])) temp = "[R.fields["name"]] => Cloning cycle in progress..." records -= R @@ -409,7 +409,7 @@ else if(pod.occupant) temp = "Cloning cycle already in progress." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"])) + else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["traits"])) temp = "[C.fields["name"]] => Cloning cycle in progress..." playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) records.Remove(C) @@ -482,6 +482,10 @@ R.fields["blood_type"] = dna.blood_type R.fields["features"] = dna.features R.fields["factions"] = mob_occupant.faction + R.fields["traits"] = list() + for(var/V in mob_occupant.roundstart_traits) + var/datum/trait/T = V + R.fields["traits"] += T.type if (!isnull(mob_occupant.mind)) //Save that mind so traitors can continue traitoring after cloning. R.fields["mind"] = "[REF(mob_occupant.mind)]" diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index de0089d5c6..3b6113e67b 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -81,7 +81,7 @@ if(connected && connected.is_operational()) if(connected.occupant) //set occupant_status message viable_occupant = connected.occupant - if(viable_occupant.has_dna() && (!(RADIMMUNE in viable_occupant.dna.species.species_traits)) && (!(viable_occupant.has_trait(TRAIT_NOCLONE)) || (connected.scan_level == 3))) //occupant is viable for dna modification + if(viable_occupant.has_dna() && !viable_occupant.has_trait(TRAIT_RADIMMUNE) && !viable_occupant.has_trait(TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification occupant_status += "[viable_occupant.name] => " switch(viable_occupant.stat) if(CONSCIOUS) @@ -528,7 +528,7 @@ var/mob/living/carbon/viable_occupant = null if(connected) viable_occupant = connected.occupant - if(!istype(viable_occupant) || !viable_occupant.dna || (RADIMMUNE in viable_occupant.dna.species.species_traits) || (viable_occupant.has_trait(TRAIT_NOCLONE))) + if(!istype(viable_occupant) || !viable_occupant.dna || viable_occupant.has_trait(TRAIT_RADIMMUNE) || viable_occupant.has_trait(TRAIT_NOCLONE)) viable_occupant = null return viable_occupant diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 794cdf5b30..356c21d9f3 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -75,4 +75,4 @@ return 0 if(B.scrambledcodes || B.emagged) return 0 - return ..() + return ..() \ No newline at end of file diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 74e640ae51..9701bf67f9 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -160,7 +160,7 @@ var/list/L = list() var/list/areaindex = list() if(regime_set == "Teleporter") - for(var/obj/item/device/radio/beacon/R in GLOB.teleportbeacons) + for(var/obj/item/device/beacon/R in GLOB.teleportbeacons) if(is_eligible(R)) var/area/A = get_area(R) L[avoid_assoc_duplicate_keys(A.name, areaindex)] = R diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index b95bf7d663..09f59fd003 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -118,10 +118,10 @@ return if(istype(P, /obj/item/circuitboard/machine)) - if(!anchored) + var/obj/item/circuitboard/machine/B = P + if(!anchored && B.needs_anchored) to_chat(user, "The frame needs to be secured first!") return - var/obj/item/circuitboard/machine/B = P if(!user.transferItemToLoc(B, src)) return playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) @@ -174,6 +174,7 @@ if(component_check) P.play_tool_sound(src) var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, 1) + new_machine.anchored = anchored new_machine.on_construction() for(var/obj/O in new_machine.component_parts) qdel(O) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index ea9eae906a..bd41e3aa3a 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -400,15 +400,16 @@ /obj/machinery/disco/proc/dance4(var/mob/living/M) - var/speed = rand(1,3) + //var/speed = rand(1,3) // CIT CHANGE set waitfor = 0 - var/time = 30 + /*var/time = 30 CIT CHANGE -- replaces dance4 with rapid spinning so that disco balls dont make weird shit happen while(time) sleep(speed) for(var/i in 1 to speed) M.setDir(pick(GLOB.cardinals)) M.lay_down(TRUE) - time-- + time--*/ + M.SpinAnimation(1,30) /obj/machinery/disco/proc/dance5(var/mob/living/M) animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 83b58fde65..b1075a41a0 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -101,8 +101,6 @@ /obj/machinery/door/airlock/Initialize() . = ..() wires = new /datum/wires/airlock(src) - if (cyclelinkeddir) - cyclelinkairlock() if(frequency) set_frequency(frequency) @@ -127,6 +125,8 @@ /obj/machinery/door/airlock/LateInitialize() . = ..() + if (cyclelinkeddir) + cyclelinkairlock() if(abandoned) var/outcome = rand(1,100) switch(outcome) @@ -153,6 +153,7 @@ /obj/machinery/door/airlock/ComponentInitialize() . = ..() + AddComponent(/datum/component/ntnet_interface) AddComponent(/datum/component/rad_insulation, RAD_MEDIUM_INSULATION) /obj/machinery/door/airlock/proc/update_other_id() @@ -178,6 +179,7 @@ limit-- while(!FoundDoor && limit) if (!FoundDoor) + log_world("### MAP WARNING, [src] at [get_area_name(src, TRUE)] [COORD(src)] failed to find a valid airlock to cyclelink with!") return FoundDoor.cyclelinkedairlock = src cyclelinkedairlock = FoundDoor @@ -188,6 +190,55 @@ if ("cyclelinkeddir") cyclelinkairlock() +/obj/machinery/door/airlock/check_access_ntnet(datum/netdata/data) + return !requiresID() || ..() + +/obj/machinery/door/airlock/ntnet_recieve(datum/netdata/data) + // Check if the airlock is powered and can accept control packets. + if(!hasPower() || !canAIControl()) + return + + // Check packet access level. + if(!check_access_ntnet(data)) + return + + // Handle recieved packet. + var/command = lowertext(data.plaintext_data) + var/command_value = lowertext(data.plaintext_data_secondary) + switch(command) + if("open") + if(command_value == "on" && !density) + return + + if(command_value == "off" && density) + return + + if(density) + INVOKE_ASYNC(src, .proc/open) + else + INVOKE_ASYNC(src, .proc/close) + + if("bolt") + if(command_value == "on" && locked) + return + + if(command_value == "off" && !locked) + return + + if(locked) + unbolt() + else + bolt() + + if("emergency") + if(command_value == "on" && emergency) + return + + if(command_value == "off" && !emergency) + return + + emergency = !emergency + update_icon() /obj/machinery/door/airlock/lock() bolt() @@ -197,6 +248,7 @@ return locked = TRUE playsound(src,boltDown,30,0,3) + audible_message("You hear a click from the bottom of the door.", null, 1) update_icon() /obj/machinery/door/airlock/unlock() @@ -207,6 +259,7 @@ return locked = FALSE playsound(src,boltUp,30,0,3) + audible_message("You hear a click from the bottom of the door.", null, 1) update_icon() /obj/machinery/door/airlock/narsie_act() @@ -320,7 +373,7 @@ return FALSE /obj/machinery/door/airlock/proc/canAIControl(mob/user) - return ((aiControlDisabled != 1) && (!isAllPowerCut())); + return ((aiControlDisabled != 1) && !isAllPowerCut()) /obj/machinery/door/airlock/proc/canAIHack() return ((aiControlDisabled==1) && (!hackProof) && (!isAllPowerCut())); diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index f6d80bca49..28fdded5d1 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -418,6 +418,19 @@ /obj/machinery/door/airlock/cult/canAIControl(mob/user) return (iscultist(user) && !isAllPowerCut()) +/obj/machinery/door/airlock/cult/obj_break(damage_flag) + if(!(flags_1 & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) + stat |= BROKEN + if(!panel_open) + panel_open = TRUE + update_icon() + +/obj/machinery/door/airlock/cult/isElectrified() + return FALSE + +/obj/machinery/door/airlock/cult/hasPower() + return TRUE + /obj/machinery/door/airlock/cult/allowed(mob/living/L) if(!density) return 1 @@ -487,7 +500,7 @@ /obj/machinery/door/airlock/cult/weak name = "brittle cult airlock" desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state." - normal_integrity = 180 + normal_integrity = 150 damage_deflection = 5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 0a808ef3e6..e924472270 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -45,11 +45,6 @@ if(!poddoor) to_chat(user, "Its maintenance panel is screwed in place.") -/obj/machinery/door/check_access(access) - if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED) - return TRUE - return ..() - /obj/machinery/door/check_access_list(list/access_list) if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED) return TRUE diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 2bce3671e0..9e467e8926 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -68,4 +68,4 @@ /obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user) if(stat & NOPOWER) - open(1) \ No newline at end of file + open(1) diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm new file mode 100644 index 0000000000..27618668fa --- /dev/null +++ b/code/game/machinery/exp_cloner.dm @@ -0,0 +1,297 @@ +//Experimental cloner; clones a body regardless of the owner's status, letting a ghost control it instead +/obj/machinery/clonepod/experimental + name = "experimental cloning pod" + desc = "An ancient cloning pod. It seems to be an early prototype of the experimental cloners used in Nanotrasen Stations." + icon = 'icons/obj/machines/cloning.dmi' + icon_state = "pod_0" + req_access = null + circuit = /obj/item/circuitboard/machine/clonepod/experimental + internal_radio = FALSE + +//Start growing a human clone in the pod! +/obj/machinery/clonepod/experimental/growclone(clonename, ui, se, datum/species/mrace, list/features, factions) + if(panel_open) + return FALSE + if(mess || attempting) + return FALSE + + attempting = TRUE //One at a time!! + countdown.start() + + var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) + + H.hardset_dna(ui, se, H.real_name, null, mrace, features) + + if(efficiency > 2) + var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations) + H.dna.remove_mutation_group(unclean_mutations) + if(efficiency > 5 && prob(20)) + H.randmutvg() + if(efficiency < 3 && prob(50)) + var/mob/M = H.randmutb() + if(ismob(M)) + H = M + + H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment. + occupant = H + + if(!clonename) //to prevent null names + clonename = "clone ([rand(0,999)])" + H.real_name = clonename + + icon_state = "pod_1" + //Get the clone body ready + maim_clone(H) + H.add_trait(TRAIT_STABLEHEART, "cloning") + H.add_trait(TRAIT_EMOTEMUTE, "cloning") + H.add_trait(TRAIT_MUTE, "cloning") + H.add_trait(TRAIT_NOBREATH, "cloning") + H.add_trait(TRAIT_NOCRITDAMAGE, "cloning") + H.Unconscious(80) + + var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H) + if(LAZYLEN(candidates)) + var/mob/dead/observer/C = pick(candidates) + H.key = C.key + + if(grab_ghost_when == CLONER_FRESH_CLONE) + H.grab_ghost() + to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") + + if(grab_ghost_when == CLONER_MATURE_CLONE) + H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost + to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.") + + if(H) + H.faction |= factions + + H.set_cloned_appearance() + + H.suiciding = FALSE + attempting = FALSE + return TRUE + + +//Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks. +/obj/machinery/computer/prototype_cloning + name = "prototype cloning console" + desc = "Used to operate an experimental cloner." + icon_screen = "dna" + icon_keyboard = "med_key" + circuit = /obj/item/circuitboard/computer/prototype_cloning + var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. + var/list/pods //Linked experimental cloning pods + var/temp = "Inactive" + var/scantemp = "Ready to Scan" + var/loading = FALSE // Nice loading text + + light_color = LIGHT_COLOR_BLUE + +/obj/machinery/computer/prototype_cloning/Initialize() + . = ..() + updatemodules(TRUE) + +/obj/machinery/computer/prototype_cloning/Destroy() + if(pods) + for(var/P in pods) + DetachCloner(P) + pods = null + return ..() + +/obj/machinery/computer/prototype_cloning/proc/GetAvailablePod(mind = null) + if(pods) + for(var/P in pods) + var/obj/machinery/clonepod/experimental/pod = P + if(pod.is_operational() && !(pod.occupant || pod.mess)) + return pod + +/obj/machinery/computer/prototype_cloning/proc/updatemodules(findfirstcloner) + scanner = findscanner() + if(findfirstcloner && !LAZYLEN(pods)) + findcloner() + +/obj/machinery/computer/prototype_cloning/proc/findscanner() + var/obj/machinery/dna_scannernew/scannerf = null + + // Loop through every direction + for(var/direction in GLOB.cardinals) + // Try to find a scanner in that direction + scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, direction)) + // If found and operational, return the scanner + if (!isnull(scannerf) && scannerf.is_operational()) + return scannerf + + // If no scanner was found, it will return null + return null + +/obj/machinery/computer/prototype_cloning/proc/findcloner() + var/obj/machinery/clonepod/experimental/podf = null + for(var/direction in GLOB.cardinals) + podf = locate(/obj/machinery/clonepod/experimental, get_step(src, direction)) + if (!isnull(podf) && podf.is_operational()) + AttachCloner(podf) + +/obj/machinery/computer/prototype_cloning/proc/AttachCloner(obj/machinery/clonepod/experimental/pod) + if(!pod.connected) + pod.connected = src + LAZYADD(pods, pod) + +/obj/machinery/computer/prototype_cloning/proc/DetachCloner(obj/machinery/clonepod/experimental/pod) + pod.connected = null + LAZYREMOVE(pods, pod) + +/obj/machinery/computer/prototype_cloning/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/P = W + + if(istype(P.buffer, /obj/machinery/clonepod/experimental)) + if(get_area(P.buffer) != get_area(src)) + to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-") + P.buffer = null + return + to_chat(user, "-% Successfully linked [P.buffer] with [src] %-") + var/obj/machinery/clonepod/experimental/pod = P.buffer + if(pod.connected) + pod.connected.DetachCloner(pod) + AttachCloner(pod) + else + P.buffer = src + to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-") + return + else + return ..() + +/obj/machinery/computer/prototype_cloning/attack_hand(mob/user) + if(..()) + return + interact(user) + +/obj/machinery/computer/prototype_cloning/interact(mob/user) + user.set_machine(src) + add_fingerprint(user) + + if(..()) + return + + updatemodules(TRUE) + + var/dat = "" + dat += "Refresh" + + dat += "

Cloning Pod Status

" + dat += "
[temp] 
" + + if (isnull(src.scanner) || !LAZYLEN(pods)) + dat += "

Modules

" + //dat += "Reload Modules" + if (isnull(src.scanner)) + dat += "ERROR: No Scanner detected!
" + if (!LAZYLEN(pods)) + dat += "ERROR: No Pod detected
" + + // Scan-n-Clone + if (!isnull(src.scanner)) + var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner.occupant) + + dat += "

Cloning

" + + dat += "
" + if(!scanner_occupant) + dat += "Scanner Unoccupied" + else if(loading) + dat += "[scanner_occupant] => Scanning..." + else + scantemp = "Ready to Clone" + dat += "[scanner_occupant] => [scantemp]" + dat += "
" + + if(scanner_occupant) + dat += "Clone" + dat += "
[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]" + else + dat += "Clone" + + var/datum/browser/popup = new(user, "cloning", "Prototype Cloning System Control") + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/machinery/computer/prototype_cloning/Topic(href, href_list) + if(..()) + return + + if(loading) + return + + else if ((href_list["clone"]) && !isnull(scanner) && scanner.is_operational()) + scantemp = "" + + loading = TRUE + updateUsrDialog() + playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) + say("Initiating scan...") + + spawn(20) + clone_occupant(scanner.occupant) + loading = FALSE + updateUsrDialog() + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + + //No locking an open scanner. + else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational()) + if ((!scanner.locked) && (scanner.occupant)) + scanner.locked = TRUE + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else + scanner.locked = FALSE + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) + + else if (href_list["refresh"]) + updateUsrDialog() + playsound(src, "terminal_type", 25, 0) + + add_fingerprint(usr) + updateUsrDialog() + return + +/obj/machinery/computer/prototype_cloning/proc/clone_occupant(occupant) + var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) + var/datum/dna/dna + if(ishuman(mob_occupant)) + var/mob/living/carbon/C = mob_occupant + dna = C.has_dna() + if(isbrain(mob_occupant)) + var/mob/living/brain/B = mob_occupant + dna = B.stored_dna + + if(!istype(dna)) + scantemp = "Unable to locate valid genetic data." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return + if((mob_occupant.has_trait(TRAIT_NOCLONE)) && (src.scanner.scan_level < 2)) + scantemp = "Subject no longer contains the fundamental materials required to create a living clone." + playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0) + return + + var/clone_species + if(dna.species) + clone_species = dna.species + else + var/datum/species/rando_race = pick(GLOB.roundstart_races) + clone_species = rando_race.type + + var/obj/machinery/clonepod/pod = GetAvailablePod() + //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. + if(!LAZYLEN(pods)) + temp = "No Clonepods detected." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else if(!pod) + temp = "No Clonepods available." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else if(pod.occupant) + temp = "Cloning cycle already in progress." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + else + pod.growclone(mob_occupant.real_name, dna.uni_identity, dna.struc_enzymes, clone_species, dna.features, mob_occupant.faction) + temp = "[mob_occupant.real_name] => Cloning data sent to pod." + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) \ No newline at end of file diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 264f773b89..bce12597ab 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -26,7 +26,6 @@ Possible to do for anyone motivated enough: #define HOLOPAD_PASSIVE_POWER_USAGE 1 #define HOLOGRAM_POWER_USAGE 2 -#define HOLOPAD_MODE RANGE_BASED /obj/machinery/holopad name = "holopad" diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 2b442401e2..3fb8110c9f 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -62,6 +62,7 @@ var/auth_weapons = 0 //checks if it can shoot people that have a weapon they aren't authorized to have var/stun_all = 0 //if this is active, the turret shoots everything that isn't security or head of staff var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos) + var/shoot_unloyal = 0 //checks if it can shoot people that aren't loyalty implantd var/attacked = 0 //if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!) @@ -177,6 +178,7 @@ dat += "Neutralize Identified Criminals: [criminals ? "Yes" : "No"]
" dat += "Neutralize All Non-Security and Non-Command Personnel: [stun_all ? "Yes" : "No"]
" dat += "Neutralize All Unidentified Life Signs: [check_anomalies ? "Yes" : "No"]
" + dat += "Neutralize All Non-Loyalty Implanted Personnel: [shoot_unloyal ? "Yes" : "No"]
" var/datum/browser/popup = new(user, "autosec", "Automatic Portable Turret Installation", 300, 300) popup.set_content(dat) @@ -208,6 +210,8 @@ stun_all = !stun_all if("checkxenos") check_anomalies = !check_anomalies + if("checkloyal") + shoot_unloyal = !shoot_unloyal interact(usr) /obj/machinery/porta_turret/power_change() @@ -385,7 +389,7 @@ if(iscarbon(A)) var/mob/living/carbon/C = A //If not emagged, only target non downed carbons - if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || C.lying)) + if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || C.recoveringstam))//CIT CHANGE - replaces check for lying with check for recoveringstam continue //If emagged, target all but dead carbons @@ -484,6 +488,10 @@ if(!R || (R.fields["criminal"] == "*Arrest*")) threatcount += 4 + if(shoot_unloyal) + if (!perp.isloyal()) + threatcount += 4 + return threatcount diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index c56cae8849..9d0f6c540c 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -104,7 +104,7 @@ // SINGULO BEACON SPAWNER /obj/item/device/sbeacondrop name = "suspicious beacon" - icon = 'icons/obj/radio.dmi' + icon = 'icons/obj/device.dmi' icon_state = "beacon" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 239bbd5c60..1846eea322 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -178,3 +178,4 @@ priority = "Extreme" else priority = "Undetermined" + diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index ead3e6636c..ac7bf4299d 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -849,10 +849,25 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C icon_deny = "med-deny" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" req_access_txt = "5" - products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/dropper = 3, /obj/item/stack/medical/gauze = 8, /obj/item/reagent_containers/pill/patch/styptic = 5, /obj/item/reagent_containers/pill/insulin = 10, - /obj/item/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/spray/medical/sterilizer = 1, - /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/morphine = 4, /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, - /obj/item/reagent_containers/glass/bottle/toxin = 3, /obj/item/reagent_containers/syringe/antiviral = 6, /obj/item/reagent_containers/pill/salbutamol = 2, /obj/item/device/healthanalyzer = 4, /obj/item/device/sensor_device = 2, /obj/item/pinpointer/crew = 2) + products = list(/obj/item/reagent_containers/syringe = 12, + /obj/item/reagent_containers/dropper = 3, + /obj/item/device/healthanalyzer = 4, + /obj/item/device/sensor_device = 2, + /obj/item/pinpointer/crew = 2, + /obj/item/reagent_containers/medspray/sterilizine = 1, + /obj/item/stack/medical/gauze = 8, + /obj/item/reagent_containers/pill/patch/styptic = 5, + /obj/item/reagent_containers/medspray/styptic = 2, + /obj/item/reagent_containers/pill/patch/silver_sulf = 5, + /obj/item/reagent_containers/medspray/silver_sulf = 2, + /obj/item/reagent_containers/pill/insulin = 10, + /obj/item/reagent_containers/pill/salbutamol = 2, + /obj/item/reagent_containers/glass/bottle/charcoal = 4, + /obj/item/reagent_containers/glass/bottle/epinephrine = 4, + /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, + /obj/item/reagent_containers/glass/bottle/morphine = 4, + /obj/item/reagent_containers/glass/bottle/toxin = 3, + /obj/item/reagent_containers/syringe/antiviral = 6) contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, /obj/item/reagent_containers/pill/charcoal = 6) premium = list(/obj/item/storage/box/hug/medical = 1, /obj/item/reagent_containers/hypospray/medipen = 3, /obj/item/storage/belt/medical = 3, /obj/item/wrench/medical = 1) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) @@ -876,7 +891,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C density = FALSE products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 5, /obj/item/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/reagent_containers/pill/charcoal = 2, - /obj/item/reagent_containers/spray/medical/sterilizer = 1) + /obj/item/reagent_containers/medspray/sterilizine = 1) contraband = list(/obj/item/reagent_containers/pill/tox = 2, /obj/item/reagent_containers/pill/morphine = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF @@ -1051,7 +1066,16 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C icon_state = "engivend" icon_deny = "engivend-deny" req_access_txt = "11" //Engineering Equipment access - products = list(/obj/item/clothing/glasses/meson/engine = 2, /obj/item/device/multitool = 4, /obj/item/electronics/airlock = 10, /obj/item/electronics/apc = 10, /obj/item/electronics/airalarm = 10, /obj/item/stock_parts/cell/high = 10, /obj/item/construction/rcd/loaded = 3, /obj/item/device/geiger_counter = 5, /obj/item/grenade/chem_grenade/smart_metal_foam = 10) + products = list(/obj/item/clothing/glasses/meson/engine = 2, + /obj/item/clothing/glasses/welding = 3, + /obj/item/device/multitool = 4, + /obj/item/construction/rcd/loaded = 3, + /obj/item/grenade/chem_grenade/smart_metal_foam = 10, + /obj/item/device/geiger_counter = 5, + /obj/item/stock_parts/cell/high = 10, + /obj/item/electronics/airlock = 10, + /obj/item/electronics/apc = 10, + /obj/item/electronics/airalarm = 10) contraband = list(/obj/item/stock_parts/cell/potato = 3) premium = list(/obj/item/storage/belt/utility = 3, /obj/item/storage/box/smart_metal_foam = 1) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index caaa3e3a00..7896d7aa35 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -19,3 +19,4 @@ /obj/mecha/combat/durand/RemoveActions(mob/living/user, human_occupant = 0) ..() defense_action.Remove(user) + diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 15b865c1e9..f5f369c2ad 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -27,3 +27,4 @@ ..() switch_damtype_action.Remove(user) phasing_action.Remove(user) + diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 54530d368c..06884c59b5 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -14,6 +14,7 @@ var/range = MELEE //bitflags var/salvageable = 1 var/selectable = 1 // Set to 0 for passive equipment such as mining scanner or armor plates + var/pacifist_safe = TRUE //Controls if equipment can be used to attack by a pacifist. /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() if(chassis) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 16c0e62795..680b9fe864 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -9,6 +9,7 @@ equip_cooldown = 15 energy_drain = 10 force = 15 + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/drill/Initialize() . = ..() diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index ac8304be39..330247f88c 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -10,6 +10,7 @@ energy_drain = 10 var/dam_force = 20 var/obj/mecha/working/ripley/cargo_holder + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/mecha/working/ripley/M as obj) if(..()) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index a8c799afa9..f6a05c3fa6 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -75,6 +75,7 @@ energy_drain = 30 projectile = /obj/item/projectile/beam/laser fire_sound = 'sound/weapons/laser.ogg' + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy equip_cooldown = 15 @@ -102,7 +103,7 @@ energy_drain = 500 projectile = /obj/item/projectile/energy/tesla/cannon fire_sound = 'sound/magic/lightningbolt.ogg' - + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse equip_cooldown = 30 @@ -112,6 +113,7 @@ energy_drain = 120 projectile = /obj/item/projectile/beam/pulse/heavy fire_sound = 'sound/weapons/marauder.ogg' + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma equip_cooldown = 10 @@ -124,6 +126,7 @@ energy_drain = 30 projectile = /obj/item/projectile/plasma/adv/mech fire_sound = 'sound/weapons/plasma_cutter.ogg' + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/working/M) if(..()) //combat mech @@ -243,6 +246,7 @@ projectile = /obj/item/projectile/bullet/incendiary/fnx99 projectiles = 24 projectile_energy_cost = 15 + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced name = "\improper S.H.H. \"Quietus\" Carbine" @@ -253,6 +257,7 @@ projectile = /obj/item/projectile/bullet/mime projectiles = 6 projectile_energy_cost = 50 + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot name = "\improper LBX AC 10 \"Scattershot\"" @@ -264,6 +269,7 @@ projectile_energy_cost = 25 projectiles_per_shot = 4 variance = 25 + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg name = "\improper Ultra AC 2" @@ -277,6 +283,7 @@ variance = 6 randomspread = 1 projectile_delay = 2 + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack name = "\improper SRM-8 missile rack" @@ -287,6 +294,7 @@ projectiles = 8 projectile_energy_cost = 1000 equip_cooldown = 60 + pacifist_safe = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 8a5044fdfa..c548e0b89d 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -64,17 +64,6 @@ time_coeff = round(initial(time_coeff) - (initial(time_coeff)*(T))/5,0.01) -/obj/machinery/mecha_part_fabricator/check_access(obj/item/card/id/I) - if(istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/pda = I - I = pda.id - if(!istype(I) || !I.access) //not ID or no access - return FALSE - for(var/req in req_access) - if(!(req in I.access)) //doesn't have this access - return FALSE - return TRUE - /obj/machinery/mecha_part_fabricator/emag_act() if(obj_flags & EMAGGED) return diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 3e29a6f07e..82394ba480 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -370,15 +370,21 @@ occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3) else occupant.clear_alert("mech damage") - var/actual_loc = occupant.loc - if(istype(actual_loc, /obj/item/device/mmi)) - var/obj/item/device/mmi/M = actual_loc - actual_loc = M.mecha - if(actual_loc != src) //something went wrong - occupant.clear_alert("charge") - occupant.clear_alert("mech damage") - RemoveActions(occupant, human_occupant=1) - occupant = null + var/atom/checking = occupant.loc + // recursive check to handle all cases regarding very nested occupants, + // such as brainmob inside brainitem inside MMI inside mecha + while (!isnull(checking)) + if (isturf(checking)) + // hit a turf before hitting the mecha, seems like they have + // been moved out + occupant.clear_alert("charge") + occupant.clear_alert("mech damage") + RemoveActions(occupant, human_occupant=1) + occupant = null + break + else if (checking == src) + break // all good + checking = checking.loc if(lights) var/lights_energy_drain = 2 @@ -434,11 +440,24 @@ target = safepick(view(3,target)) if(!target) return + + var/mob/living/L = user + var/obj/structure/closet/C = target if(!Adjacent(target)) if(selected && selected.is_ranged()) + if(L.has_trait(TRAIT_PACIFISM) && !selected.pacifist_safe) + to_chat(user, "You don't want to harm other living beings!") + return if(selected.action(target,params)) selected.start_cooldown() else if(selected && selected.is_melee()) + if(isliving(target) && !selected.pacifist_safe && L.has_trait(TRAIT_PACIFISM)) + to_chat(user, "You don't want to harm other living beings!") + return + if(istype(C) && L.has_trait(TRAIT_PACIFISM) && !selected.pacifist_safe && !istype(selected,/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/)) + for(var/mob/living/M in C) + to_chat(user, "There's someone in there! I don't want to hurt them.") + return if(selected.action(target,params)) selected.start_cooldown() else diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index b8a5cca70e..fa6dd9c5a0 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -1,94 +1,49 @@ //////////////////////////////// ///// Construction datums ////// //////////////////////////////// -/datum/construction/mecha +/datum/component/construction/mecha var/base_icon -/datum/construction/mecha/custom_action(obj/item/I, mob/living/user, diff) - var/target_index = index + diff - var/list/current_step = steps[index] - var/list/target_step - - if(target_index > 0 && target_index <= steps.len) - target_step = steps[target_index] - - . = TRUE - - if(I.tool_behaviour) - . = I.use_tool(holder, user, 0, volume=50) - - else if(diff == FORWARD) - switch(current_step["action"]) - if(ITEM_DELETE) - . = user.transferItemToLoc(I, holder) - if(.) - qdel(I) - - if(ITEM_MOVE_INSIDE) - . = user.transferItemToLoc(I, holder) - - else if(istype(I, /obj/item/stack)) - . = I.use_tool(holder, user, 0, volume=50, amount=current_step["amount"]) - - - // Going backwards? Undo the last action. Drop/respawn the items used in last action, if any. - if(. && diff == BACKWARD && target_step && !target_step["no_refund"]) - var/target_step_key = target_step["key"] - - switch(target_step["action"]) - if(ITEM_DELETE) - new target_step_key(drop_location()) - - if(ITEM_MOVE_INSIDE) - var/obj/item/located_item = locate(target_step_key) in holder - if(located_item) - located_item.forceMove(drop_location()) - - else if(ispath(target_step_key, /obj/item/stack)) - new target_step_key(drop_location(), target_step["amount"]) - - -/datum/construction/mecha/spawn_result() +/datum/component/construction/mecha/spawn_result() if(!result) return - // Remove default mech power cell, as we replace it with a new one. var/obj/mecha/M = new result(drop_location()) QDEL_NULL(M.cell) - M.CheckParts(holder.contents) + var/atom/parent_atom = parent + M.CheckParts(parent_atom.contents) SSblackbox.record_feedback("tally", "mechas_created", 1, M.name) - QDEL_NULL(holder) + QDEL_NULL(parent) -/datum/construction/mecha/update_holder(step_index) +/datum/component/construction/mecha/update_parent(step_index) ..() // By default, each step in mech construction has a single icon_state: // "[base_icon][index - 1]" // For example, Ripley's step 1 icon_state is "ripley0". + var/atom/parent_atom = parent if(!steps[index]["icon_state"] && base_icon) - holder.icon_state = "[base_icon][index - 1]" + parent_atom.icon_state = "[base_icon][index - 1]" -/datum/construction/unordered/mecha_chassis/custom_action(obj/item/I, mob/living/user, typepath) - . = user.transferItemToLoc(I, holder) +/datum/component/construction/unordered/mecha_chassis/custom_action(obj/item/I, mob/living/user, typepath) + . = user.transferItemToLoc(I, parent) if(.) - user.visible_message("[user] has connected [I] to [holder].", "You connect [I] to [holder].") - holder.add_overlay(I.icon_state+"+o") + var/atom/parent_atom = parent + user.visible_message("[user] has connected [I] to [parent].", "You connect [I] to [parent].") + parent_atom.add_overlay(I.icon_state+"+o") qdel(I) -/datum/construction/unordered/mecha_chassis/spawn_result() - holder.icon = 'icons/mecha/mech_construction.dmi' - holder.density = TRUE - holder.cut_overlays() - - var/obj/item/mecha_parts/chassis/chassis = holder - chassis.construct = new result(holder) - qdel(src) +/datum/component/construction/unordered/mecha_chassis/spawn_result() + var/atom/parent_atom = parent + parent_atom.icon = 'icons/mecha/mech_construction.dmi' + parent_atom.density = TRUE + parent_atom.cut_overlays() + ..() - -/datum/construction/unordered/mecha_chassis/ripley - result = /datum/construction/mecha/ripley +/datum/component/construction/unordered/mecha_chassis/ripley + result = /datum/component/construction/mecha/ripley steps = list( /obj/item/mecha_parts/part/ripley_torso, /obj/item/mecha_parts/part/ripley_left_arm, @@ -97,7 +52,7 @@ /obj/item/mecha_parts/part/ripley_right_leg ) -/datum/construction/mecha/ripley +/datum/component/construction/mecha/ripley result = /obj/mecha/working/ripley base_icon = "ripley" steps = list( @@ -219,92 +174,92 @@ ), ) -/datum/construction/mecha/ripley/custom_action(obj/item/I, mob/living/user, diff) +/datum/component/construction/mecha/ripley/custom_action(obj/item/I, mob/living/user, diff) if(!..()) return FALSE switch(index) if(1) - user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") if(2) if(diff==FORWARD) - user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") else - user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") if(3) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") else - user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") if(4) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") else - user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") if(5) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + user.visible_message("[user] installs the central control module into [parent].", "You install the central computer mainboard into [parent].") else - user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") if(6) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") else - user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") if(7) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + user.visible_message("[user] installs the peripherals control module into [parent].", "You install the peripherals control module into [parent].") else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") if(8) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") else - user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") if(9) if(diff==FORWARD) - user.visible_message("[user] installs the power cell into [holder].", "You install the power cell into [holder].") + user.visible_message("[user] installs the power cell into [parent].", "You install the power cell into [parent].") else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") if(10) if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") if(11) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [holder].", "You install the internal armor layer to [holder].") + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") else user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") if(12) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") else - user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") if(13) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") if(14) if(diff==FORWARD) - user.visible_message("[user] installs the external reinforced armor layer to [holder].", "You install the external reinforced armor layer to [holder].") + user.visible_message("[user] installs the external reinforced armor layer to [parent].", "You install the external reinforced armor layer to [parent].") else - user.visible_message("[user] cuts the internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") if(15) if(diff==FORWARD) user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") else - user.visible_message("[user] pries external armor layer from [holder].", "You pry external armor layer from [holder].") + user.visible_message("[user] pries external armor layer from [parent].", "You pry external armor layer from [parent].") if(16) if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to [holder].", "You weld the external armor layer to [holder].") + user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") else user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") return TRUE -/datum/construction/unordered/mecha_chassis/gygax - result = /datum/construction/mecha/gygax +/datum/component/construction/unordered/mecha_chassis/gygax + result = /datum/component/construction/mecha/gygax steps = list( /obj/item/mecha_parts/part/gygax_torso, /obj/item/mecha_parts/part/gygax_left_arm, @@ -314,7 +269,7 @@ /obj/item/mecha_parts/part/gygax_head ) -/datum/construction/mecha/gygax +/datum/component/construction/mecha/gygax result = /obj/mecha/combat/gygax base_icon = "gygax" steps = list( @@ -481,125 +436,125 @@ ) -/datum/construction/mecha/gygax/action(atom/used_atom,mob/user) +/datum/component/construction/mecha/gygax/action(atom/used_atom,mob/user) return check_step(used_atom,user) -/datum/construction/mecha/gygax/custom_action(obj/item/I, mob/living/user, diff) +/datum/component/construction/mecha/gygax/custom_action(obj/item/I, mob/living/user, diff) if(!..()) return FALSE switch(index) if(1) - user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") if(2) if(diff==FORWARD) - user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") else - user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") if(3) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") else - user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") if(4) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") else - user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") if(5) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + user.visible_message("[user] installs the central control module into [parent].", "You install the central computer mainboard into [parent].") else - user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") if(6) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") else - user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") if(7) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + user.visible_message("[user] installs the peripherals control module into [parent].", "You install the peripherals control module into [parent].") else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") if(8) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") else - user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") if(9) if(diff==FORWARD) - user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") + user.visible_message("[user] installs the weapon control module into [parent].", "You install the weapon control module into [parent].") else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") if(10) if(diff==FORWARD) user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") else - user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].") + user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") if(11) if(diff==FORWARD) - user.visible_message("[user] installs scanner module to [holder].", "You install scanner module to [holder].") + user.visible_message("[user] installs scanner module to [parent].", "You install scanner module to [parent].") else user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") if(12) if(diff==FORWARD) user.visible_message("[user] secures the advanced scanner module.", "You secure the scanner module.") else - user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the scanner module from [holder].") + user.visible_message("[user] removes the advanced scanner module from [parent].", "You remove the scanner module from [parent].") if(13) if(diff==FORWARD) - user.visible_message("[user] installs capacitor to [holder].", "You install capacitor to [holder].") + user.visible_message("[user] installs capacitor to [parent].", "You install capacitor to [parent].") else user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") if(14) if(diff==FORWARD) user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") else - user.visible_message("[user] removes the capacitor from [holder].", "You remove the capacitor from [holder].") + user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") if(15) if(diff==FORWARD) - user.visible_message("[user] installs the power cell into [holder].", "You install the power cell into [holder].") + user.visible_message("[user] installs the power cell into [parent].", "You install the power cell into [parent].") else user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") if(16) if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") if(17) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [holder].", "You install the internal armor layer to [holder].") + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") else user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") if(18) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") else - user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") if(19) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") if(20) if(diff==FORWARD) - user.visible_message("[user] installs Gygax Armor Plates to [holder].", "You install Gygax Armor Plates to [holder].") + user.visible_message("[user] installs Gygax Armor Plates to [parent].", "You install Gygax Armor Plates to [parent].") else - user.visible_message("[user] cuts the internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") if(21) if(diff==FORWARD) user.visible_message("[user] secures Gygax Armor Plates.", "You secure Gygax Armor Plates.") else - user.visible_message("[user] pries Gygax Armor Plates from [holder].", "You pry Gygax Armor Plates from [holder].") + user.visible_message("[user] pries Gygax Armor Plates from [parent].", "You pry Gygax Armor Plates from [parent].") if(22) if(diff==FORWARD) - user.visible_message("[user] welds Gygax Armor Plates to [holder].", "You weld Gygax Armor Plates to [holder].") + user.visible_message("[user] welds Gygax Armor Plates to [parent].", "You weld Gygax Armor Plates to [parent].") else user.visible_message("[user] unfastens Gygax Armor Plates.", "You unfasten Gygax Armor Plates.") return TRUE -/datum/construction/unordered/mecha_chassis/firefighter - result = /datum/construction/mecha/firefighter +/datum/component/construction/unordered/mecha_chassis/firefighter + result = /datum/component/construction/mecha/firefighter steps = list( /obj/item/mecha_parts/part/ripley_torso, /obj/item/mecha_parts/part/ripley_left_arm, @@ -609,7 +564,7 @@ /obj/item/clothing/suit/fire ) -/datum/construction/mecha/firefighter +/datum/component/construction/mecha/firefighter result = /obj/mecha/working/ripley/firefighter base_icon = "fireripley" steps = list( @@ -739,98 +694,98 @@ ), ) -/datum/construction/mecha/firefighter/custom_action(obj/item/I, mob/living/user, diff) +/datum/component/construction/mecha/firefighter/custom_action(obj/item/I, mob/living/user, diff) if(!..()) return FALSE //TODO: better messages. switch(index) if(1) - user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") if(2) if(diff==FORWARD) - user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") else - user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") if(3) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") else - user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") if(4) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") else - user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") if(5) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + user.visible_message("[user] installs the central control module into [parent].", "You install the central computer mainboard into [parent].") else - user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") if(6) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") else - user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") if(7) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + user.visible_message("[user] installs the peripherals control module into [parent].", "You install the peripherals control module into [parent].") else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") if(8) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") else - user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") if(9) if(diff==FORWARD) - user.visible_message("[user] installs the power cell into [holder].", "You install the power cell into [holder].") + user.visible_message("[user] installs the power cell into [parent].", "You install the power cell into [parent].") else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") if(10) if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") if(11) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [holder].", "You install the internal armor layer to [holder].") + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") else user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") if(12) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") else - user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") if(13) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") if(14) if(diff==FORWARD) - user.visible_message("[user] starts to install the external armor layer to [holder].", "You install the external armor layer to [holder].") + user.visible_message("[user] starts to install the external armor layer to [parent].", "You install the external armor layer to [parent].") else - user.visible_message("[user] cuts the internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") if(15) if(diff==FORWARD) - user.visible_message("[user] installs the external reinforced armor layer to [holder].", "You install the external reinforced armor layer to [holder].") + user.visible_message("[user] installs the external reinforced armor layer to [parent].", "You install the external reinforced armor layer to [parent].") else - user.visible_message("[user] removes the external armor from [holder].", "You remove the external armor from [holder].") + user.visible_message("[user] removes the external armor from [parent].", "You remove the external armor from [parent].") if(16) if(diff==FORWARD) user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") else - user.visible_message("[user] pries external armor layer from [holder].", "You pry external armor layer from [holder].") + user.visible_message("[user] pries external armor layer from [parent].", "You pry external armor layer from [parent].") if(17) if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to [holder].", "You weld the external armor layer to [holder].") + user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") else user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") return TRUE -/datum/construction/unordered/mecha_chassis/honker - result = /datum/construction/mecha/honker +/datum/component/construction/unordered/mecha_chassis/honker + result = /datum/component/construction/mecha/honker steps = list( /obj/item/mecha_parts/part/honker_torso, /obj/item/mecha_parts/part/honker_left_arm, @@ -840,7 +795,7 @@ /obj/item/mecha_parts/part/honker_head ) -/datum/construction/mecha/honker +/datum/component/construction/mecha/honker result = /obj/mecha/combat/honker steps = list( //1 @@ -916,38 +871,39 @@ ) // HONK doesn't have any construction step icons, so we just set an icon once. -/datum/construction/mecha/honker/update_holder(step_index) +/datum/component/construction/mecha/honker/update_parent(step_index) if(step_index == 1) - holder.icon = 'icons/mecha/mech_construct.dmi' - holder.icon_state = "honker_chassis" + var/atom/parent_atom = parent + parent_atom.icon = 'icons/mecha/mech_construct.dmi' + parent_atom.icon_state = "honker_chassis" ..() -/datum/construction/mecha/honker/custom_action(obj/item/I, mob/living/user, diff) +/datum/component/construction/mecha/honker/custom_action(obj/item/I, mob/living/user, diff) if(!..()) return FALSE if(istype(I, /obj/item/bikehorn)) - playsound(holder, 'sound/items/bikehorn.ogg', 50, 1) + playsound(parent, 'sound/items/bikehorn.ogg', 50, 1) user.visible_message("HONK!") //TODO: better messages. switch(index) if(2) - user.visible_message("[user] installs the central control module into [holder].", "You install the central control module into [holder].") + user.visible_message("[user] installs the central control module into [parent].", "You install the central control module into [parent].") if(4) - user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + user.visible_message("[user] installs the peripherals control module into [parent].", "You install the peripherals control module into [parent].") if(6) - user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") + user.visible_message("[user] installs the weapon control module into [parent].", "You install the weapon control module into [parent].") if(8) - user.visible_message("[user] installs the power cell into [holder].", "You install the power cell into [holder].") + user.visible_message("[user] installs the power cell into [parent].", "You install the power cell into [parent].") if(10) - user.visible_message("[user] puts clown wig and mask on [holder].", "You put clown wig and mask on [holder].") + user.visible_message("[user] puts clown wig and mask on [parent].", "You put clown wig and mask on [parent].") if(12) - user.visible_message("[user] puts clown boots on [holder].", "You put clown boots on [holder].") + user.visible_message("[user] puts clown boots on [parent].", "You put clown boots on [parent].") return TRUE -/datum/construction/unordered/mecha_chassis/durand - result = /datum/construction/mecha/durand +/datum/component/construction/unordered/mecha_chassis/durand + result = /datum/component/construction/mecha/durand steps = list( /obj/item/mecha_parts/part/durand_torso, /obj/item/mecha_parts/part/durand_left_arm, @@ -957,7 +913,7 @@ /obj/item/mecha_parts/part/durand_head ) -/datum/construction/mecha/durand +/datum/component/construction/mecha/durand result = /obj/mecha/combat/durand base_icon = "durand" steps = list( @@ -1125,125 +1081,125 @@ ) -/datum/construction/mecha/durand/custom_action(obj/item/I, mob/living/user, diff) +/datum/component/construction/mecha/durand/custom_action(obj/item/I, mob/living/user, diff) if(!..()) return FALSE //TODO: better messages. switch(index) if(1) - user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") if(2) if(diff==FORWARD) - user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") else - user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") if(3) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") else - user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") if(4) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") else - user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") if(5) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + user.visible_message("[user] installs the central control module into [parent].", "You install the central computer mainboard into [parent].") else - user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") if(6) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") else - user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") if(7) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + user.visible_message("[user] installs the peripherals control module into [parent].", "You install the peripherals control module into [parent].") else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") if(8) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") else - user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") if(9) if(diff==FORWARD) - user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") + user.visible_message("[user] installs the weapon control module into [parent].", "You install the weapon control module into [parent].") else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") if(10) if(diff==FORWARD) user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") else - user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].") + user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") if(11) if(diff==FORWARD) - user.visible_message("[user] installs scanner module to [holder].", "You install phasic scanner module to [holder].") + user.visible_message("[user] installs scanner module to [parent].", "You install phasic scanner module to [parent].") else user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") if(12) if(diff==FORWARD) user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") else - user.visible_message("[user] removes the scanner module from [holder].", "You remove the scanner module from [holder].") + user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") if(13) if(diff==FORWARD) - user.visible_message("[user] installs capacitor to [holder].", "You install capacitor to [holder].") + user.visible_message("[user] installs capacitor to [parent].", "You install capacitor to [parent].") else user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") if(14) if(diff==FORWARD) user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") else - user.visible_message("[user] removes the super capacitor from [holder].", "You remove the capacitor from [holder].") + user.visible_message("[user] removes the super capacitor from [parent].", "You remove the capacitor from [parent].") if(15) if(diff==FORWARD) - user.visible_message("[user] installs the power cell into [holder].", "You install the power cell into [holder].") + user.visible_message("[user] installs the power cell into [parent].", "You install the power cell into [parent].") else user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") if(16) if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") if(17) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [holder].", "You install the internal armor layer to [holder].") + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") else user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") if(18) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") else - user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") if(19) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") if(20) if(diff==FORWARD) - user.visible_message("[user] installs Durand Armor Plates to [holder].", "You install Durand Armor Plates to [holder].") + user.visible_message("[user] installs Durand Armor Plates to [parent].", "You install Durand Armor Plates to [parent].") else - user.visible_message("[user] cuts the internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") if(21) if(diff==FORWARD) user.visible_message("[user] secures Durand Armor Plates.", "You secure Durand Armor Plates.") else - user.visible_message("[user] pries Durand Armor Plates from [holder].", "You pry Durand Armor Plates from [holder].") + user.visible_message("[user] pries Durand Armor Plates from [parent].", "You pry Durand Armor Plates from [parent].") if(22) if(diff==FORWARD) - user.visible_message("[user] welds Durand Armor Plates to [holder].", "You weld Durand Armor Plates to [holder].") + user.visible_message("[user] welds Durand Armor Plates to [parent].", "You weld Durand Armor Plates to [parent].") else user.visible_message("[user] unfastens Durand Armor Plates.", "You unfasten Durand Armor Plates.") return TRUE //PHAZON -/datum/construction/unordered/mecha_chassis/phazon - result = /datum/construction/mecha/phazon +/datum/component/construction/unordered/mecha_chassis/phazon + result = /datum/component/construction/mecha/phazon steps = list( /obj/item/mecha_parts/part/phazon_torso, /obj/item/mecha_parts/part/phazon_left_arm, @@ -1253,7 +1209,7 @@ /obj/item/mecha_parts/part/phazon_head ) -/datum/construction/mecha/phazon +/datum/component/construction/mecha/phazon result = /obj/mecha/combat/phazon base_icon = "phazon" steps = list( @@ -1461,144 +1417,144 @@ ) -/datum/construction/mecha/phazon/custom_action(obj/item/I, mob/living/user, diff) +/datum/component/construction/mecha/phazon/custom_action(obj/item/I, mob/living/user, diff) if(!..()) return FALSE //TODO: better messages. switch(index) if(1) - user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") if(2) if(diff==FORWARD) - user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") else - user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") if(3) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") else - user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") if(4) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") else - user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") if(5) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + user.visible_message("[user] installs the central control module into [parent].", "You install the central computer mainboard into [parent].") else - user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") if(6) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") else - user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") if(7) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + user.visible_message("[user] installs the peripherals control module into [parent].", "You install the peripherals control module into [parent].") else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") if(8) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") else - user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") if(9) if(diff==FORWARD) - user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") + user.visible_message("[user] installs the weapon control module into [parent].", "You install the weapon control module into [parent].") else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") if(10) if(diff==FORWARD) user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") else - user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].") + user.visible_message("[user] removes the weapon control module from [parent].", "You remove the weapon control module from [parent].") if(11) if(diff==FORWARD) - user.visible_message("[user] installs phasic scanner module to [holder].", "You install scanner module to [holder].") + user.visible_message("[user] installs phasic scanner module to [parent].", "You install scanner module to [parent].") else user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") if(12) if(diff==FORWARD) user.visible_message("[user] secures the phasic scanner module.", "You secure the scanner module.") else - user.visible_message("[user] removes the phasic scanner module from [holder].", "You remove the scanner module from [holder].") + user.visible_message("[user] removes the phasic scanner module from [parent].", "You remove the scanner module from [parent].") if(13) if(diff==FORWARD) - user.visible_message("[user] installs super capacitor to [holder].", "You install capacitor to [holder].") + user.visible_message("[user] installs super capacitor to [parent].", "You install capacitor to [parent].") else user.visible_message("[user] unfastens the phasic scanner module.", "You unfasten the scanner module.") if(14) if(diff==FORWARD) user.visible_message("[user] secures the super capacitor.", "You secure the capacitor.") else - user.visible_message("[user] removes the super capacitor from [holder].", "You remove the capacitor from [holder].") + user.visible_message("[user] removes the super capacitor from [parent].", "You remove the capacitor from [parent].") if(15) if(diff==FORWARD) user.visible_message("[user] installs the bluespace crystal.", "You install the bluespace crystal.") else - user.visible_message("[user] unsecures the super capacitor from [holder].", "You unsecure the capacitor from [holder].") + user.visible_message("[user] unsecures the super capacitor from [parent].", "You unsecure the capacitor from [parent].") if(16) if(diff==FORWARD) user.visible_message("[user] connects the bluespace crystal.", "You connect the bluespace crystal.") else - user.visible_message("[user] removes the bluespace crystal from [holder].", "You remove the bluespace crystal from [holder].") + user.visible_message("[user] removes the bluespace crystal from [parent].", "You remove the bluespace crystal from [parent].") if(17) if(diff==FORWARD) user.visible_message("[user] engages the bluespace crystal.", "You engage the bluespace crystal.") else - user.visible_message("[user] disconnects the bluespace crystal from [holder].", "You disconnect the bluespace crystal from [holder].") + user.visible_message("[user] disconnects the bluespace crystal from [parent].", "You disconnect the bluespace crystal from [parent].") if(18) if(diff==FORWARD) - user.visible_message("[user] installs the power cell into [holder].", "You install the power cell into [holder].") + user.visible_message("[user] installs the power cell into [parent].", "You install the power cell into [parent].") else user.visible_message("[user] disengages the bluespace crystal.", "You disengage the bluespace crystal.") if(19) if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") if(20) if(diff==FORWARD) - user.visible_message("[user] installs the phase armor layer to [holder].", "You install the phase armor layer to [holder].") + user.visible_message("[user] installs the phase armor layer to [parent].", "You install the phase armor layer to [parent].") else user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") if(21) if(diff==FORWARD) user.visible_message("[user] secures the phase armor layer.", "You secure the phase armor layer.") else - user.visible_message("[user] pries the phase armor layer from [holder].", "You pry the phase armor layer from [holder].") + user.visible_message("[user] pries the phase armor layer from [parent].", "You pry the phase armor layer from [parent].") if(22) if(diff==FORWARD) - user.visible_message("[user] welds the phase armor layer to [holder].", "You weld the phase armor layer to [holder].") + user.visible_message("[user] welds the phase armor layer to [parent].", "You weld the phase armor layer to [parent].") else user.visible_message("[user] unfastens the phase armor layer.", "You unfasten the phase armor layer.") if(23) if(diff==FORWARD) - user.visible_message("[user] installs Phazon Armor Plates to [holder].", "You install Phazon Armor Plates to [holder].") + user.visible_message("[user] installs Phazon Armor Plates to [parent].", "You install Phazon Armor Plates to [parent].") else - user.visible_message("[user] cuts phase armor layer from [holder].", "You cut the phase armor layer from [holder].") + user.visible_message("[user] cuts phase armor layer from [parent].", "You cut the phase armor layer from [parent].") if(24) if(diff==FORWARD) user.visible_message("[user] secures Phazon Armor Plates.", "You secure Phazon Armor Plates.") else - user.visible_message("[user] pries Phazon Armor Plates from [holder].", "You pry Phazon Armor Plates from [holder].") + user.visible_message("[user] pries Phazon Armor Plates from [parent].", "You pry Phazon Armor Plates from [parent].") if(25) if(diff==FORWARD) - user.visible_message("[user] welds Phazon Armor Plates to [holder].", "You weld Phazon Armor Plates to [holder].") + user.visible_message("[user] welds Phazon Armor Plates to [parent].", "You weld Phazon Armor Plates to [parent].") else user.visible_message("[user] unfastens Phazon Armor Plates.", "You unfasten Phazon Armor Plates.") if(26) if(diff==FORWARD) - user.visible_message("[user] carefully inserts the anomaly core into [holder] and secures it.", + user.visible_message("[user] carefully inserts the anomaly core into [parent] and secures it.", "You slowly place the anomaly core into its socket and close its chamber.") return TRUE //ODYSSEUS -/datum/construction/unordered/mecha_chassis/odysseus - result = /datum/construction/mecha/odysseus +/datum/component/construction/unordered/mecha_chassis/odysseus + result = /datum/component/construction/mecha/odysseus steps = list( /obj/item/mecha_parts/part/odysseus_torso, /obj/item/mecha_parts/part/odysseus_head, @@ -1608,7 +1564,7 @@ /obj/item/mecha_parts/part/odysseus_right_leg ) -/datum/construction/mecha/odysseus +/datum/component/construction/mecha/odysseus result = /obj/mecha/medical/odysseus base_icon = "odysseus" steps = list( @@ -1730,87 +1686,87 @@ ), ) -/datum/construction/mecha/odysseus/custom_action(obj/item/I, mob/living/user, diff) +/datum/component/construction/mecha/odysseus/custom_action(obj/item/I, mob/living/user, diff) if(!..()) return FALSE //TODO: better messages. switch(index) if(1) - user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + user.visible_message("[user] connects [parent] hydraulic systems", "You connect [parent] hydraulic systems.") if(2) if(diff==FORWARD) - user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") else - user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + user.visible_message("[user] disconnects [parent] hydraulic systems", "You disconnect [parent] hydraulic systems.") if(3) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") else - user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") + user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") if(4) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") else - user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") if(5) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + user.visible_message("[user] installs the central control module into [parent].", "You install the central computer mainboard into [parent].") else - user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") if(6) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") else - user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") if(7) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + user.visible_message("[user] installs the peripherals control module into [parent].", "You install the peripherals control module into [parent].") else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") if(8) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") else - user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") if(9) if(diff==FORWARD) - user.visible_message("[user] installs the power cell into [holder].", "You install the power cell into [holder].") + user.visible_message("[user] installs the power cell into [parent].", "You install the power cell into [parent].") else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") if(10) if(diff==FORWARD) user.visible_message("[user] secures the power cell.", "You secure the power cell.") else - user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + user.visible_message("[user] prys the power cell from [parent].", "You pry the power cell from [parent].") if(11) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [holder].", "You install the internal armor layer to [holder].") + user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") else user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") if(12) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") else - user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") if(13) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") if(14) if(diff==FORWARD) - user.visible_message("[user] installs the external armor layer to [holder].", "You install the external reinforced armor layer to [holder].") + user.visible_message("[user] installs the external armor layer to [parent].", "You install the external reinforced armor layer to [parent].") else - user.visible_message("[user] cuts the internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") if(15) if(diff==FORWARD) user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") else - user.visible_message("[user] pries the external armor layer from [holder].", "You pry the external armor layer from [holder].") + user.visible_message("[user] pries the external armor layer from [parent].", "You pry the external armor layer from [parent].") if(16) if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to [holder].", "You weld the external armor layer to [holder].") + user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") else user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") return TRUE diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 566be391cc..1713b36c37 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -12,17 +12,12 @@ /obj/item/mecha_parts/chassis name = "Mecha Chassis" icon_state = "backbone" - var/datum/construction/construct var/construct_type /obj/item/mecha_parts/chassis/Initialize() . = ..() if(construct_type) - construct = new construct_type(src) - -/obj/item/mecha_parts/chassis/attackby(obj/item/W, mob/user, params) - if(!construct || !construct.action(W, user)) - return ..() + AddComponent(construct_type) /obj/item/mecha_parts/chassis/attack_hand() return @@ -31,7 +26,7 @@ /obj/item/mecha_parts/chassis/ripley name = "\improper Ripley chassis" - construct_type = /datum/construction/unordered/mecha_chassis/ripley + construct_type = /datum/component/construction/unordered/mecha_chassis/ripley /obj/item/mecha_parts/part/ripley_torso name = "\improper Ripley torso" @@ -62,7 +57,7 @@ /obj/item/mecha_parts/chassis/odysseus name = "\improper Odysseus chassis" - construct_type = /datum/construction/unordered/mecha_chassis/odysseus + construct_type = /datum/component/construction/unordered/mecha_chassis/odysseus /obj/item/mecha_parts/part/odysseus_head name = "\improper Odysseus head" @@ -98,7 +93,7 @@ /obj/item/mecha_parts/chassis/gygax name = "\improper Gygax chassis" - construct_type = /datum/construction/unordered/mecha_chassis/gygax + construct_type = /datum/component/construction/unordered/mecha_chassis/gygax /obj/item/mecha_parts/part/gygax_torso name = "\improper Gygax torso" @@ -141,7 +136,7 @@ /obj/item/mecha_parts/chassis/durand name = "\improper Durand chassis" - construct_type = /datum/construction/unordered/mecha_chassis/durand + construct_type = /datum/component/construction/unordered/mecha_chassis/durand /obj/item/mecha_parts/part/durand_torso name = "\improper Durand torso" @@ -183,14 +178,14 @@ /obj/item/mecha_parts/chassis/firefighter name = "\improper Firefighter chassis" - construct_type = /datum/construction/unordered/mecha_chassis/firefighter + construct_type = /datum/component/construction/unordered/mecha_chassis/firefighter ////////// HONK /obj/item/mecha_parts/chassis/honker name = "\improper H.O.N.K chassis" - construct_type = /datum/construction/unordered/mecha_chassis/honker + construct_type = /datum/component/construction/unordered/mecha_chassis/honker /obj/item/mecha_parts/part/honker_torso name = "\improper H.O.N.K torso" @@ -227,7 +222,7 @@ /obj/item/mecha_parts/chassis/phazon name = "\improper Phazon chassis" - construct_type = /datum/construction/unordered/mecha_chassis/phazon + construct_type = /datum/component/construction/unordered/mecha_chassis/phazon /obj/item/mecha_parts/part/phazon_torso name="\improper Phazon torso" diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 2f8aff3a13..e5e9f578b2 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -193,9 +193,9 @@ var/turf/T = safepick(get_area_turfs(impact_area)) if(T) // Calculate new position (searches through beacons in world) - var/obj/item/device/radio/beacon/chosen + var/obj/item/device/beacon/chosen var/list/possible = list() - for(var/obj/item/device/radio/beacon/W in GLOB.teleportbeacons) + for(var/obj/item/device/beacon/W in GLOB.teleportbeacons) possible += W if(possible.len > 0) @@ -218,7 +218,7 @@ var/y_distance = TO.y - FROM.y var/x_distance = TO.x - FROM.x for (var/atom/movable/A in urange(12, FROM )) // iterate thru list of mobs in the area - if(istype(A, /obj/item/device/radio/beacon)) + if(istype(A, /obj/item/device/beacon)) continue // don't teleport beacons because that's just insanely stupid if(A.anchored) continue diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index f1c18f50a6..c070c1a6ea 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -4,6 +4,7 @@ var/list/random_icon_states = list() var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints + var/beauty = 0 var/mergeable_decal = TRUE //when two of these are on a same tile or do we need to merge them into just one? /obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases) @@ -16,14 +17,20 @@ if(C != src && C.type == src.type && !QDELETED(C)) if (replace_decal(C)) return INITIALIZE_HINT_QDEL + if(LAZYLEN(diseases)) var/list/datum/disease/diseases_to_add = list() for(var/datum/disease/D in diseases) - if(D.spread_flags & VIRUS_SPREAD_CONTACT_FLUIDS) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS) diseases_to_add += D if(LAZYLEN(diseases_to_add)) AddComponent(/datum/component/infective, diseases_to_add) +/obj/effect/decal/cleanable/LateInitialize() + if(src.loc && isturf(src.loc)) + var/area/A = get_area(src) + A.beauty += beauty / max(1, A.areasize) //Ensures that the effects scale with room size + /obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal if(mergeable_decal) return TRUE @@ -90,3 +97,9 @@ return bloodiness else return 0 + +/obj/effect/decal/cleanable/Destroy() + . = ..() + if(src.loc && isturf(src.loc)) + var/area/A = get_area(src) + A.beauty -= beauty / max(1, A.areasize) diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm index 55d5d32ffc..79103c28aa 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -8,6 +8,7 @@ random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") bloodiness = MAX_SHOE_BLOODINESS blood_state = BLOOD_STATE_XENO + beauty = -200 /obj/effect/decal/cleanable/xenoblood/Initialize() . = ..() diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 9d9d8d17a4..7b2c00a0b6 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -6,6 +6,7 @@ random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") blood_state = BLOOD_STATE_HUMAN bloodiness = MAX_SHOE_BLOODINESS + beauty = -200 /obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) C.add_blood_DNA(return_blood_DNA()) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 3ff1bdc19f..e5253d4b85 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -3,6 +3,7 @@ desc = "Someone should clean that up." icon = 'icons/obj/objects.dmi' icon_state = "shards" + beauty = -150 /obj/effect/decal/cleanable/ash name = "ashes" @@ -10,6 +11,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "ash" mergeable_decal = FALSE + beauty = -150 /obj/effect/decal/cleanable/ash/Initialize() . = ..() @@ -24,6 +26,7 @@ /obj/effect/decal/cleanable/ash/large name = "large pile of ashes" icon_state = "big_ash" + beauty = -150 /obj/effect/decal/cleanable/ash/large/Initialize() . = ..() @@ -34,6 +37,7 @@ desc = "Back to sand." icon = 'icons/obj/shards.dmi' icon_state = "tiny" + beauty = -20 /obj/effect/decal/cleanable/glass/Initialize() . = ..() @@ -47,17 +51,20 @@ desc = "Someone should clean that up." icon_state = "dirt" mouse_opacity = MOUSE_OPACITY_TRANSPARENT + beauty = -150 /obj/effect/decal/cleanable/flour name = "flour" desc = "It's still good. Four second rule!" icon_state = "flour" + beauty = -100 /obj/effect/decal/cleanable/greenglow name = "glowing goo" desc = "Jeez. I hope that's not for lunch." light_color = LIGHT_COLOR_GREEN icon_state = "greenglow" + beauty = -100 /obj/effect/decal/cleanable/greenglow/Initialize(mapload) . = ..() @@ -73,6 +80,7 @@ layer = WALL_OBJ_LAYER icon_state = "cobweb1" resistance_flags = FLAMMABLE + beauty = -150 /obj/effect/decal/cleanable/cobweb/cobweb2 icon_state = "cobweb2" @@ -84,10 +92,12 @@ icon = 'icons/effects/effects.dmi' icon_state = "molten" mergeable_decal = FALSE + beauty = -250 /obj/effect/decal/cleanable/molten_object/large name = "big gooey grey mass" icon_state = "big_molten" + beauty = -200 //Vomit (sorry) /obj/effect/decal/cleanable/vomit @@ -96,6 +106,7 @@ icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") + beauty = -400 /obj/effect/decal/cleanable/vomit/attack_hand(mob/user) if(ishuman(user)) @@ -127,12 +138,14 @@ gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") + beauty = -125 /obj/effect/decal/cleanable/plant_smudge name = "plant smudge" gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_plant") + beauty = -125 /obj/effect/decal/cleanable/egg_smudge name = "smashed egg" @@ -140,6 +153,7 @@ gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") + beauty = -125 /obj/effect/decal/cleanable/pie_smudge //honk name = "smashed pie" @@ -147,6 +161,7 @@ gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") + beauty = -125 /obj/effect/decal/cleanable/chem_pile name = "chemical pile" @@ -154,6 +169,7 @@ gender = NEUTER icon = 'icons/obj/objects.dmi' icon_state = "ash" + beauty = -125 /obj/effect/decal/cleanable/shreds name = "shreds" @@ -161,6 +177,7 @@ icon_state = "shreds" gender = PLURAL mergeable_decal = FALSE + beauty = -125 /obj/effect/decal/cleanable/shreds/ex_act(severity, target) if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion. @@ -177,12 +194,14 @@ icon = 'icons/effects/tomatodecal.dmi' icon_state = "salt_pile" gender = NEUTER + beauty = -125 /obj/effect/decal/cleanable/glitter name = "generic glitter pile" desc = "The herpes of arts and crafts." icon = 'icons/effects/tile_effects.dmi' gender = NEUTER + beauty = 300 /obj/effect/decal/cleanable/glitter/pink name = "pink glitter" @@ -200,4 +219,5 @@ name = "stabilized plasma" desc = "A puddle of stabilized plasma." icon_state = "flour" - color = "#C8A5DC" \ No newline at end of file + color = "#C8A5DC" + beauty = -200 diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index b0159818eb..b70b500bba 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -10,6 +10,7 @@ blood_state = BLOOD_STATE_OIL bloodiness = MAX_SHOE_BLOODINESS mergeable_decal = FALSE + beauty = -200 /obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions) set waitfor = 0 @@ -46,6 +47,7 @@ random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") blood_state = BLOOD_STATE_OIL bloodiness = MAX_SHOE_BLOODINESS + beauty = -125 /obj/effect/decal/cleanable/oil/Initialize() . = ..() @@ -57,4 +59,4 @@ /obj/effect/decal/cleanable/oil/slippery /obj/effect/decal/cleanable/oil/slippery/Initialize() - AddComponent(/datum/component/slippery, 80, (NO_SLIP_WHEN_WALKING | SLIDE)) \ No newline at end of file + AddComponent(/datum/component/slippery, 80, (NO_SLIP_WHEN_WALKING | SLIDE)) diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 31e0f1c540..75fe78959d 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -30,4 +30,4 @@ /obj/effect/decal/cleanable/robot_debris/old name = "dusty robot debris" - desc = "Looks like nobody has touched this in a while." \ No newline at end of file + desc = "Looks like nobody has touched this in a while." diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 65e69a2e55..b169f9944f 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -136,6 +136,7 @@ chainsaw.attack_self(victim) chainsaw.wield(victim) victim.reagents.add_reagent("adminordrazine",25) + to_chat(victim, "KILL, KILL, KILL! YOU HAVE NO ALLIES ANYMORE, KILL THEM ALL!") victim.client.color = pure_red animate(victim.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT) diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm index be32f0df19..2fe8d2a460 100644 --- a/code/game/objects/effects/spawners/bundle.dm +++ b/code/game/objects/effects/spawners/bundle.dm @@ -22,7 +22,7 @@ /obj/item/reagent_containers/food/snacks/egg) /obj/effect/spawner/bundle/costume/gladiator - name = "gladitator costume spawner" + name = "gladiator costume spawner" items = list( /obj/item/clothing/under/gladiator, /obj/item/clothing/head/helmet/gladiator) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4267f69657..b5c4e5bfb8 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -250,7 +250,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) can_handle_hot = TRUE else if(C.gloves && (C.gloves.max_heat_protection_temperature > 360)) can_handle_hot = TRUE - else if(RESISTHOT in C.dna.species.species_traits) + else if(C.has_trait(TRAIT_RESISTHEAT)) can_handle_hot = TRUE if(can_handle_hot) @@ -510,12 +510,18 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) to_chat(user, "You cannot locate any organic eyes on this brain!") return + if(user.staminaloss >= STAMINA_SOFTCRIT)//CIT CHANGE - makes eyestabbing impossible if you're in stamina softcrit + to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto + return //CIT CHANGE - ditto + src.add_fingerprint(user) playsound(loc, src.hitsound, 30, 1, -1) user.do_attack_animation(M) + user.adjustStaminaLossBuffered(10)//CIT CHANGE - makes eyestabbing cost stamina + if(M != user) M.visible_message("[user] has stabbed [M] in the eye with [src]!", \ "[user] stabs you in the eye with [src]!") @@ -531,6 +537,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) else M.take_bodypart_damage(7) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("eye_stab", /datum/mood_event/eye_stab) + add_logs(user, M, "attacked", "[src.name]", "(INTENT: [uppertext(user.a_intent)])") M.adjust_blurriness(3) @@ -674,6 +684,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return 0 /obj/item/attack_animal(mob/living/simple_animal/M) + if (obj_flags & CAN_BE_HIT) + return ..() return 0 /obj/item/mech_melee_attack(obj/mecha/M) @@ -820,4 +832,4 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // Returns a numeric value for sorting items used as parts in machines, so they can be replaced by the rped /obj/item/proc/get_part_rating() - return 0 \ No newline at end of file + return 0 diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 4a911f9002..12360ec353 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -6,6 +6,7 @@ CONTAINS: RCD ARCD +RLD */ /obj/item/construction @@ -30,6 +31,8 @@ ARCD var/sheetmultiplier = 4 //Controls the amount of matter added for each glass/metal sheet, triple for plasteel var/plasteelmultiplier = 3 //Plasteel is worth 3 times more than glass or metal var/no_ammo_message = "The \'Low Ammo\' light on the device blinks yellow." + var/has_ammobar = FALSE //controls whether or not does update_icon apply ammo indicator overlays + var/ammo_sections = 10 //amount of divisions in the ammo indicator overlay/number of ammo indicator states /obj/item/construction/Initialize() . = ..() @@ -66,6 +69,7 @@ ARCD to_chat(user, "[src] now holds [matter]/[max_matter] matter-units.") else return ..() + update_icon() //ensures that ammo counters (if present) get updated /obj/item/construction/proc/loadwithsheets(obj/item/stack/sheet/S, value, mob/user) var/maxsheets = round((max_matter-matter)/value) //calculate the max number of sheets that will fit in RCD @@ -100,6 +104,8 @@ ARCD . = matter >= amount if(!. && user) to_chat(user, no_ammo_message) + if(has_ammobar) + flick("[icon_state]_empty", src) //somewhat hacky thing to make RCDs with ammo counters actually have a blinking yellow light return . /obj/item/construction/proc/range_check(atom/A, mob/user) @@ -124,6 +130,7 @@ ARCD righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' max_matter = 160 flags_2 = NO_MAT_REDEMPTION_2 + has_ammobar = TRUE var/mode = 1 var/ranged = FALSE var/airlock_type = /obj/machinery/door/airlock @@ -135,7 +142,6 @@ ARCD var/delay_mod = 1 var/canRturf = FALSE //Variable for R walls to deconstruct them - /obj/item/construction/rcd/suicide_act(mob/user) user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..") return (BRUTELOSS) @@ -381,6 +387,16 @@ ARCD explosion(src, 0, 0, 3, 1, flame_range = 1) qdel(src) +/obj/item/construction/rcd/update_icon() + ..() + if(has_ammobar) + var/ratio = CEILING((matter / max_matter) * ammo_sections, 1) + cut_overlays() //To prevent infinite stacking of overlays + add_overlay("[icon_state]_charge[ratio]") + +/obj/item/construction/rcd/Initialize() + ..() + update_icon() /obj/item/construction/rcd/borg no_ammo_message = "Insufficient charge." @@ -419,6 +435,8 @@ ARCD /obj/item/construction/rcd/combat name = "industrial RCD" + icon_state = "ircd" + item_state = "ircd" max_matter = 500 matter = 500 canRturf = TRUE @@ -456,7 +474,8 @@ ARCD delay_mod = 0.6 ranged = TRUE icon_state = "arcd" - item_state = "rcd" + item_state = "oldrcd" + has_ammobar = FALSE /obj/item/construction/rcd/arcd/afterattack(atom/A, mob/user) if(!range_check(A,user)) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index e3c74a4ddf..0383121308 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -191,6 +191,7 @@ FD.CalculateAffectingAreas() to_chat(usr, "You rename the '[prevname]' to '[str]'.") log_game("[key_name(usr)] has renamed [prevname] to [str]") + A.update_area_size() interact() return 1 diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index f5d217f0b0..08e6204c63 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -293,6 +293,14 @@ update_label("John Doe", "Clowny") access = get_all_accesses()+get_ert_access("med")-ACCESS_CHANGE_IDS . = ..() +/obj/item/card/id/ert/chaplain + registered_name = "Religious Response Officer" + assignment = "Religious Response Officer" + +/obj/item/card/id/ert/chaplain/Initialize() + access = get_all_accesses()+get_ert_access("sec")-ACCESS_CHANGE_IDS + . = ..() + /obj/item/card/id/prisoner name = "prisoner ID card" desc = "You are a number, you are not a free man." diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index e622026d21..f2b656a074 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -549,6 +549,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/hitzone = user.held_index_to_dir(user.active_hand_index) == "r" ? "r_hand" : "l_hand" user.apply_damage(5, BURN, hitzone) user.visible_message("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn their finger in the process.", "You burn yourself while lighting the lighter!") + GET_COMPONENT_FROM(mood, /datum/component/mood, user) + if(mood) + mood.add_event("burnt_thumb", /datum/mood_event/burnt_thumb) else set_lit(FALSE) diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index 12b54a3751..053d450f4f 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -24,6 +24,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells. */ /obj/item/circuitboard/machine + var/needs_anchored = TRUE // Whether this machine must be anchored to be constructed. var/list/req_components // Components required by the machine. // Example: list(/obj/item/stock_parts/matter_bin = 5) diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 24038d9c69..f3c047715e 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -111,6 +111,10 @@ name = "Cloning (Computer Board)" build_path = /obj/machinery/computer/cloning +/obj/item/circuitboard/computer/prototype_cloning + name = "Prototype Cloning (Computer Board)" + build_path = /obj/machinery/computer/prototype_cloning + /obj/item/circuitboard/computer/arcade/battle name = "Arcade Battle (Computer Board)" build_path = /obj/machinery/computer/arcade/battle diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index add2fd5abb..a26301693f 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -31,6 +31,10 @@ /obj/item/stock_parts/manipulator = 2, /obj/item/stack/sheet/glass = 1) +/obj/item/circuitboard/machine/clonepod/experimental + name = "Experimental Clone Pod (Machine Board)" + build_path = /obj/machinery/clonepod/experimental + /obj/item/circuitboard/machine/abductor name = "alien board (Report This)" icon_state = "abductor_mod" @@ -53,6 +57,7 @@ name = "AI Holopad (Machine Board)" build_path = /obj/machinery/holopad req_components = list(/obj/item/stock_parts/capacitor = 1) + needs_anchored = FALSE //wew lad /obj/item/circuitboard/machine/launchpad name = "Bluespace Launchpad (Machine Board)" @@ -84,11 +89,13 @@ name = "Weapon Recharger (Machine Board)" build_path = /obj/machinery/recharger req_components = list(/obj/item/stock_parts/capacitor = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/cell_charger name = "Cell Charger (Machine Board)" build_path = /obj/machinery/cell_charger req_components = list(/obj/item/stock_parts/capacitor = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/cyborgrecharger name = "Cyborg Recharger (Machine Board)" @@ -105,6 +112,7 @@ req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/space_heater name = "Space Heater (Machine Board)" @@ -113,6 +121,7 @@ /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/capacitor = 1, /obj/item/stack/cable_coil = 3) + needs_anchored = FALSE /obj/item/circuitboard/machine/telecomms/broadcaster name = "Subspace Broadcaster (Machine Board)" @@ -209,6 +218,7 @@ /obj/machinery/vending/clothing = "ClothesMate", /obj/machinery/vending/medical = "NanoMed Plus", /obj/machinery/vending/wallmed = "NanoMed") + needs_anchored = FALSE /obj/item/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) @@ -312,6 +322,7 @@ name = "circuit board (Deep Fryer)" build_path = /obj/machinery/deepfryer req_components = list(/obj/item/stock_parts/micro_laser = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/gibber name = "Gibber (Machine Board)" @@ -319,6 +330,7 @@ req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/monkey_recycler name = "Monkey Recycler (Machine Board)" @@ -326,6 +338,7 @@ req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/processor name = "Food Processor (Machine Board)" @@ -333,6 +346,7 @@ req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/processor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) @@ -362,6 +376,7 @@ /obj/machinery/smartfridge/chemistry = "chems", /obj/machinery/smartfridge/chemistry/virology = "viruses", /obj/machinery/smartfridge/disks = "disks") + needs_anchored = FALSE /obj/item/circuitboard/machine/smartfridge/Initialize(mapload, new_type) if(new_type) @@ -416,6 +431,7 @@ /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 1, /obj/item/stack/sheet/glass = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/seed_extractor name = "Seed Extractor (Machine Board)" @@ -423,6 +439,7 @@ req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/ore_redemption name = "Ore Redemption (Machine Board)" @@ -433,6 +450,7 @@ /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/manipulator = 1, /obj/item/device/assembly/igniter = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/mining_equipment_vendor name = "Mining Equipment Vendor (Machine Board)" @@ -460,6 +478,7 @@ /obj/item/stock_parts/micro_laser = 1, /obj/item/stack/cable_coil = 2, /obj/item/stock_parts/capacitor = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/pacman/super name = "SUPERPACMAN-type Generator (Machine Board)" @@ -504,6 +523,7 @@ req_components = list( /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/manipulator = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/smes name = "SMES (Machine Board)" @@ -519,19 +539,15 @@ desc = "You can use a screwdriver to switch between Research and Power Generation" build_path = /obj/machinery/power/tesla_coil req_components = list(/obj/item/stock_parts/capacitor = 1) + needs_anchored = FALSE -#define PATH_POWERCOIL /obj/item/circuitboard/machine/tesla_coil/power -#define PATH_RPCOIL /obj/item/circuitboard/machine/tesla_coil/research +#define PATH_POWERCOIL /obj/machinery/power/tesla_coil/power +#define PATH_RPCOIL /obj/machinery/power/tesla_coil/research /obj/item/circuitboard/machine/tesla_coil/Initialize() . = ..() - if(!build_path) - if(prob(50)) - name = "Tesla Coil (Machine Board)" - build_path = PATH_POWERCOIL - else - name = "Tesla Corona Researcher (Machine Board)" - build_path = PATH_RPCOIL + if(build_path) + build_path = PATH_POWERCOIL /obj/item/circuitboard/machine/tesla_coil/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) @@ -566,6 +582,7 @@ name = "Grounding Rod (Machine Board)" build_path = /obj/machinery/power/grounding_rod req_components = list(/obj/item/stock_parts/capacitor = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/power_compressor name = "Power Compressor (Machine Board)" @@ -591,6 +608,7 @@ /obj/item/stack/sheet/glass = 1, /obj/item/stock_parts/cell = 1) def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high) + needs_anchored = FALSE /obj/item/circuitboard/machine/smoke_machine name = "Smoke Machine (Machine Board)" @@ -601,6 +619,7 @@ /obj/item/stock_parts/manipulator = 1, /obj/item/stack/sheet/glass = 1, /obj/item/stock_parts/cell = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/chem_heater name = "Chemical Heater (Machine Board)" @@ -616,6 +635,7 @@ /obj/item/reagent_containers/glass/beaker = 2, /obj/item/stock_parts/manipulator = 1, /obj/item/stack/sheet/glass = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/chem_master/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) @@ -637,6 +657,7 @@ build_path = /obj/machinery/reagentgrinder/constructed req_components = list( /obj/item/stock_parts/manipulator = 1) + needs_anchored = FALSE /obj/item/circuitboard/machine/chem_master/condi name = "CondiMaster 3000 (Machine Board)" @@ -644,7 +665,7 @@ /obj/item/circuitboard/machine/circuit_imprinter name = "Circuit Imprinter (Machine Board)" - build_path = /obj/machinery/rnd/circuit_imprinter + build_path = /obj/machinery/rnd/production/circuit_imprinter req_components = list( /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1, @@ -652,11 +673,11 @@ /obj/item/circuitboard/machine/circuit_imprinter/department name = "Departmental Circuit Imprinter (Machine Board)" - build_path = /obj/machinery/rnd/circuit_imprinter/department + build_path = /obj/machinery/rnd/production/circuit_imprinter/department /obj/item/circuitboard/machine/circuit_imprinter/department/science name = "Departmental Circuit Imprinter - Science (Machine Board)" - build_path = /obj/machinery/rnd/circuit_imprinter/department/science + build_path = /obj/machinery/rnd/production/circuit_imprinter/department/science /obj/item/circuitboard/machine/destructive_analyzer name = "Destructive Analyzer (Machine Board)" @@ -676,7 +697,7 @@ /obj/item/circuitboard/machine/protolathe name = "Protolathe (Machine Board)" - build_path = /obj/machinery/rnd/protolathe + build_path = /obj/machinery/rnd/production/protolathe req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 2, @@ -684,31 +705,67 @@ /obj/item/circuitboard/machine/protolathe/department name = "Departmental Protolathe (Machine Board)" - build_path = /obj/machinery/rnd/protolathe/department + build_path = /obj/machinery/rnd/production/protolathe/department /obj/item/circuitboard/machine/protolathe/department/cargo name = "Departmental Protolathe (Machine Board) - Cargo" - build_path = /obj/machinery/rnd/protolathe/department/cargo + build_path = /obj/machinery/rnd/production/protolathe/department/cargo /obj/item/circuitboard/machine/protolathe/department/engineering name = "Departmental Protolathe (Machine Board) - Engineering" - build_path = /obj/machinery/rnd/protolathe/department/engineering + build_path = /obj/machinery/rnd/production/protolathe/department/engineering /obj/item/circuitboard/machine/protolathe/department/medical name = "Departmental Protolathe (Machine Board) - Medical" - build_path = /obj/machinery/rnd/protolathe/department/medical + build_path = /obj/machinery/rnd/production/protolathe/department/medical /obj/item/circuitboard/machine/protolathe/department/science name = "Departmental Protolathe (Machine Board) - Science" - build_path = /obj/machinery/rnd/protolathe/department/science + build_path = /obj/machinery/rnd/production/protolathe/department/science /obj/item/circuitboard/machine/protolathe/department/security name = "Departmental Protolathe (Machine Board) - Security" - build_path = /obj/machinery/rnd/protolathe/department/security + build_path = /obj/machinery/rnd/production/protolathe/department/security /obj/item/circuitboard/machine/protolathe/department/service name = "Departmental Protolathe - Service (Machine Board)" - build_path = /obj/machinery/rnd/protolathe/department/service + build_path = /obj/machinery/rnd/production/protolathe/department/service + +/obj/item/circuitboard/machine/techfab + name = "\improper Techfab (Machine Board)" + build_path = /obj/machinery/rnd/production/techfab + req_components = list( + /obj/item/stock_parts/matter_bin = 2, + /obj/item/stock_parts/manipulator = 2, + /obj/item/reagent_containers/glass/beaker = 2) + +/obj/item/circuitboard/machine/techfab/department + name = "\improper Departmental Techfab (Machine Board)" + build_path = /obj/machinery/rnd/production/techfab/department + +/obj/item/circuitboard/machine/techfab/department/cargo + name = "\improper Departmental Techfab (Machine Board) - Cargo" + build_path = /obj/machinery/rnd/production/techfab/department/cargo + +/obj/item/circuitboard/machine/techfab/department/engineering + name = "\improper Departmental Techfab (Machine Board) - Engineering" + build_path = /obj/machinery/rnd/production/techfab/department/engineering + +/obj/item/circuitboard/machine/techfab/department/medical + name = "\improper Departmental Techfab (Machine Board) - Medical" + build_path = /obj/machinery/rnd/production/techfab/department/medical + +/obj/item/circuitboard/machine/techfab/department/science + name = "\improper Departmental Techfab (Machine Board) - Science" + build_path = /obj/machinery/rnd/production/techfab/department/science + +/obj/item/circuitboard/machine/techfab/department/security + name = "\improper Departmental Techfab (Machine Board) - Security" + build_path = /obj/machinery/rnd/production/techfab/department/security + +/obj/item/circuitboard/machine/techfab/department/service + name = "\improper Departmental Techfab - Service (Machine Board)" + build_path = /obj/machinery/rnd/production/techfab/department/service /obj/item/circuitboard/machine/rdserver name = "R&D Server (Machine Board)" @@ -754,6 +811,7 @@ /obj/item/stock_parts/matter_bin = 1, /obj/item/stack/cable_coil = 2, /obj/item/stack/sheet/glass = 2) + needs_anchored = FALSE /obj/item/circuitboard/machine/vending/donksofttoyvendor name = "Donksoft Toy Vendor (Machine Board)" @@ -771,6 +829,7 @@ /obj/item/stock_parts/matter_bin = 2) var/suction = TRUE var/transmit = TRUE + needs_anchored = FALSE /obj/item/circuitboard/machine/dish_drive/examine(mob/user) ..() diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 28171186fe..376f003232 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -116,6 +116,11 @@ . = ..() AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50) +/obj/item/weapon/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("honk", /datum/mood_event/honk) + /obj/item/bikehorn/suicide_act(mob/user) user.visible_message("[user] solemnly points the horn at [user.p_their()] temple! It looks like [user.p_theyre()] trying to commit suicide!") playsound(src, 'sound/items/bikehorn.ogg', 50, 1) diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index ca51595124..ce674ceb94 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -13,12 +13,12 @@ w_class = WEIGHT_CLASS_TINY var/mode = WAND_OPEN var/region_access = 1 //See access.dm - var/obj/item/card/id/ID + var/list/access_list -/obj/item/door_remote/New() - ..() - ID = new /obj/item/card/id - ID.access = get_region_accesses(region_access) +/obj/item/door_remote/Initialize() + . = ..() + access_list = get_region_accesses(region_access) + AddComponent(/datum/component/ntnet_interface) /obj/item/door_remote/attack_self(mob/user) switch(mode) @@ -30,35 +30,30 @@ mode = WAND_OPEN to_chat(user, "Now in mode: [mode].") -/obj/item/door_remote/afterattack(obj/machinery/door/airlock/D, mob/user) - if(!istype(D)) +// Airlock remote works by sending NTNet packets to whatever it's pointed at. +/obj/item/door_remote/afterattack(atom/A, mob/user) + GET_COMPONENT_FROM(target_interface, /datum/component/ntnet_interface, A) + + if(!target_interface) return - if(!(D.hasPower())) - to_chat(user, "[D] has no power!") - return - if(!D.requiresID()) - to_chat(user, "[D]'s ID scan is disabled!") - return - if(D.check_access(ID) && D.canAIControl(user)) - switch(mode) - if(WAND_OPEN) - if(D.density) - D.open() - else - D.close() - if(WAND_BOLT) - if(D.locked) - D.unbolt() - else - D.bolt() - if(WAND_EMERGENCY) - if(D.emergency) - D.emergency = FALSE - else - D.emergency = TRUE - D.update_icon() - else - to_chat(user, "[src] does not have access to this door.") + + // Generate a control packet. + var/datum/netdata/data = new + data.recipient_ids = list(target_interface.hardware_id) + + switch(mode) + if(WAND_OPEN) + data.plaintext_data = "open" + if(WAND_BOLT) + data.plaintext_data = "bolt" + if(WAND_EMERGENCY) + data.plaintext_data = "emergency" + + data.plaintext_data_secondary = "toggle" + data.passkey = access_list + + ntnet_send(data) + /obj/item/door_remote/omni name = "omni door remote" diff --git a/code/game/objects/items/devices/beacon.dm b/code/game/objects/items/devices/beacon.dm new file mode 100644 index 0000000000..5611784f8c --- /dev/null +++ b/code/game/objects/items/devices/beacon.dm @@ -0,0 +1,44 @@ +/obj/item/device/beacon + name = "\improper tracking beacon" + desc = "A beacon used by a teleporter." + icon = 'icons/obj/device.dmi' + icon_state = "beacon" + item_state = "beacon" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + var/enabled = TRUE + var/renamed = FALSE + +/obj/item/device/beacon/Initialize() + . = ..() + if (enabled) + GLOB.teleportbeacons += src + else + icon_state = "beacon-off" + +/obj/item/device/beacon/Destroy() + GLOB.teleportbeacons.Remove(src) + return ..() + +/obj/item/device/beacon/attack_self(mob/user) + enabled = !enabled + if (enabled) + icon_state = "beacon" + GLOB.teleportbeacons += src + else + icon_state = "beacon-off" + GLOB.teleportbeacons.Remove(src) + to_chat(user, "You [enabled ? "enable" : "disable"] the beacon.") + return + +/obj/item/device/beacon/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/pen)) // needed for things that use custom names like the locator + var/new_name = stripped_input(user, "What would you like the name to be?") + if(!user.canUseTopic(src, BE_CLOSE)) + return + if(new_name) + name = new_name + renamed = TRUE + return + else + return ..() diff --git a/code/citadel/dogborgstuff.dm b/code/game/objects/items/devices/dogborg_sleeper.dm similarity index 56% rename from code/citadel/dogborgstuff.dm rename to code/game/objects/items/devices/dogborg_sleeper.dm index 67d8d7f669..1d9c669fc9 100644 --- a/code/citadel/dogborgstuff.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -1,316 +1,4 @@ -/obj/item/dogborg/jaws/big - name = "combat jaws" - icon = 'icons/mob/dogborg.dmi' - icon_state = "jaws" - desc = "The jaws of the law." - flags_1 = CONDUCT_1 - force = 12 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' - attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - w_class = 3 - sharpness = IS_SHARP - -/obj/item/dogborg/jaws/small - name = "puppy jaws" - icon = 'icons/mob/dogborg.dmi' - icon_state = "smalljaws" - desc = "The jaws of a small dog." - flags_1 = CONDUCT_1 - force = 6 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' - attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - w_class = 3 - sharpness = IS_SHARP - -/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user) - ..() - user.do_attack_animation(A, ATTACK_EFFECT_BITE) - -/obj/item/dogborg/jaws/small/attack_self(mob/user) - var/mob/living/silicon/robot.R = user - if(R.emagged) - name = "combat jaws" - icon = 'icons/mob/dogborg.dmi' - icon_state = "jaws" - desc = "The jaws of the law." - flags_1 = CONDUCT_1 - force = 12 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' - attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - w_class = 3 - sharpness = IS_SHARP - else - name = "puppy jaws" - icon = 'icons/mob/dogborg.dmi' - icon_state = "smalljaws" - desc = "The jaws of a small dog." - flags_1 = CONDUCT_1 - force = 5 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' - attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - w_class = 3 - sharpness = IS_SHARP - update_icon() - - -//Cuffs - -/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user) - if(!C.handcuffed) - playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) - C.visible_message("[user] is trying to put zipties on [C]!", \ - "[user] is trying to put zipties on [C]!") - if(do_mob(user, C, 30)) - if(!C.handcuffed) - C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) - C.update_inv_handcuffed(0) - to_chat(user,"You handcuff [C].") - playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0) - add_logs(user, C, "handcuffed") - else - to_chat(user,"You fail to handcuff [C]!") - - -//Boop - -/obj/item/device/analyzer/nose - name = "boop module" - icon = 'icons/mob/dogborg.dmi' - icon_state = "nose" - desc = "The BOOP module" - flags_1 = CONDUCT_1 - force = 0 - throwforce = 0 - attack_verb = list("nuzzled", "nosed", "booped") - w_class = 1 - -/obj/item/device/analyzer/nose/attack_self(mob/user) - user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces.") - - var/turf/location = user.loc - if(!istype(location)) - return - - var/datum/gas_mixture/environment = location.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles() - - to_chat(user, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(user, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(user, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - var/list/env_gases = environment.gases - - environment.assert_gases(arglist(GLOB.hardcoded_gases)) - var/o2_concentration = env_gases[/datum/gas/oxygen][MOLES]/total_moles - var/n2_concentration = env_gases[/datum/gas/nitrogen][MOLES]/total_moles - var/co2_concentration = env_gases[/datum/gas/carbon_dioxide][MOLES]/total_moles - var/plasma_concentration = env_gases[/datum/gas/plasma][MOLES]/total_moles - environment.garbage_collect() - - if(abs(n2_concentration - N2STANDARD) < 20) - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") - else - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") - - if(abs(o2_concentration - O2STANDARD) < 2) - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") - else - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") - - if(co2_concentration > 0.01) - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") - else - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") - - if(plasma_concentration > 0.005) - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") - else - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") - - - for(var/id in env_gases) - if(id in GLOB.hardcoded_gases) - continue - var/gas_concentration = env_gases[id][MOLES]/total_moles - to_chat(user, "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %") - to_chat(user, "Temperature: [round(environment.temperature-T0C)] °C") - - -//Delivery - -/obj/item/storage/bag/borgdelivery - name = "fetching storage" - desc = "Fetch the thing!" - icon = 'icons/mob/dogborg.dmi' - icon_state = "dbag" - //Can hold one big item at a time. Drops contents on unequip.(see inventory.dm) - w_class = 5 - max_w_class = 2 - max_combined_w_class = 2 - storage_slots = 1 - collection_mode = 0 - can_hold = list() // any - cant_hold = list(/obj/item/disk/nuclear) - - -//Tongue stuff - -/obj/item/soap/tongue - name = "synthetic tongue" - desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." - icon = 'icons/mob/dogborg.dmi' - icon_state = "synthtongue" - hitsound = 'sound/effects/attackblob.ogg' - cleanspeed = 80 - -/obj/item/soap/tongue/scrubpup - cleanspeed = 25 //slightly faster than a mop. - -/obj/item/soap/tongue/New() - ..() - flags_1 |= NOBLUDGEON_1 //No more attack messages - -/obj/item/trash/rkibble - name = "robo kibble" - desc = "A novelty bowl of assorted mech fabricator byproducts. Mockingly feed this to the sec-dog to help it recharge." - icon = 'icons/mob/dogborg.dmi' - icon_state= "kibble" - -/obj/item/soap/tongue/attack_self(mob/user) - var/mob/living/silicon/robot.R = user - if(R.emagged) - name = "hacked tongue of doom" - desc = "Your tongue has been upgraded successfully. Congratulations." - icon = 'icons/mob/dogborg.dmi' - icon_state = "syndietongue" - cleanspeed = 10 //(nerf'd)tator soap stat - else - name = "synthetic tongue" - desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." - icon = 'icons/mob/dogborg.dmi' - icon_state = "synthtongue" - cleanspeed = initial(cleanspeed) - update_icon() - -/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity) - var/mob/living/silicon/robot.R = user - if(!proximity || !check_allowed_items(target)) - return - if(R.client && (target in R.client.screen)) - to_chat(R, "You need to take that [target.name] off before cleaning it!") - else if(istype(target,/obj/effect/decal/cleanable)) - R.visible_message("[R] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't eat them. - to_chat(R, "You finish licking off \the [target.name].") - qdel(target) - R.cell.give(50) - else if(istype(target,/obj/item)) //hoo boy. danger zone man - if(istype(target,/obj/item/trash)) - R.visible_message("[R] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't eat them. - to_chat(R, "You finish off \the [target.name].") - qdel(target) - R.cell.give(250) - return - if(istype(target,/obj/item/stock_parts/cell)) - R.visible_message("[R] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...") - if(do_after(R, 50, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't eat them. - to_chat(R, "You finish off \the [target.name].") - var/obj/item/stock_parts/cell.C = target - R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf - qdel(target) - return - var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT - if(!I.anchored && R.emagged) - R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "You begin chewing up \the [target.name]...") - if(do_after(R, 100, target = I)) //Nerf dat time yo - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range. - return //If they moved away, you can't eat them. - visible_message("[R] chews up \the [target.name] and cleans off the debris!") - to_chat(R, "You finish off \the [target.name].") - qdel(I) - R.cell.give(500) - return - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't clean them. - to_chat(R,"You clean \the [target.name].") - var/obj/effect/decal/cleanable/C = locate() in target - qdel(C) - SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - else if(ishuman(target)) - if(R.emagged) - var/mob/living/L = target - if(R.cell.charge <= 666) - return - L.Stun(4) // normal stunbaton is force 7 gimme a break good sir! - L.Knockdown(80) - L.apply_effect(STUTTER, 4) - L.visible_message("[R] has shocked [L] with its tongue!", \ - "[R] has shocked you with its tongue! You can feel the betrayal.") - playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - R.cell.use(666) - else - R.visible_message("\the [R] affectionally licks \the [target]'s face!", "You affectionally lick \the [target]'s face!") - playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) - return - else if(istype(target, /obj/structure/window)) - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't clean them. - to_chat(R, "You clean \the [target.name].") - target.color = initial(target.color) - else - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't clean them. - to_chat(R, "You clean \the [target.name].") - var/obj/effect/decal/cleanable/C = locate() in target - qdel(C) - SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - return - - - -//Defibs - -/obj/item/twohanded/shockpaddles/hound - name = "defibrillator paws" - desc = "MediHound specific shock paws." - icon = 'icons/mob/dogborg.dmi' - icon_state = "defibpaddles0" - item_state = "defibpaddles0" - req_defib = 0 - wielded = 1 - -/obj/item/twohanded/shockpaddles/hound/attack(mob/M, mob/user) - var/mob/living/silicon/robot.R = user - if(R.cell.charge < 1000) - user.visible_message("You don't have enough charge for this operation!") - return - if(src.cooldown == 0) - R.cell.use(1000) - return ..() - - -//Sleeper +// Dogborg Sleeper units /obj/item/device/dogborg/sleeper name = "hound sleeper" @@ -371,6 +59,9 @@ return if(!iscarbon(target)) return + if(!(target.client && target.client.prefs && target.client.prefs.toggles && (target.client.prefs.toggles & MEDIHOUND_SLEEPER))) + to_chat(user, "This person is incompatible with our equipment.") + return if(target.buckled) to_chat(user, "The user is buckled and can not be put into your [src.name].") return @@ -615,6 +306,12 @@ playsound(get_turf(hound),"death_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) T.stop_sound_channel(CHANNEL_PRED) T.playsound_local("death_prey",60) + for(var/belly in T.vore_organs) + var/obj/belly/B = belly + for(var/atom/movable/thing in B) + thing.forceMove(src) + if(ismob(thing)) + to_chat(thing, "As [T] melts away around you, you find yourself in [hound]'s [name]") for(var/obj/item/W in T) if(!T.dropItemToGround(W)) qdel(W) @@ -801,100 +498,3 @@ playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) return return - - -// Pounce stuff for K-9 - -/obj/item/dogborg/pounce - name = "pounce" - icon = 'icons/mob/dogborg.dmi' - icon_state = "pounce" - desc = "Leap at your target to momentarily stun them." - force = 0 - throwforce = 0 - -/obj/item/dogborg/pounce/New() - ..() - flags_1 |= NOBLUDGEON_1 - -/mob/living/silicon/robot - var/leaping = 0 - var/pounce_cooldown = 0 - var/pounce_cooldown_time = 50 //Nearly doubled, u happy? - var/pounce_spoolup = 3 - var/leap_at - var/disabler - var/laser - var/sleeper_g - var/sleeper_r - -#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance. - -/obj/item/dogborg/pounce/afterattack(atom/A, mob/user) - var/mob/living/silicon/robot/R = user - if(R && !R.pounce_cooldown) - R.pounce_cooldown = !R.pounce_cooldown - to_chat(R, "Your targeting systems lock on to [A]...") - addtimer(CALLBACK(R, /mob/living/silicon/robot.proc/leap_at, A), R.pounce_spoolup) - spawn(R.pounce_cooldown_time) - R.pounce_cooldown = !R.pounce_cooldown - else if(R && R.pounce_cooldown) - to_chat(R, "Your leg actuators are still recharging!") - -/mob/living/silicon/robot/proc/leap_at(atom/A) - if(leaping || stat || buckled || lying) - return - - if(!has_gravity(src) || !has_gravity(A)) - to_chat(src,"It is unsafe to leap without gravity!") - //It's also extremely buggy visually, so it's balance+bugfix - return - - if(cell.charge <= 500) - to_chat(src,"Insufficent reserves for jump actuators!") - return - - else - leaping = 1 - weather_immunities += "lava" - pixel_y = 10 - update_icons() - throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1) - cell.use(500) //Doubled the energy consumption - weather_immunities -= "lava" - -/mob/living/silicon/robot/throw_impact(atom/A) - - if(!leaping) - return ..() - - if(A) - if(isliving(A)) - var/mob/living/L = A - var/blocked = 0 - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK)) - blocked = 1 - if(!blocked) - L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") - L.Knockdown(45) - playsound(src, 'sound/weapons/Egloves.ogg', 50, 1) - sleep(2)//Runtime prevention (infinite bump() calls on hulks) - step_towards(src,L) - else - Knockdown(45, 1, 1) - - pounce_cooldown = !pounce_cooldown - spawn(pounce_cooldown_time) //3s by default - pounce_cooldown = !pounce_cooldown - else if(A.density && !A.CanPass(src)) - visible_message("[src] smashes into [A]!", "You smash into [A]!") - playsound(src, 'sound/items/trayhit1.ogg', 50, 1) - Knockdown(45, 1, 1) - - if(leaping) - leaping = 0 - pixel_y = initial(pixel_y) - update_icons() - update_canmove() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index eb1ccd15f4..2e65a6c108 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -67,9 +67,12 @@ if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") return + if(user.has_trait(TRAIT_NOGUNS)) + to_chat(user, "Your fingers can't press the button!") + return if(ishuman(user)) var/mob/living/carbon/human/H = user - if(H.dna.check_mutation(HULK) || (NOGUNS in H.dna.species.species_traits)) + if(H.dna.check_mutation(HULK)) to_chat(user, "Your fingers can't press the button!") return diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm deleted file mode 100644 index e7d3d9d9e6..0000000000 --- a/code/game/objects/items/devices/radio/beacon.dm +++ /dev/null @@ -1,32 +0,0 @@ -/obj/item/device/radio/beacon - name = "tracking beacon" - desc = "A beacon used by a teleporter." - icon_state = "beacon" - item_state = "beacon" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - var/code = "electronic" - dog_fashion = null - -/obj/item/device/radio/beacon/Initialize() - . = ..() - GLOB.teleportbeacons += src - -/obj/item/device/radio/beacon/Destroy() - GLOB.teleportbeacons.Remove(src) - return ..() - -/obj/item/device/radio/beacon/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode) - return - -/obj/item/device/radio/beacon/verb/alter_signal(t as text) - set name = "Alter Beacon's Signal" - set category = "Object" - set src in usr - - if ((usr.canmove && !( usr.restrained() ))) - src.code = t - if (!( src.code )) - src.code = "beacon" - src.add_fingerprint(usr) - return diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 39ab21d72b..6488b4e001 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -172,6 +172,8 @@ GAS ANALYZER trauma_desc += B.scan_desc trauma_text += trauma_desc to_chat(user, "\tCerebral traumas detected: subjects appears to be suffering from [english_list(trauma_text)].") + if(C.roundstart_traits.len) + to_chat(user, "\tSubject has the following physiological traits: [C.get_trait_string()].") if(advanced) to_chat(user, "\tBrain Activity Level: [(200 - M.getBrainLoss())/2]%.") if (M.radiation) @@ -260,7 +262,7 @@ GAS ANALYZER if(tdelta < (DEFIB_TIME_LIMIT * 10)) to_chat(user, "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!") - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing if(!(D.visibility_flags & HIDDEN_SCANNER)) to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 0ea5fe1b03..a944230925 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -57,7 +57,7 @@ /obj/item/dice/d1 name = "d1" - desc = "A die with one side. Deterministic!" + desc = "A die with only one side. Deterministic!" icon_state = "d1" sides = 1 @@ -131,7 +131,7 @@ name = "d100" desc = "A die with one hundred sides! Probably not fairly weighted..." icon_state = "d100" - w_class = WEIGHT_CLASS_SMALL + w_class = WEIGHT_CLASS_SMALL sides = 100 /obj/item/dice/d100/update_icon() @@ -149,7 +149,7 @@ /obj/item/dice/fourdd6 name = "4d d6" - desc = "A die that exists in four dimensional space. Properly interpreting them can only be properly done with the help of a mathematician, a physicist, and a priest." + desc = "A die that exists in four dimensional space. Properly interpreting them can only be done with the help of a mathematician, a physicist, and a priest." icon_state = "4dd6" sides = 48 special_faces = list("Cube-Side: 1-1","Cube-Side: 1-2","Cube-Side: 1-3","Cube-Side: 1-4","Cube-Side: 1-5","Cube-Side: 1-6","Cube-Side: 2-1","Cube-Side: 2-2","Cube-Side: 2-3","Cube-Side: 2-4","Cube-Side: 2-5","Cube-Side: 2-6","Cube-Side: 3-1","Cube-Side: 3-2","Cube-Side: 3-3","Cube-Side: 3-4","Cube-Side: 3-5","Cube-Side: 3-6","Cube-Side: 4-1","Cube-Side: 4-2","Cube-Side: 4-3","Cube-Side: 4-4","Cube-Side: 4-5","Cube-Side: 4-6","Cube-Side: 5-1","Cube-Side: 5-2","Cube-Side: 5-3","Cube-Side: 5-4","Cube-Side: 5-5","Cube-Side: 5-6","Cube-Side: 6-1","Cube-Side: 6-2","Cube-Side: 6-3","Cube-Side: 6-4","Cube-Side: 6-5","Cube-Side: 6-6","Cube-Side: 7-1","Cube-Side: 7-2","Cube-Side: 7-3","Cube-Side: 7-4","Cube-Side: 7-5","Cube-Side: 7-6","Cube-Side: 8-1","Cube-Side: 8-2","Cube-Side: 8-3","Cube-Side: 8-4","Cube-Side: 8-5","Cube-Side: 8-6") @@ -189,7 +189,7 @@ /obj/item/dice/update_icon() cut_overlays() - add_overlay("[src.icon_state][src.result]") + add_overlay("[src.icon_state]-[src.result]") /obj/item/dice/microwave_act(obj/machinery/microwave/M) if(can_be_rigged) diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index c908b619c4..0e8c82d963 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -31,7 +31,7 @@ /obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user) prepare() - if(M.has_dna() && !(RADIMMUNE in M.dna.species.species_traits) && !(M.has_trait(TRAIT_NOCLONE))) + if(M.has_dna() && !M.has_trait(TRAIT_RADIMMUNE) && !M.has_trait(TRAIT_NOCLONE)) M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" for(var/datum/mutation/human/HM in remove_mutations) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 2f08585309..a127201e41 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -550,3 +550,20 @@ beakers += B1 beakers += B2 + +/obj/item/grenade/chem_grenade/holy + name = "holy hand grenade" + desc = "A vessel of concentrated religious might." + icon_state = "holy_grenade" + stage = READY + +/obj/item/grenade/chem_grenade/holy/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) + + B1.reagents.add_reagent("potassium", 100) + B2.reagents.add_reagent("holywater", 100) + + beakers += B1 + beakers += B2 diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index f92042383d..3c4910abc0 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -107,6 +107,10 @@ if(!user.temporarilyRemoveItemFromInventory(src)) return target = AM + + message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_COORDJMP(target)] with [det_time] second fuse",0,1) + log_game("[key_name(user)] planted [name] on [target.name] at [COORD(src)] with [det_time] second fuse") + moveToNullspace() //Yep if(istype(AM, /obj/item)) //your crappy throwing star can't fly so good with a giant brick of c4 on it. @@ -115,9 +119,6 @@ I.throw_range = max(1, (I.throw_range - 3)) I.embedding = I.embedding.setRating(embed_chance = 0) - message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_COORDJMP(target)] with [det_time] second fuse",0,1) - log_game("[key_name(user)] planted [name] on [target.name] at [COORD(src)] with [det_time] second fuse") - target.add_overlay(plastic_overlay, TRUE) if(!nadeassembly) to_chat(user, "You plant the bomb. Timer counting down from [det_time].") diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 3c58cbb2a2..13ca2b35d6 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -274,6 +274,17 @@ qdel(S) return ..() +/obj/item/nullrod/scythe/talking/chainsword + icon_state = "chainswordon" + item_state = "chainswordon" + name = "possessed chainsaw sword" + desc = "Suffer not a heretic to live." + slot_flags = SLOT_BELT + force = 30 + attack_verb = list("sawed", "torn", "cut", "chopped", "diced") + hitsound = 'sound/weapons/chainsawhit.ogg' + + /obj/item/nullrod/hammmer icon_state = "hammeron" item_state = "hammeron" diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index 418026aeef..65bfd09f9c 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -1,4 +1,3 @@ - //CREATOR'S NOTE: DO NOT FUCKING GIVE THIS TO BOTANY! /obj/item/hot_potato name = "hot potato" diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index ea3eb8bba4..b49f325690 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/implants.dmi' icon_state = "generic" //Shows up as the action button icon actions_types = list(/datum/action/item_action/hands_free/activate) - var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants + var/activated = TRUE //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants var/mob/living/imp_in = null item_color = "b" var/allow_multiple = FALSE diff --git a/code/game/objects/items/implants/implant_chem.dm b/code/game/objects/items/implants/implant_chem.dm index e266f3ab09..1d57294b1a 100644 --- a/code/game/objects/items/implants/implant_chem.dm +++ b/code/game/objects/items/implants/implant_chem.dm @@ -3,6 +3,7 @@ desc = "Injects things." icon_state = "reagents" container_type = OPENCONTAINER + activated = FALSE /obj/item/implant/chem/get_data() var/dat = {"Implant Specifications:
@@ -20,14 +21,14 @@ Integrity: Implant will last so long as the subject is alive."} return dat -/obj/item/implant/chem/New() - ..() +/obj/item/implant/chem/Initialize() + . = ..() create_reagents(50) GLOB.tracked_chem_implants += src /obj/item/implant/chem/Destroy() - . = ..() GLOB.tracked_chem_implants -= src + return ..() /obj/item/implant/chem/trigger(emote, mob/source) if(emote == "deathgasp") diff --git a/code/game/objects/items/implants/implant_spell.dm b/code/game/objects/items/implants/implant_spell.dm new file mode 100644 index 0000000000..5db7dc761c --- /dev/null +++ b/code/game/objects/items/implants/implant_spell.dm @@ -0,0 +1,42 @@ +/obj/item/implant/spell + name = "spell implant" + desc = "Allows you to cast a spell as if you were a wizard." + activated = FALSE + + var/autorobeless = TRUE // Whether to automagically make the spell robeless on implant + var/obj/effect/proc_holder/spell/spell + + +/obj/item/implant/spell/get_data() + var/dat = {"Implant Specifications:
+ Name: Spell Implant
+ Life: 4 hours after death of host
+ Implant Details:
+ Function: [spell ? "Allows a non-wizard to cast [spell] as if they were a wizard." : "None"]"} + return dat + +/obj/item/implant/spell/implant(mob/living/target, mob/user, silent = FALSE) + . = ..() + if (.) + if (!spell) + return FALSE + if (autorobeless && spell.clothes_req) + spell.clothes_req = FALSE + target.AddSpell(spell) + return TRUE + +/obj/item/implant/spell/removed(mob/target, silent = FALSE, special = 0) + . = ..() + if (.) + target.RemoveSpell(spell) + if(target.stat != DEAD && !silent) + to_chat(target, "The knowledge of how to cast [spell] slips out from your mind.") + +/obj/item/implanter/spell + name = "implanter (spell)" + imp_type = /obj/item/implant/spell + +/obj/item/implantcase/spell + name = "implant case - 'Wizardry'" + desc = "A glass case containing an implant that can teach the user the arts of Wizardry." + imp_type = /obj/item/implant/spell diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 68cf364c31..7d74a00ce6 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -106,6 +106,10 @@ if(!on) return ..() + if(user.staminaloss >= STAMINA_SOFTCRIT)//CIT CHANGE - makes batons unusuable in stamina softcrit + to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto + return //CIT CHANGE - ditto + add_fingerprint(user) if((user.has_trait(TRAIT_CLUMSY)) && prob(50)) to_chat(user, "You club yourself over the head.") @@ -145,6 +149,7 @@ else target.LAssailant = user cooldown = world.time + 40 + user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes swinging batons cost stamina /obj/item/melee/classic_baton/telescopic name = "telescopic baton" @@ -315,3 +320,112 @@ H.drop_all_held_items() H.visible_message("[user] disarms [H]!", "[user] disarmed you!") ..() + +/obj/item/melee/roastingstick + name = "advanced roasting stick" + desc = "A telescopic roasting stick with a miniature shield generator designed to ensure entry into various high-tech shielded cooking ovens and firepits." + icon_state = "roastingstick_0" + item_state = "null" + slot_flags = SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + item_flags = NONE + force = 0 + attack_verb = list("hit", "poked") + var/obj/item/reagent_containers/food/snacks/sausage/held_sausage + var/static/list/ovens + var/on = FALSE + var/datum/beam/beam + +/obj/item/melee/roastingstick/Initialize() + . = ..() + if (!ovens) + ovens = typecacheof(list(/obj/singularity, /obj/machinery/power/supermatter_shard/crystal, /obj/structure/bonfire, /obj/structure/destructible/clockwork/massive/ratvar)) + +/obj/item/melee/roastingstick/attack_self(mob/user) + on = !on + if(on) + extend(user) + else + if (held_sausage) + to_chat(user, "You can't retract [src] while [held_sausage] is attached!") + return + retract(user) + + playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, 1) + add_fingerprint(user) + +/obj/item/melee/roastingstick/attackby(atom/target, mob/user) + ..() + if (istype(target, /obj/item/reagent_containers/food/snacks/sausage)) + if (!on) + to_chat(user, "You must extend [src] to attach anything to it!") + return + if (held_sausage) + to_chat(user, "[held_sausage] is already attached to [src]!") + return + if (user.transferItemToLoc(target, src)) + held_sausage = target + else + to_chat(user, "[target] doesn't seem to want to get on [src]!") + update_icon() + +/obj/item/melee/roastingstick/attack_hand(mob/user) + ..() + if (held_sausage) + user.put_in_hands(held_sausage) + held_sausage = null + update_icon() + +/obj/item/melee/roastingstick/update_icon() + . = ..() + cut_overlays() + if (held_sausage) + var/mutable_appearance/sausage = mutable_appearance(icon, "roastingstick_sausage") + add_overlay(sausage) + +/obj/item/melee/roastingstick/proc/extend(user) + to_chat(user, "You extend [src].") + icon_state = "roastingstick_1" + item_state = "nullrod" + w_class = WEIGHT_CLASS_BULKY + +/obj/item/melee/roastingstick/proc/retract(user) + to_chat(user, "You collapse [src].") + icon_state = "roastingstick_0" + item_state = null + w_class = WEIGHT_CLASS_SMALL + +/obj/item/melee/roastingstick/handle_atom_del(atom/target) + if (target == held_sausage) + held_sausage = null + update_icon() + +/obj/item/melee/roastingstick/afterattack(atom/target, mob/user, proximity) + if (!on) + return + if (is_type_in_typecache(target, ovens)) + if (held_sausage && held_sausage.roasted) + to_chat("Your [held_sausage] has already been cooked.") + return + if (istype(target, /obj/singularity) && get_dist(user, target) < 10) + to_chat(user, "You send [held_sausage] towards [target].") + playsound(src, 'sound/items/rped.ogg', 50, 1) + beam = user.Beam(target,icon_state="rped_upgrade",time=100) + else if (user.Adjacent(target)) + to_chat(user, "You extend [src] towards [target].") + playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, 1) + else + return + if(do_after(user, 100, target = user)) + finish_roasting(user, target) + else + QDEL_NULL(beam) + playsound(src, 'sound/weapons/batonextend.ogg', 50, 1) + +/obj/item/melee/roastingstick/proc/finish_roasting(user, atom/target) + to_chat(user, "You finish roasting [held_sausage]") + playsound(src,'sound/items/welder2.ogg',50,1) + held_sausage.add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) + held_sausage.name = "[target.name]-roasted [held_sausage.name]" + held_sausage.desc = "[held_sausage.desc] It has been cooked to perfection on \a [target]." + update_icon() diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index d10d02aad7..db8e791700 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -22,7 +22,7 @@ if(attack_verb_off.len) attack_verb = attack_verb_off if(is_sharp()) - AddComponent(/datum/component/butchering, 50, 100, 0, hitsound, active) + AddComponent(/datum/component/butchering, 50, 100, 0, hitsound, !active) /obj/item/melee/transforming/attack_self(mob/living/carbon/user) if(transform_weapon(user)) @@ -61,8 +61,13 @@ attack_verb = attack_verb_off icon_state = initial(icon_state) w_class = initial(w_class) - GET_COMPONENT_FROM(butchering, /datum/component/butchering, src) - butchering.butchering_enabled = active + if(is_sharp()) + var/datum/component/butchering/BT = LoadComponent(/datum/component/butchering) + BT.butchering_enabled = TRUE + else + GET_COMPONENT(BT, /datum/component/butchering) + if(BT) + BT.butchering_enabled = FALSE transform_messages(user, supress_message_text) add_fingerprint(user) return TRUE diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index b51eba5b6a..fba0c1b1a2 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -274,13 +274,14 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( var/hit_hand = ((user.active_hand_index % 2 == 0) ? "r_" : "l_") + "arm" if(ishuman(user)) var/mob/living/carbon/human/H = user - if(!H.gloves && !(PIERCEIMMUNE in H.dna.species.species_traits)) // golems, etc + if(!H.gloves && !H.has_trait(TRAIT_PIERCEIMMUNE)) // golems, etc to_chat(H, "[src] cuts into your hand!") H.apply_damage(force*0.5, BRUTE, hit_hand) else if(ismonkey(user)) var/mob/living/carbon/monkey/M = user - to_chat(M, "[src] cuts into your hand!") - M.apply_damage(force*0.5, BRUTE, hit_hand) + if(!M.has_trait(TRAIT_PIERCEIMMUNE)) + to_chat(M, "[src] cuts into your hand!") + M.apply_damage(force*0.5, BRUTE, hit_hand) /obj/item/shard/attackby(obj/item/I, mob/user, params) @@ -304,5 +305,8 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( /obj/item/shard/Crossed(mob/living/L) if(istype(L) && has_gravity(loc)) - playsound(loc, 'sound/effects/glass_step.ogg', 50, 1) + if(L.has_trait(TRAIT_LIGHT_STEP)) + playsound(loc, 'sound/effects/glass_step.ogg', 30, 1) + else + playsound(loc, 'sound/effects/glass_step.ogg', 50, 1) . = ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index ad752ba14a..6109f6b0d0 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -9,6 +9,7 @@ * Paper Frames * Runed Metal (cult) * Brass (clockwork cult) + * Bronze (bake brass) */ /* @@ -421,6 +422,53 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ /obj/item/stack/tile/brass/fifty amount = 50 +/* + * Bronze + */ + +GLOBAL_LIST_INIT(bronze_recipes, list ( \ + new/datum/stack_recipe("wall gear", /obj/structure/girder/bronze, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ + null, + new/datum/stack_recipe("bronze hat", /obj/item/clothing/head/bronze), \ + new/datum/stack_recipe("bronze suit", /obj/item/clothing/suit/bronze), \ + new/datum/stack_recipe("bronze boots", /obj/item/clothing/shoes/bronze), \ + null, + new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ +)) + +/obj/item/stack/tile/bronze + name = "brass" + desc = "On closer inspection, what appears to be wholly-unsuitable-for-building brass is actually more structurally stable bronze." + singular_name = "bronze sheet" + icon_state = "sheet-brass" + item_state = "sheet-brass" + icon = 'icons/obj/stack_objects.dmi' + resistance_flags = FIRE_PROOF | ACID_PROOF + throwforce = 10 + max_amount = 50 + throw_speed = 1 + throw_range = 3 + turf_type = /turf/open/floor/bronze + novariants = FALSE + grind_results = list("iron" = 5, "copper" = 3) //we have no "tin" reagent so this is the closest thing + +/obj/item/stack/tile/bronze/attack_self(mob/living/user) + if(is_servant_of_ratvar(user)) //still lets them build with it, just gives a message + to_chat(user, "Wha... what is this cheap imitation crap? This isn't brass at all!") + ..() + +/obj/item/stack/tile/bronze/Initialize(mapload, new_amount, merge = TRUE) + recipes = GLOB.bronze_recipes + . = ..() + pixel_x = 0 + pixel_y = 0 + +/obj/item/stack/tile/bronze/thirty + amount = 30 + +/* + * Lesser and Greater gems - unused + */ /obj/item/stack/sheet/lessergem name = "lesser gems" desc = "Rare kind of gems which are only gained by blood sacrifice to minor deities. They are needed in crafting powerful objects." diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 2e38a7e112..ee74b7c84d 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -46,7 +46,9 @@ /obj/item/device/geiger_counter, /obj/item/extinguisher/mini, /obj/item/device/radio, - /obj/item/clothing/gloves + /obj/item/clothing/gloves, + /obj/item/holosign_creator, + /obj/item/device/assembly/signaler ) content_overlays = TRUE @@ -121,6 +123,7 @@ /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/pill, /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/medspray, /obj/item/lighter, /obj/item/storage/fancy/cigarettes, /obj/item/storage/pill_bottle, @@ -153,7 +156,11 @@ /obj/item/storage/bag/bio, /obj/item/reagent_containers/blood, /obj/item/tank/internals/emergency_oxygen, - /obj/item/pinpointer/crew + /obj/item/pinpointer/crew, + /obj/item/gun/syringe/syndicate, + /obj/item/implantcase, + /obj/item/implant, + /obj/item/implanter ) @@ -175,13 +182,13 @@ /obj/item/ammo_casing/shotgun, /obj/item/ammo_box, /obj/item/reagent_containers/food/snacks/donut, - /obj/item/reagent_containers/food/snacks/donut/jelly, /obj/item/kitchen/knife/combat, /obj/item/device/flashlight/seclite, /obj/item/melee/classic_baton/telescopic, /obj/item/device/radio, - /obj/item/clothing/gloves/, - /obj/item/restraints/legcuffs/bola + /obj/item/clothing/gloves, + /obj/item/restraints/legcuffs/bola, + /obj/item/holosign_creator/security ) content_overlays = TRUE @@ -209,6 +216,7 @@ /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, + /obj/item/device/multitool, /obj/item/device/flashlight, /obj/item/stack/cable_coil, /obj/item/device/analyzer, @@ -402,7 +410,9 @@ /obj/item/soap, /obj/item/holosign_creator, /obj/item/key/janitor, - /obj/item/clothing/gloves + /obj/item/clothing/gloves, + /obj/item/melee/flyswatter, + /obj/item/device/assembly/mousetrap ) /obj/item/storage/belt/bandolier diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 875183f9d2..cea183d493 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -96,6 +96,9 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", H.visible_message("[user] heals [H] with the power of [deity_name]!") to_chat(H, "May the power of [deity_name] compel you to be healed!") playsound(src.loc, "punch", 25, 1, -1) + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(mood) + mood.add_event("blessing", /datum/mood_event/blessing) return 1 /obj/item/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 112caf26c0..9987784f97 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -192,6 +192,14 @@ for(var/i in 1 to 7) new /obj/item/reagent_containers/glass/beaker( src ) +/obj/item/storage/box/medsprays + name = "box of medical sprayers" + desc = "A box full of medical sprayers, with unscrewable caps and precision spray heads." + +/obj/item/storage/box/medsprays/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/medspray( src ) + /obj/item/storage/box/injectors name = "box of DNA injectors" desc = "This box contains injectors, it seems." @@ -934,3 +942,12 @@ obj/item/storage/box/clown /obj/item/storage/box/fountainpens/PopulateContents() for(var/i in 1 to 7) new /obj/item/pen/fountain(src) + +/obj/item/storage/box/holy_grenades + name = "box of holy hand grenades" + desc = "Contains several grenades used to rapidly purge heresy." + illustration = "flashbang" + +/obj/item/storage/box/holy_grenades/PopulateContents() + for(var/i in 1 to 7) + new/obj/item/grenade/chem_grenade/holy(src) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 9f42a7c370..6e88a61349 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -115,6 +115,10 @@ deductcharge(hitcost) return + if(user.staminaloss >= STAMINA_SOFTCRIT)//CIT CHANGE - makes it impossible to baton in stamina softcrit + to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto + return //CIT CHANGE - ditto + if(iscyborg(M)) ..() return @@ -129,6 +133,7 @@ if(status) if(baton_stun(M, user)) user.do_attack_animation(M) + user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes stunbatonning others cost stamina return else M.visible_message("[user] has prodded [M] with [src]. Luckily it was off.", \ @@ -154,6 +159,7 @@ return 0 L.Knockdown(stunforce) + L.adjustStaminaLoss(stunforce*0.1)//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented. L.apply_effect(STUTTER, stunforce) if(user) L.lastattacker = user.real_name diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index 2ef3e52ff1..a9cbb9f73d 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -17,9 +17,6 @@ icon = 'icons/obj/device.dmi' icon_state = "locator" var/temp = null - var/frequency = FREQ_LOCATOR_IMPLANT - var/broadcasting = null - var/listening = 1 flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_SMALL item_state = "electronic" @@ -32,17 +29,11 @@ /obj/item/locator/attack_self(mob/user) user.set_machine(src) var/dat - if (src.temp) - dat = "[src.temp]

Clear" + if (temp) + dat = "[temp]

Clear" else dat = {" Persistent Signal Locator
-Frequency: -- -- [format_frequency(src.frequency)] -+ -+
- Refresh"} user << browse(dat, "window=radio") onclose(user, "radio") @@ -59,30 +50,30 @@ Frequency: if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc))) usr.set_machine(src) if (href_list["refresh"]) - src.temp = "Persistent Signal Locator
" + temp = "Persistent Signal Locator
" var/turf/sr = get_turf(src) if (sr) - src.temp += "Located Beacons:
" - - for(var/obj/item/device/radio/beacon/W in GLOB.teleportbeacons) - if (W.frequency == src.frequency) - var/turf/tr = get_turf(W) - if (tr.z == sr.z && tr) - var/direct = max(abs(tr.x - sr.x), abs(tr.y - sr.y)) - if (direct < 5) - direct = "very strong" + temp += "Beacon Signals:
" + for(var/obj/item/device/beacon/W in GLOB.teleportbeacons) + if (!W.renamed) + continue + var/turf/tr = get_turf(W) + if (tr.z == sr.z && tr) + var/direct = max(abs(tr.x - sr.x), abs(tr.y - sr.y)) + if (direct < 5) + direct = "very strong" + else + if (direct < 10) + direct = "strong" else - if (direct < 10) - direct = "strong" + if (direct < 20) + direct = "weak" else - if (direct < 20) - direct = "weak" - else - direct = "very weak" - src.temp += "[W.code]-[dir2text(get_dir(sr, tr))]-[direct]
" + direct = "very weak" + temp += "[W.name]-[dir2text(get_dir(sr, tr))]-[direct]
" - src.temp += "Extranneous Signals:
" + temp += "Implant Signals:
" for (var/obj/item/implant/tracking/W in GLOB.tracked_implants) if (!W.imp_in || !isliving(W.loc)) continue @@ -103,18 +94,14 @@ Frequency: direct = "strong" else direct = "weak" - src.temp += "[W.imp_in.name]-[dir2text(get_dir(sr, tr))]-[direct]
" + temp += "[W.imp_in.name]-[dir2text(get_dir(sr, tr))]-[direct]
" - src.temp += "You are at \[[sr.x],[sr.y],[sr.z]\] in orbital coordinates.

Refresh
" + temp += "You are at \[[sr.x],[sr.y],[sr.z]\] in orbital coordinates.

Refresh
" else - src.temp += "Processing Error: Unable to locate orbital position.
" + temp += "Processing Error: Unable to locate orbital position.
" else - if (href_list["freq"]) - src.frequency += text2num(href_list["freq"]) - src.frequency = sanitize_frequency(src.frequency) - else - if (href_list["temp"]) - src.temp = null + if (href_list["temp"]) + temp = null if (ismob(src.loc)) attack_self(src.loc) else diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 61b44d658e..6bae2af476 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -357,5 +357,5 @@ if(get_fuel() < max_fuel && nextrefueltick < world.time) nextrefueltick = world.time + 10 reagents.add_reagent("welding_fuel", 1) - -#undef WELDER_FUEL_BURN_INTERVAL + +#undef WELDER_FUEL_BURN_INTERVAL \ No newline at end of file diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index cd632032ac..34cdbd646b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -42,6 +42,7 @@ icon_state = "waterballoon-e" item_state = "balloon-empty" + /obj/item/toy/balloon/New() create_reagents(10) ..() @@ -286,6 +287,7 @@ w_class = WEIGHT_CLASS_SMALL resistance_flags = FLAMMABLE + /obj/item/toy/windupToolbox name = "windup toolbox" desc = "A replica toolbox that rumbles when you turn the key." @@ -332,7 +334,7 @@ /obj/item/toy/katana name = "replica katana" - desc = "Woefully underpowered in D20. Almost has a sharp edge." + desc = "Woefully underpowered in D20." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "katana" item_state = "katana" diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 2d82c3829b..713f5761c0 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -101,6 +101,7 @@ var/mob/living/carbon/human/H = loc loc.layer = LARGE_MOB_LAYER //NO HIDING BEHIND PLANTS FOR YOU, DICKWEED (HA GET IT, BECAUSE WEEDS ARE PLANTS) H.bleedsuppress = TRUE //AND WE WON'T BLEED OUT LIKE COWARDS + H.adjustStaminaLoss(-5) //CIT CHANGE - AND MAY HE NEVER SUCCUMB TO EXHAUSTION else if(!admin_spawned) qdel(src) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index fdd331a6f1..ae85b3b579 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -22,6 +22,11 @@ var/current_skin //Has the item been reskinned? var/list/unique_reskin //List of options to reskin. + // Access levels, used in modules\jobs\access.dm + var/list/req_access + var/req_access_txt = "0" + var/list/req_one_access + var/req_one_access_txt = "0" /obj/vv_edit_var(vname, vval) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 39ad436b05..cd265969eb 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -74,6 +74,8 @@ adjusted_climb_time *= 2 if(isalien(user)) adjusted_climb_time *= 0.25 //aliens are terrifyingly fast + if(user.has_trait(TRAIT_FREERUNNING)) //do you have any idea how fast I am??? + adjusted_climb_time *= 0.8 structureclimber = user if(do_mob(user, user, adjusted_climb_time)) if(src.loc) //Checking if structure has been destroyed diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 120fe15a00..54b10a6203 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -391,3 +391,17 @@ user.visible_message("[user] stops [src]'s uncontrollable spinning.", \ "You grab [src] and stop its wild spinning.") STOP_PROCESSING(SSfastprocess, src) + +/obj/structure/chair/bronze + name = "brass chair" + desc = "A spinny chair made of bronze. It has little cogs for wheels!" + anchored = FALSE + icon_state = "brass_chair" + buildstacktype = /obj/item/stack/tile/bronze + buildstackamount = 1 + item_chair = null + +/obj/structure/chair/bronze/Moved() + . = ..() + if(has_gravity()) + playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 52fe7b9bf9..8332f1b338 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -397,7 +397,14 @@ else togglelock(user) -/obj/structure/closet/proc/togglelock(mob/living/user) +/obj/structure/closet/CtrlShiftClick(mob/living/user) + if(!user.has_trait(TRAIT_SKITTISH)) + return ..() + if(!user.canUseTopic(src) || !isturf(user.loc)) + return + dive_into(user) + +/obj/structure/closet/proc/togglelock(mob/living/user, silent) if(secure && !broken) if(allowed(user)) if(iscarbon(user)) @@ -406,7 +413,7 @@ user.visible_message("[user] [locked ? null : "un"]locks [src].", "You [locked ? null : "un"]lock [src].") update_icon() - else + else if(!silent) to_chat(user, "Access Denied") else if(secure && broken) to_chat(user, "\The [src] is broken!") @@ -456,3 +463,23 @@ /obj/structure/closet/return_temperature() return + +/obj/structure/closet/proc/dive_into(mob/living/user) + var/turf/T1 = get_turf(user) + var/turf/T2 = get_turf(src) + if(!open() && !opened) + togglelock(user, TRUE) + if(!open()) + to_chat(user, "It won't budge!") + return + step_towards(user, T2) + T1 = get_turf(user) + if(T1 == T2) + user.resting = TRUE //so people can jump into crates without slamming the lid on their head + if(!close()) + to_chat(user, "You can't get [src] to close!") + user.resting = FALSE + return + user.resting = FALSE + togglelock(user) + T1.visible_message("[user] dives into [src]!") diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index 1c5250dcf2..ad493dd6f5 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -11,8 +11,7 @@ new /obj/item/clothing/under/shorts/red(src) new /obj/item/clothing/under/shorts/blue(src) new /obj/item/clothing/under/shorts/green(src) - if(prob(3)) - new /obj/item/clothing/under/jabroni(src) + new /obj/item/clothing/under/jabroni(src) /obj/structure/closet/boxinggloves diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index eff0db0af5..4bddb0f7a7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -18,4 +18,4 @@ new /obj/item/clothing/head/soft(src) new /obj/item/device/export_scanner(src) new /obj/item/door_remote/quartermaster(src) - new /obj/item/circuitboard/machine/protolathe/department/cargo(src) + new /obj/item/circuitboard/machine/techfab/department/cargo(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 55c2160833..8f7da91465 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -27,7 +27,7 @@ new /obj/item/door_remote/chief_engineer(src) new /obj/item/pipe_dispenser(src) new /obj/item/inducer(src) - new /obj/item/circuitboard/machine/protolathe/department/engineering(src) + new /obj/item/circuitboard/machine/techfab/department/engineering(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index fa9d9e9fd2..105aef4e9c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -75,7 +75,7 @@ new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) new /obj/item/wallframe/defib_mount(src) - new /obj/item/circuitboard/machine/protolathe/department/medical(src) + new /obj/item/circuitboard/machine/techfab/department/medical(src) /obj/structure/closet/secure_closet/animal name = "animal control" @@ -96,3 +96,5 @@ ..() new /obj/item/storage/box/pillbottles(src) new /obj/item/storage/box/pillbottles(src) + new /obj/item/storage/box/medsprays(src) + new /obj/item/storage/box/medsprays(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 158e4d348d..a88fe3d450 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -25,4 +25,4 @@ new /obj/item/device/laser_pointer(src) new /obj/item/door_remote/research_director(src) new /obj/item/storage/box/firingpins(src) - new /obj/item/circuitboard/machine/protolathe/department/science(src) + new /obj/item/circuitboard/machine/techfab/department/science(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 2caa050309..660526d3d3 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -57,7 +57,7 @@ new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) new /obj/item/door_remote/civillian(src) - new /obj/item/circuitboard/machine/protolathe/department/service(src) + new /obj/item/circuitboard/machine/techfab/department/service(src) /obj/structure/closet/secure_closet/hos name = "\proper head of security's locker" @@ -89,7 +89,7 @@ new /obj/item/gun/energy/e_gun/hos(src) new /obj/item/device/flashlight/seclite(src) new /obj/item/pinpointer/nuke(src) - new /obj/item/circuitboard/machine/protolathe/department/security(src) + new /obj/item/circuitboard/machine/techfab/department/security(src) /obj/structure/closet/secure_closet/warden name = "\proper warden's locker" diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 94e6d62747..ed5eb2cce9 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -15,9 +15,17 @@ var/openable = TRUE var/obj/item/electronics/airlock/electronics var/start_showpiece_type = null //add type for items on display + var/list/start_showpieces = list() //Takes sublists in the form of list("type" = /obj/item/bikehorn, "trophy_message" = "henk") + var/trophy_message = "" /obj/structure/displaycase/Initialize() . = ..() + if(start_showpieces.len && !start_showpiece_type) + var/list/showpiece_entry = pick(start_showpieces) + if (showpiece_entry && showpiece_entry["type"]) + start_showpiece_type = showpiece_entry["type"] + if (showpiece_entry["trophy_message"]) + trophy_message = showpiece_entry["trophy_message"] if(start_showpiece_type) showpiece = new start_showpiece_type (src) update_icon() @@ -35,6 +43,9 @@ to_chat(user, "Hooked up with an anti-theft system.") if(showpiece) to_chat(user, "There's [showpiece] inside.") + if(trophy_message) + to_chat(user, "The plaque reads:") + to_chat(user, trophy_message) /obj/structure/displaycase/proc/dump() @@ -213,7 +224,7 @@ //The captains display case requiring specops ID access is intentional. //The lab cage and captains display case do not spawn with electronics, which is why req_access is needed. /obj/structure/displaycase/captain - alert = 1 + alert = TRUE start_showpiece_type = /obj/item/gun/energy/laser/captain req_access = list(ACCESS_CENT_SPECOPS) @@ -223,12 +234,9 @@ start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr req_access = list(ACCESS_RD) - - /obj/structure/displaycase/trophy name = "trophy display case" desc = "Store your trophies of accomplishment in here, and they will stay forever." - var/trophy_message = "" var/placer_key = "" var/added_roundstart = TRUE var/is_locked = TRUE @@ -245,12 +253,6 @@ GLOB.trophy_cases -= src return ..() -/obj/structure/displaycase/trophy/examine(mob/user) - ..() - if(trophy_message) - to_chat(user, "The plaque reads:") - to_chat(user, trophy_message) - /obj/structure/displaycase/trophy/attackby(obj/item/W, mob/user, params) if(!user.Adjacent(src)) //no TK museology diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 05935a6d48..d3844a8c98 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -408,3 +408,47 @@ qdel(src) return TRUE return FALSE + +/obj/structure/girder/bronze + name = "wall gear" + desc = "A girder made out of sturdy bronze, made to resemble a gear." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "wall_gear" + can_displace = FALSE + +/obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, params) + add_fingerprint(user) + if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount = 0)) + return + to_chat(user, "You start slicing apart [src]...") + if(W.use_tool(src, user, 40, volume=50)) + to_chat(user, "You slice apart [src].") + var/obj/item/stack/tile/bronze/B = new(drop_location(), 2) + transfer_fingerprints_to(B) + qdel(src) + + else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) + to_chat(user, "Your jackhammer smashes through the girder!") + var/obj/item/stack/tile/bronze/B = new(drop_location(), 2) + transfer_fingerprints_to(B) + W.play_tool_sound(src) + qdel(src) + + else if(istype(W, /obj/item/stack/tile/bronze)) + var/obj/item/stack/tile/bronze/B = W + if(B.get_amount() < 2) + to_chat(user, "You need at least two bronze sheets to build a bronze wall!") + return 0 + user.visible_message("[user] begins plating [src] with brozne...", "You begin constructing a bronze wall...") + if(do_after(user, 50, target = src)) + if(B.get_amount() < 2) + return + user.visible_message("[user] plates [src] with bronze!", "You construct a bronze wall.") + B.use(2) + var/turf/T = get_turf(src) + T.PlaceOnTop(/turf/closed/wall/mineral/bronze) + qdel(src) + + else + return ..() diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index f0168694f0..65b6e97a70 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -9,6 +9,10 @@ max_integrity = 200 integrity_failure = 100 +/obj/structure/mirror/Initialize(mapload) + . = ..() + if(icon_state == "mirror_broke" && !broken) + obj_break(null, mapload) /obj/structure/mirror/attack_hand(mob/user) if(broken || !Adjacent(user)) @@ -46,12 +50,14 @@ return // no message spam ..() -/obj/structure/mirror/obj_break(damage_flag) +/obj/structure/mirror/obj_break(damage_flag, mapload) if(!broken && !(flags_1 & NODECONSTRUCT_1)) icon_state = "mirror_broke" - playsound(src, "shatter", 70, 1) - desc = "Oh no, seven years of bad luck!" - broken = 1 + if(!mapload) + playsound(src, "shatter", 70, 1) + if(desc == initial(desc)) + desc = "Oh no, seven years of bad luck!" + broken = TRUE /obj/structure/mirror/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -90,7 +96,7 @@ name = "magic mirror" desc = "Turn and face the strange... face." icon_state = "magic_mirror" - var/list/races_blacklist = list("skeleton", "agent", "angel", "military_synth", "memezombies", "clockwork golem servant", "android", "synth") + var/list/races_blacklist = list("skeleton", "agent", "angel", "military_synth", "memezombies", "clockwork golem servant", "android", "synth", "mush") var/list/choosable_races = list() /obj/structure/mirror/magic/New() diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 9aebbd955b..e5ab4e5776 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -1,6 +1,3 @@ - - - /obj/structure/statue name = "statue" desc = "Placeholder. Yell at Firecage if you SOMEHOW see this." @@ -16,47 +13,21 @@ /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) user.changeNext_move(CLICK_CD_MELEE) - if(istype(W, /obj/item/wrench)) - if(anchored) - user.visible_message("[user] is loosening the [name]'s bolts.", \ - "You are loosening the [name]'s bolts...") - if(W.use_tool(src, user, 40, volume=100)) - if(!anchored) - return - user.visible_message("[user] loosened the [name]'s bolts!", \ - "You loosen the [name]'s bolts!") - anchored = FALSE - else - if(!isfloorturf(src.loc)) - user.visible_message("A floor must be present to secure the [name]!") - return - user.visible_message("[user] is securing the [name]'s bolts...", \ - "You are securing the [name]'s bolts...") - if(W.use_tool(src, user, 40, volume=100)) - if(anchored) - return - user.visible_message("[user] has secured the [name]'s bolts.", \ - "You have secured the [name]'s bolts.") - anchored = TRUE + if(!(flags_1 & NODECONSTRUCT_1)) + if(default_unfasten_wrench(user, W)) + return + if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount=0)) + return FALSE - else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) - user.visible_message("[user] destroys the [name]!", - "You destroy the [name].") - W.play_tool_sound(src) - qdel(src) - - else if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) - if(!W.tool_start_check(user, amount=0)) - return FALSE - - user.visible_message("[user] is slicing apart the [name].", \ - "You are slicing apart the [name]...") - if(W.use_tool(src, user, 40, volume=50)) - user.visible_message("[user] slices apart the [name].", \ - "You slice apart the [name]!") - deconstruct(TRUE) - else - return ..() + user.visible_message("[user] is slicing apart the [name].", \ + "You are slicing apart the [name]...") + if(W.use_tool(src, user, 40, volume=50)) + user.visible_message("[user] slices apart the [name].", \ + "You slice apart the [name]!") + deconstruct(TRUE) + return + return ..() /obj/structure/statue/attack_hand(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index 2b503f4200..1aaae691f8 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -76,6 +76,14 @@ to_chat(user, "You start adding [C] to [src]...") if(do_after(user, 20, target = src) && C.use(1)) make_new_table(/obj/structure/table/wood/fancy) + else if(istype(I, /obj/item/stack/tile/bronze)) + var/obj/item/stack/tile/bronze/B = I + if(B.get_amount() < 1) + to_chat(user, "You need one bronze sheet to do this!") + return + to_chat(user, "You start adding [B] to [src]...") + if(do_after(user, 20, target = src) && B.use(1)) + make_new_table(/obj/structure/table/bronze) else return ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index e2d270aa56..3e6adb1aa8 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -60,15 +60,23 @@ attack_hand(user) /obj/structure/table/attack_hand(mob/living/user) - if(user.a_intent == INTENT_GRAB && user.pulling && isliving(user.pulling)) + if(user.pulling && isliving(user.pulling)) var/mob/living/pushed_mob = user.pulling if(pushed_mob.buckled) to_chat(user, "[pushed_mob] is buckled to [pushed_mob.buckled]!") return - if(user.grab_state < GRAB_AGGRESSIVE) - to_chat(user, "You need a better grip to do that!") - return - tablepush(user, pushed_mob) + if(user.a_intent == INTENT_GRAB) + if(user.grab_state < GRAB_AGGRESSIVE) + to_chat(user, "You need a better grip to do that!") + return + tablepush(user, pushed_mob) + if(user.a_intent == INTENT_HELP) + pushed_mob.visible_message("[user] begins to place [pushed_mob] onto [src]...", \ + "[user] begins to place [pushed_mob] onto [src]...") + if(do_after(user, 35, target = pushed_mob)) + tableplace(user, pushed_mob) + else + return user.stop_pulling() else ..() @@ -89,13 +97,30 @@ var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSTABLE) +/obj/structure/table/proc/tableplace(mob/living/user, mob/living/pushed_mob) + pushed_mob.forceMove(src.loc) + pushed_mob.lay_down() + pushed_mob.visible_message("[user] places [pushed_mob] onto [src].", \ + "[user] places [pushed_mob] onto [src].") + add_logs(user, pushed_mob, "placed") + /obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) pushed_mob.forceMove(src.loc) pushed_mob.Knockdown(40) pushed_mob.visible_message("[user] pushes [pushed_mob] onto [src].", \ "[user] pushes [pushed_mob] onto [src].") add_logs(user, pushed_mob, "pushed") - + if(!ishuman(pushed_mob)) + return + var/mob/living/carbon/human/H = pushed_mob + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(mood) + if(iscatperson(H)) //Catpeople are a bit dumb and think its fun to be on a table + mood.add_event("table", /datum/mood_event/happytable) + H.startTailWag() + addtimer(CALLBACK(H, /mob/living/carbon/human.proc/endTailWag), 30) + else + mood.add_event("table", /datum/mood_event/table) /obj/structure/table/attackby(obj/item/I, mob/user, params) if(!(flags_1 & NODECONSTRUCT_1)) @@ -263,18 +288,32 @@ /obj/structure/table/wood/fancy name = "fancy table" desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth." - icon = 'icons/obj/smooth_structures/fancy_table.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "fancy_table" frame = /obj/structure/table_frame framestack = /obj/item/stack/rods buildstack = /obj/item/stack/tile/carpet canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black) +/obj/structure/table/wood/fancy/New() + // New() is used so that the /black subtype can override `icon` easily and + // the correct value will be used by the smoothing subsystem. + . = ..() + // Needs to be set dynamically because table smooth sprites are 32x34, + // which the editor treats as a two-tile-tall object. The sprites are that + // size so that the north/south corners look nice - examine the detail on + // the sprites in the editor to see why. + icon = 'icons/obj/smooth_structures/fancy_table.dmi' + /obj/structure/table/wood/fancy/black - icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' icon_state = "fancy_table_black" buildstack = /obj/item/stack/tile/carpet/black +/obj/structure/table/wood/fancy/black/New() + . = ..() + // Ditto above. + icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' + /* * Reinforced tables */ @@ -325,7 +364,7 @@ buildstack = /obj/item/stack/tile/brass framestackamount = 1 buildstackamount = 1 - canSmoothWith = list(/obj/structure/table/reinforced/brass) + canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze) /obj/structure/table/reinforced/brass/New() change_construction_value(2) @@ -350,6 +389,19 @@ /obj/structure/table/reinforced/brass/ratvar_act() obj_integrity = max_integrity +/obj/structure/table/bronze + name = "brass table" + desc = "A solid table made out of bronze." + icon = 'icons/obj/smooth_structures/brass_table.dmi' + icon_state = "brass_table" + resistance_flags = FIRE_PROOF | ACID_PROOF + buildstack = /obj/item/stack/tile/bronze + canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze) + +/obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob) + ..() + playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE) + /* * Surgery Tables */ diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index ab9a6334a0..2213e56921 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -335,6 +335,9 @@ L.ExtinguishMob() L.adjust_fire_stacks(-20) //Douse ourselves with water to avoid fire more easily L.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + GET_COMPONENT_FROM(mood, /datum/component/mood, L) + if(mood) + mood.add_event("shower", /datum/mood_event/nice_shower) if(iscarbon(L)) var/mob/living/carbon/M = L . = TRUE diff --git a/code/game/skincmd.dm b/code/game/skincmd.dm deleted file mode 100644 index ad2f97f55a..0000000000 --- a/code/game/skincmd.dm +++ /dev/null @@ -1,13 +0,0 @@ -/mob/var/skincmds = list() -/obj/proc/SkinCmd(mob/user as mob, var/data as text) - -/proc/SkinCmdRegister(mob/user, name as text, obj/O) - user.skincmds[name] = O - -/mob/verb/skincmd(data as text) - set hidden = 1 - - var/ref = copytext(data, 1, findtext(data, ";")) - if (src.skincmds[ref] != null) - var/obj/a = src.skincmds[ref] - a.SkinCmd(src, copytext(data, findtext(data, ";") + 1)) \ No newline at end of file diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index da1f941ccc..e9276d777b 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -199,6 +199,9 @@ if(!(lube&SLIDE_ICE)) playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3) + GET_COMPONENT_FROM(mood, /datum/component/mood, C) + if(mood) + mood.add_event("slipped", /datum/mood_event/slipped) for(var/obj/item/I in C.held_items) C.accident(I) @@ -269,9 +272,6 @@ if(TURF_WET_PERMAFROST) intensity = 120 lube_flags = SLIDE_ICE | GALOSHES_DONT_HELP - if(TURF_WET_SLIDE) - intensity = 80 - lube_flags = SLIDE | GALOSHES_DONT_HELP else qdel(GetComponent(/datum/component/slippery)) return diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 73e99d7b41..d3f8d00be7 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -240,3 +240,11 @@ icon_state = "sepia" desc = "Time seems to flow very slowly around these tiles." floor_tile = /obj/item/stack/tile/sepia + + +/turf/open/floor/bronze + name = "clockwork floor" + desc = "Some heavy bronze tiles." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "clockwork_floor" + floor_tile = /obj/item/stack/tile/bronze diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 71887fa08e..9c2495f858 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -114,6 +114,7 @@ desc = "The air hangs heavy over this sinister flooring." icon_state = "plating" CanAtmosPass = ATMOS_PASS_NO + floor_tile = null var/obj/effect/clockwork/overlay/floor/bloodcult/realappearance diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index 73ec2515f4..7012c5f6d8 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -170,3 +170,12 @@ desc = "A huge chunk of rusted reinforced metal." icon = 'icons/turf/walls/rusty_reinforced_wall.dmi' hardness = 15 + +/turf/closed/wall/mineral/bronze + name = "clockwork wall" + desc = "A huge chunk of bronze, decorated like gears and cogs." + icon = 'icons/turf/walls/clockwork_wall.dmi' + icon_state = "clockwork_wall" + sheet_type = /obj/item/stack/tile/bronze + sheet_amount = 2 + girder_type = /obj/structure/girder/bronze diff --git a/code/modules/NTNet/netdata.dm b/code/modules/NTNet/netdata.dm index 7d3d8f2b5d..d84ab43a6a 100644 --- a/code/modules/NTNet/netdata.dm +++ b/code/modules/NTNet/netdata.dm @@ -6,7 +6,24 @@ var/plaintext_data var/plaintext_data_secondary - var/plaintext_passkey + var/encrypted_passkey + + var/list/passkey + +// Process data before sending it +/datum/netdata/proc/pre_send(datum/component/ntnet_interface/interface) + // Decrypt the passkey. + if(encrypted_passkey && !passkey) + passkey = json_decode(XorEncrypt(hextostr(encrypted_passkey, TRUE), SScircuit.cipherkey)) + + // Encrypt the passkey. + if(!encrypted_passkey && passkey) + encrypted_passkey = strtohex(XorEncrypt(json_encode(passkey), SScircuit.cipherkey)) + + // If there is no sender ID, set the default one. + if(!sender_id && interface) + sender_id = interface.hardware_id + /datum/netdata/proc/json_list_generation_admin() //for admin logs and such. . = list() @@ -21,9 +38,9 @@ . = list() .["recipient_ids"] = recipient_ids .["sender_id"] = sender_id - .["plaintext_data"] = plaintext_data - .["plaintext_data_secondary"] = plaintext_data_secondary - .["plaintext_passkey"] = plaintext_passkey + .["data"] = plaintext_data + .["data_secondary"] = plaintext_data_secondary + .["passkey"] = encrypted_passkey /datum/netdata/proc/generate_netlog() return "[json_encode(json_list_generation_netlog())]" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index fe7b49e74d..1f818b442e 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -44,6 +44,15 @@ body += "

Show related accounts by: " body += "\[ CID | " body += "IP \]" + + var/rep = 0 + rep += SSpersistence.antag_rep[M.ckey] + body += "

Antagonist reputation: [rep]" + body += "
\[increase\] " + body += "\[decrease\] " + body += "\[set\] " + body += "\[zero\]" + body += "

" body += "Make mentor | " body += "Remove mentor" @@ -643,6 +652,24 @@ log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])") SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/admins/proc/spawn_cargo(object as text) + set category = "Debug" + set desc = "(atom path) Spawn a cargo crate" + set name = "Spawn Cargo" + + if(!check_rights(R_SPAWN)) + return + + var/chosen = pick_closest_path(object, make_types_fancy(subtypesof(/datum/supply_pack))) + if(!chosen) + return + var/datum/supply_pack/S = new chosen + S.admin_spawned = TRUE + S.generate(get_turf(usr)) + + log_admin("[key_name(usr)] spawned cargo pack [chosen] at ([usr.x],[usr.y],[usr.z])") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Cargo") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /datum/admins/proc/show_traitor_panel(mob/M in GLOB.mob_list) set category = "Admin" @@ -747,13 +774,14 @@ dat += "[J_title]: [J_opPos]/[job.total_positions < 0 ? " (unlimited)" : J_totPos]" if(job.title == "AI" || job.title == "Cyborg") - dat += " (Cannot Late Join)" + dat += " (Cannot Late Join)" continue else dat += "" dat += "" if(job.total_positions >= 0) - dat += "Add | " + dat += "Custom | " + dat += "Add 1 | " if(job.total_positions > job.current_positions) dat += "Remove | " else @@ -798,7 +826,7 @@ //returns 1 to let the dragdrop code know we are trapping this event //returns 0 if we don't plan to trap the event -/datum/admins/proc/cmd_ghost_drag(mob/dead/observer/frommob, mob/living/tomob) +/datum/admins/proc/cmd_ghost_drag(mob/dead/observer/frommob, mob/tomob) //this is the exact two check rights checks required to edit a ckey with vv. if (!check_rights(R_VAREDIT,0) || !check_rights(R_SPAWN|R_DEBUG,0)) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 2414c55528..d6386b48b3 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -1,13 +1,17 @@ GLOBAL_LIST_EMPTY(admin_ranks) //list of all admin_rank datums GLOBAL_PROTECT(admin_ranks) +GLOBAL_LIST_EMPTY(protected_ranks) //admin ranks loaded from txt +GLOBAL_PROTECT(protected_ranks) + /datum/admin_rank var/name = "NoRank" var/rights = R_DEFAULT - var/list/adds - var/list/subs + var/exclude_rights = 0 + var/include_rights = 0 + var/can_edit_rights = 0 -/datum/admin_rank/New(init_name, init_rights, list/init_adds, list/init_subs) +/datum/admin_rank/New(init_name, init_rights, init_exclude_rights, init_edit_rights) if(IsAdminAdvancedProcCall()) var/msg = " has tried to elevate permissions!" message_admins("[key_name_admin(usr)][msg]") @@ -17,19 +21,18 @@ GLOBAL_PROTECT(admin_ranks) CRASH("Admin proc call creation of admin datum") return name = init_name - switch(name) - if("Removed",null,"") - QDEL_IN(src, 0) - throw EXCEPTION("invalid admin-rank name") - return + if(!name) + qdel(src) + throw EXCEPTION("Admin rank created without name.") + return if(init_rights) rights = init_rights - if(!init_adds) - init_adds = list() - if(!init_subs) - init_subs = list() - adds = init_adds - subs = init_subs + include_rights = rights + if(init_exclude_rights) + exclude_rights = init_exclude_rights + rights &= ~exclude_rights + if(init_edit_rights) + can_edit_rights = init_edit_rights /datum/admin_rank/Destroy() if(IsAdminAdvancedProcCall()) @@ -39,12 +42,12 @@ GLOBAL_PROTECT(admin_ranks) return QDEL_HINT_LETMELIVE . = ..() +/datum/admin_rank/can_vv_get(var_name) + return FALSE + /datum/admin_rank/vv_edit_var(var_name, var_value) return FALSE -#if DM_VERSION > 512 -#error remove the rejuv keyword from this proc -#endif /proc/admin_keyword_to_flag(word, previous_rights=0) var/flag = 0 switch(ckey(word)) @@ -78,16 +81,12 @@ GLOBAL_PROTECT(admin_ranks) flag = R_SPAWN if("autologin", "autoadmin") flag = R_AUTOLOGIN + if("dbranks") + flag = R_DBRANKS if("@","prev") flag = previous_rights - if("rejuv","rejuvinate") - stack_trace("Legacy keyword rejuvinate used defaulting to R_ADMIN") - flag = R_ADMIN return flag -/proc/admin_keyword_to_path(word) //use this with verb keywords eg +/client/proc/blah - return text2path(copytext(word, 2, findtext(word, " ", 2, 0))) - // Adds/removes rights to this admin_rank /datum/admin_rank/proc/process_keyword(word, previous_rights=0) if(IsAdminAdvancedProcCall()) @@ -100,157 +99,156 @@ GLOBAL_PROTECT(admin_ranks) switch(text2ascii(word,1)) if(43) rights |= flag //+ + include_rights |= flag if(45) rights &= ~flag //- - else - //isn't a keyword so maybe it's a verbpath? - var/path = admin_keyword_to_path(word) - if(path) - switch(text2ascii(word,1)) - if(43) - if(!subs.Remove(path)) - adds += path //+ - if(45) - if(!adds.Remove(path)) - subs += path //- - + exclude_rights |= flag + if(42) + can_edit_rights |= flag //* // Checks for (keyword-formatted) rights on this admin /datum/admins/proc/check_keyword(word) var/flag = admin_keyword_to_flag(word) if(flag) return ((rank.rights & flag) == flag) //true only if right has everything in flag - else - var/path = admin_keyword_to_path(word) - for(var/i in owner.verbs) //this needs to be a foreach loop for some reason. in operator and verbs.Find() don't work - if(i == path) - return 1 - return 0 //load our rank - > rights associations -/proc/load_admin_ranks() +/proc/load_admin_ranks(dbfail) if(IsAdminAdvancedProcCall()) to_chat(usr, "Admin Reload blocked: Advanced ProcCall detected.") return GLOB.admin_ranks.Cut() - - if(CONFIG_GET(flag/admin_legacy_system)) - var/previous_rights = 0 - //load text from file and process each line separately - for(var/line in world.file2list("[global.config.directory]/admin_ranks.txt")) - if(!line) - continue - if(findtextEx(line,"#",1,2)) - continue - - var/next = findtext(line, "=") - var/datum/admin_rank/R = new(ckeyEx(copytext(line, 1, next))) - if(!R) - continue - GLOB.admin_ranks += R - - var/prev = findchar(line, "+-", next, 0) - while(prev) - next = findchar(line, "+-", prev + 1, 0) - R.process_keyword(copytext(line, prev, next), previous_rights) - prev = next - - previous_rights = R.rights - else - if(!SSdbcore.Connect()) - if(CONFIG_GET(flag/sql_enabled)) - var/msg = "Failed to connect to database in load_admin_ranks(). Reverting to legacy system." - log_world(msg) - WRITE_FILE(GLOB.world_game_log, msg) - CONFIG_SET(flag/admin_legacy_system, TRUE) - load_admin_ranks() - return - - var/datum/DBQuery/query_load_admin_ranks = SSdbcore.NewQuery("SELECT rank, flags FROM [format_table_name("admin_ranks")]") + GLOB.protected_ranks.Cut() + var/previous_rights = 0 + //load text from file and process each line separately + for(var/line in world.file2list("[global.config.directory]/admin_ranks.txt")) + if(!line || findtextEx(line,"#",1,2)) + continue + var/next = findtext(line, "=") + var/datum/admin_rank/R = new(ckeyEx(copytext(line, 1, next))) + if(!R) + continue + GLOB.admin_ranks += R + GLOB.protected_ranks += R + var/prev = findchar(line, "+-*", next, 0) + while(prev) + next = findchar(line, "+-*", prev + 1, 0) + R.process_keyword(copytext(line, prev, next), previous_rights) + prev = next + previous_rights = R.rights + if(!CONFIG_GET(flag/admin_legacy_system) || dbfail) + var/datum/DBQuery/query_load_admin_ranks = SSdbcore.NewQuery("SELECT rank, flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")]") if(!query_load_admin_ranks.Execute()) + message_admins("Error loading admin ranks from database. Loading from backup.") + log_sql("Error loading admin ranks from database. Loading from backup.") + dbfail = 1 + else + while(query_load_admin_ranks.NextRow()) + var/skip + var/rank_name = query_load_admin_ranks.item[1] + for(var/datum/admin_rank/R in GLOB.admin_ranks) + if(R.name == rank_name) //this rank was already loaded from txt override + skip = 1 + break + if(!skip) + var/rank_flags = text2num(query_load_admin_ranks.item[2]) + var/rank_exclude_flags = text2num(query_load_admin_ranks.item[3]) + var/rank_can_edit_flags = text2num(query_load_admin_ranks.item[4]) + var/datum/admin_rank/R = new(rank_name, rank_flags, rank_exclude_flags, rank_can_edit_flags) + if(!R) + continue + GLOB.admin_ranks += R + //load ranks from backup file + if(dbfail) + var/backup_file = file("data/admins_backup.json") + if(!fexists(backup_file)) + log_world("Unable to locate admins backup file.") return - while(query_load_admin_ranks.NextRow()) - var/rank_name = ckeyEx(query_load_admin_ranks.item[1]) - var/flags = query_load_admin_ranks.item[2] - if(istext(flags)) - flags = text2num(flags) - var/datum/admin_rank/R = new(rank_name, flags) + var/list/json = json_decode(file2text(backup_file)) + for(var/J in json["ranks"]) + for(var/datum/admin_rank/R in GLOB.admin_ranks) + if(R.name == "[J]") //this rank was already loaded from txt override + continue + var/datum/admin_rank/R = new("[J]", json["ranks"]["[J]"]["include rights"], json["ranks"]["[J]"]["exclude rights"], json["ranks"]["[J]"]["can edit rights"]) if(!R) continue GLOB.admin_ranks += R - + return 1 #ifdef TESTING var/msg = "Permission Sets Built:\n" for(var/datum/admin_rank/R in GLOB.admin_ranks) msg += "\t[R.name]" - var/rights = rights2text(R.rights,"\n\t\t",R.adds,R.subs) + var/rights = rights2text(R.rights,"\n\t\t") if(rights) msg += "\t\t[rights]\n" testing(msg) #endif - /proc/load_admins() + var/dbfail + if(!CONFIG_GET(flag/admin_legacy_system) && !SSdbcore.Connect()) + message_admins("Failed to connect to database while loading admins. Loading from backup.") + log_sql("Failed to connect to database while loading admins. Loading from backup.") + dbfail = 1 //clear the datums references - GLOB.admin_datums.Cut() for(var/client/C in GLOB.admins) C.remove_admin_verbs() C.holder = null GLOB.admins.Cut() + GLOB.protected_admins.Cut() GLOB.deadmins.Cut() - load_admin_ranks() + dbfail = load_admin_ranks(dbfail) //Clear profile access for(var/A in world.GetConfig("admin")) world.SetConfig("APP/admin", A, null) - var/list/rank_names = list() for(var/datum/admin_rank/R in GLOB.admin_ranks) rank_names[R.name] = R - - if(CONFIG_GET(flag/admin_legacy_system)) - //load text from file - var/list/lines = world.file2list("[global.config.directory]/admins.txt") - - //process each line separately - for(var/line in lines) - if(!length(line)) - continue - if(findtextEx(line, "#", 1, 2)) - continue - - var/list/entry = splittext(line, "=") - if(entry.len < 2) - continue - - var/ckey = ckey(entry[1]) - var/rank = ckeyEx(entry[2]) - if(!ckey || !rank) - continue - - new /datum/admins(rank_names[rank], ckey) - - else - if(!SSdbcore.Connect()) - log_world("Failed to connect to database in load_admins(). Reverting to legacy system.") - WRITE_FILE(GLOB.world_game_log, "Failed to connect to database in load_admins(). Reverting to legacy system.") - CONFIG_SET(flag/admin_legacy_system, TRUE) - load_admins() - return - + //ckeys listed in admins.txt are always made admins before sql loading is attempted + var/list/lines = world.file2list("[global.config.directory]/admins.txt") + for(var/line in lines) + if(!length(line) || findtextEx(line, "#", 1, 2)) + continue + var/list/entry = splittext(line, "=") + if(entry.len < 2) + continue + var/ckey = ckey(entry[1]) + var/rank = ckeyEx(entry[2]) + if(!ckey || !rank) + continue + new /datum/admins(rank_names[rank], ckey, 0, 1) + if(!CONFIG_GET(flag/admin_legacy_system) || dbfail) var/datum/DBQuery/query_load_admins = SSdbcore.NewQuery("SELECT ckey, rank FROM [format_table_name("admin")]") if(!query_load_admins.Execute()) + message_admins("Error loading admins from database. Loading from backup.") + log_sql("Error loading admins from database. Loading from backup.") + dbfail = 1 + else + while(query_load_admins.NextRow()) + var/admin_ckey = query_load_admins.item[1] + var/admin_rank = query_load_admins.item[2] + var/skip + if(rank_names[admin_rank] == null) + message_admins("[admin_ckey] loaded with invalid admin rank [admin_rank].") + log_sql("[admin_ckey] loaded with invalid admin rank [admin_rank].") + skip = 1 + if(GLOB.admin_datums[admin_ckey] || GLOB.deadmins[admin_ckey]) + skip = 1 + if(!skip) + new /datum/admins(rank_names[admin_rank], admin_ckey) + //load admins from backup file + if(dbfail) + var/backup_file = file("data/admins_backup.json") + if(!fexists(backup_file)) + log_world("Unable to locate admins backup file.") return - while(query_load_admins.NextRow()) - var/ckey = ckey(query_load_admins.item[1]) - var/rank = ckeyEx(query_load_admins.item[2]) - - if(rank_names[rank] == null) - WARNING("Admin rank ([rank]) does not exist.") - continue - - new /datum/admins(rank_names[rank], ckey) - + var/list/json = json_decode(file2text(backup_file)) + for(var/J in json["admins"]) + for(var/A in GLOB.admin_datums + GLOB.deadmins) + if(A == "[J]") //this admin was already loaded from txt override + continue + new /datum/admins(rank_names[json["admins"]["[J]"]], "[J]") #ifdef TESTING var/msg = "Admins Built:\n" for(var/ckey in GLOB.admin_datums) @@ -258,7 +256,7 @@ GLOBAL_PROTECT(admin_ranks) msg += "\t[ckey] - [D.rank.name]\n" testing(msg) #endif - + return dbfail #ifdef TESTING /client/verb/changerank(newrank in GLOB.admin_ranks) @@ -277,149 +275,3 @@ GLOBAL_PROTECT(admin_ranks) remove_admin_verbs() holder.associate(src) #endif - -/datum/admins/proc/edit_rights_topic(list/href_list) - if(!check_rights(R_PERMISSIONS)) - message_admins("[key_name_admin(usr)] attempted to edit the admin permissions without sufficient rights.") - log_admin("[key_name(usr)] attempted to edit the admin permissions without sufficient rights.") - return - if(IsAdminAdvancedProcCall()) - to_chat(usr, "Admin Edit blocked: Advanced ProcCall detected.") - return - - var/adm_ckey - var/task = href_list["editrights"] - switch(task) - if("add") - var/new_ckey = ckey(input(usr,"New admin's ckey","Admin ckey", null) as text|null) - if(!new_ckey) - return - if(new_ckey in GLOB.admin_datums) - to_chat(usr, "Error: Topic 'editrights': [new_ckey] is already an admin") - return - adm_ckey = new_ckey - task = "rank" - else - adm_ckey = ckey(href_list["ckey"]) - if(!adm_ckey) - to_chat(usr, "Error: Topic 'editrights': No valid ckey") - return - - var/datum/admins/D = GLOB.admin_datums[adm_ckey] - if (!D) - D = GLOB.deadmins[adm_ckey] - - switch(task) - if("remove") - if(alert("Are you sure you want to remove [adm_ckey]?","Message","Yes","Cancel") == "Yes") - if(!D) - return - if(!check_if_greater_rights_than_holder(D)) - message_admins("[key_name_admin(usr)] attempted to remove [adm_ckey] from the admins list without sufficient rights.") - log_admin("[key_name(usr)] attempted to remove [adm_ckey] from the admins list without sufficient rights.") - return - GLOB.admin_datums -= adm_ckey - GLOB.deadmins -= adm_ckey - D.disassociate() - - updateranktodb(adm_ckey, "player") - message_admins("[key_name_admin(usr)] removed [adm_ckey] from the admins list") - log_admin("[key_name(usr)] removed [adm_ckey] from the admins list") - log_admin_rank_modification(adm_ckey, "Removed") - - if("rank") - var/datum/admin_rank/R - - var/list/rank_names = list("*New Rank*") - for(R in GLOB.admin_ranks) - rank_names[R.name] = R - - var/new_rank = input("Please select a rank", "New rank", null, null) as null|anything in rank_names - - switch(new_rank) - if(null) - return - if("*New Rank*") - new_rank = ckeyEx(input("Please input a new rank", "New custom rank", null, null) as null|text) - if(!new_rank) - return - - if(D) - if(!check_if_greater_rights_than_holder(D)) - message_admins("[key_name_admin(usr)] attempted to change the rank of [adm_ckey] to [new_rank] without sufficient rights.") - log_admin("[key_name(usr)] attempted to change the rank of [adm_ckey] to [new_rank] without sufficient rights.") - return - - R = rank_names[new_rank] - if(!R) //rank with that name doesn't exist yet - make it - if(D) - R = new(new_rank, D.rank.rights, D.rank.adds, D.rank.subs) //duplicate our previous admin_rank but with a new name - else - R = new(new_rank) //blank new admin_rank - GLOB.admin_ranks += R - - if(D) //they were previously an admin - D.disassociate() //existing admin needs to be disassociated - D.rank = R //set the admin_rank as our rank - D.associate() - else - D = new(R, adm_ckey, TRUE) //new admin - - updateranktodb(adm_ckey, new_rank) - message_admins("[key_name_admin(usr)] edited the admin rank of [adm_ckey] to [new_rank]") - log_admin("[key_name(usr)] edited the admin rank of [adm_ckey] to [new_rank]") - log_admin_rank_modification(adm_ckey, new_rank) - - if("permissions") - if(!D) - return //they're not an admin! - - var/keyword = input("Input permission keyword (one at a time):\ne.g. +BAN or -FUN or +/client/proc/someverb", "Permission toggle", null, null) as null|text - if(!keyword) - return - - if(!check_keyword(keyword) || !check_if_greater_rights_than_holder(D)) - message_admins("[key_name_admin(usr)] attempted to give [adm_ckey] the keyword [keyword] without sufficient rights.") - log_admin("[key_name(usr)] attempted to give [adm_ckey] the keyword [keyword] without sufficient rights.") - return - - D.disassociate() - - if(!findtext(D.rank.name, "([adm_ckey])")) //not a modified subrank, need to duplicate the admin_rank datum to prevent modifying others too - D.rank = new("[D.rank.name]([adm_ckey])", D.rank.rights, D.rank.adds, D.rank.subs) //duplicate our previous admin_rank but with a new name - //we don't add this clone to the admin_ranks list, as it is unique to that ckey - D.rank.process_keyword(keyword) - - var/client/C = GLOB.directory[adm_ckey] //find the client with the specified ckey (if they are logged in) - D.associate(C) //link up with the client and add verbs - - message_admins("[key_name(usr)] added keyword [keyword] to permission of [adm_ckey]") - log_admin("[key_name(usr)] added keyword [keyword] to permission of [adm_ckey]") - log_admin_permission_modification(adm_ckey, D.rank.rights) - if("activate") //forcefully readmin - if(!D || !D.deadmined) - return - - D.activate() - - message_admins("[key_name_admin(usr)] forcefully readmined [adm_ckey]") - log_admin("[key_name(usr)] forcefully readmined [adm_ckey]") - if("deactivate") //forcefully deadmin - if(!D || D.deadmined) - return - - message_admins("[key_name_admin(usr)] forcefully deadmined [adm_ckey]") - log_admin("[key_name(usr)] forcefully deadmined [adm_ckey]") - - D.deactivate() //after logs so the deadmined admin can see the message. - - edit_admin_permissions() - -/datum/admins/proc/updateranktodb(ckey,newrank) - if(!SSdbcore.Connect()) - return - var/sql_ckey = sanitizeSQL(ckey) - var/sql_admin_rank = sanitizeSQL(newrank) - - var/datum/DBQuery/query_admin_rank_update = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET lastadminrank = '[sql_admin_rank]' WHERE ckey = '[sql_ckey]'") - query_admin_rank_update.Execute() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9258da7325..1728b44d9f 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -64,6 +64,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) /client/proc/cmd_change_command_name, /client/proc/cmd_admin_check_player_exp, /* shows players by playtime */ /client/proc/toggle_antag_hud, /*toggle display of the admin antag hud*/ + /client/proc/toggle_combo_hud, // toggle display of the combination pizza antag and taco sci/med/eng hud /client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/ /client/proc/open_shuttle_manipulator, /* Opens shuttle manipulator UI */ /client/proc/deadchat, @@ -99,7 +100,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/smite )) GLOBAL_PROTECT(admin_verbs_spawn) -GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /client/proc/respawn_character)) +GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character)) GLOBAL_PROTECT(admin_verbs_server) GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /world/proc/AVerbsServer() @@ -156,7 +157,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug()) /client/proc/pump_random_event, /client/proc/cmd_display_init_log, /client/proc/cmd_display_overlay_log, - /datum/admins/proc/create_or_modify_area + /datum/admins/proc/create_or_modify_area, ) GLOBAL_PROTECT(admin_verbs_possess) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) @@ -229,6 +230,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( /client/proc/toggle_nuke, /client/proc/cmd_display_del_log, /client/proc/toggle_antag_hud, + /client/proc/toggle_combo_hud, /client/proc/debug_huds )) @@ -265,11 +267,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( if(rights & R_SPAWN) verbs += GLOB.admin_verbs_spawn - for(var/path in holder.rank.adds) - verbs += path - for(var/path in holder.rank.subs) - verbs -= path - /client/proc/remove_admin_verbs() verbs.Remove( GLOB.admin_verbs_default, @@ -304,8 +301,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( /client/proc/cmd_admin_areatest_station, /client/proc/readmin ) - if(holder) - verbs.Remove(holder.rank.adds) /client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs set name = "Adminverbs - Hide Most" @@ -526,8 +521,10 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( set desc = "Get the estimated range of a bomb, using explosive power." var/ex_power = input("Explosive Power:") as null|num + if (isnull(ex_power)) + return var/range = round((2 * ex_power)**GLOB.DYN_EX_SCALE) - to_chat(usr, "Estimated Explosive Range: (Devestation: [round(range*0.25)], Heavy: [round(range*0.5)], Light: [round(range)])") + to_chat(usr, "Estimated Explosive Range: (Devastation: [round(range*0.25)], Heavy: [round(range*0.5)], Light: [round(range)])") /client/proc/get_dynex_power() set category = "Debug" @@ -535,6 +532,8 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( set desc = "Get the estimated required power of a bomb, to reach a specific range." var/ex_range = input("Light Explosion Range:") as null|num + if (isnull(ex_range)) + return var/power = (0.5 * ex_range)**(1/GLOB.DYN_EX_SCALE) to_chat(usr, "Estimated Explosive Power: [power]") @@ -587,14 +586,17 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( message_admins("[key_name_admin(usr)] removed the spell [S] from [key_name(T)].") SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/give_disease(mob/T in GLOB.mob_list) +/client/proc/give_disease(mob/living/T in GLOB.mob_living_list) set category = "Fun" set name = "Give Disease" set desc = "Gives a Disease to a mob." + if(!istype(T)) + to_chat(src, "You can only give a disease to a mob of type /mob/living.") + return var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in SSdisease.diseases if(!D) return - T.ForceContractDisease(new D) + T.ForceContractDisease(new D, FALSE, TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Disease") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].") message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].") diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 59d432574d..fd526e4aab 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -1,5 +1,7 @@ GLOBAL_LIST_EMPTY(admin_datums) GLOBAL_PROTECT(admin_datums) +GLOBAL_LIST_EMPTY(protected_admins) +GLOBAL_PROTECT(protected_admins) GLOBAL_VAR_INIT(href_token, GenerateToken()) GLOBAL_PROTECT(href_token) @@ -26,7 +28,7 @@ GLOBAL_PROTECT(href_token) var/deadmined -/datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE) +/datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE, protected) if(IsAdminAdvancedProcCall()) var/msg = " has tried to elevate permissions!" message_admins("[key_name_admin(usr)][msg]") @@ -51,6 +53,8 @@ GLOBAL_PROTECT(href_token) if(R.rights & R_DEBUG) //grant profile access world.SetConfig("APP/admin", ckey, "role=admin") //only admins with +ADMIN start admined + if(protected) + GLOB.protected_admins[target] = src if (force_active || (R.rights & R_AUTOLOGIN)) activate() else @@ -142,6 +146,9 @@ GLOBAL_PROTECT(href_token) return 1 //we have all the rights they have and more return 0 +/datum/admins/can_vv_get(var_name, var_value) + return FALSE //nice try trialmin + /datum/admins/vv_edit_var(var_name, var_value) return FALSE //nice try trialmin diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm new file mode 100644 index 0000000000..1173c9393c --- /dev/null +++ b/code/modules/admin/permissionedit.dm @@ -0,0 +1,274 @@ +/client/proc/edit_admin_permissions() + set category = "Admin" + set name = "Permissions Panel" + set desc = "Edit admin permissions" + if(!check_rights(R_PERMISSIONS)) + return + usr.client.holder.edit_admin_permissions() + +/datum/admins/proc/edit_admin_permissions() + if(!check_rights(R_PERMISSIONS)) + return + + var/list/output = list({" + + +Permissions Panel + + + + +
+ + + + + + + +"}) + + for(var/adm_ckey in GLOB.admin_datums+GLOB.deadmins) + var/datum/admins/D = GLOB.admin_datums[adm_ckey] + if(!D) + D = GLOB.deadmins[adm_ckey] + if (!D) + continue + + var/deadminlink = "" + if (D.deadmined) + deadminlink = " \[RA\]" + else + deadminlink = " \[DA\]" + + output += "" + output += "" + output += "" + output += "" + output += "" + output += "" + output += "" + + output += {" +
CKEY \[+\]RANKPERMISSIONSDENIEDALLOWED TO EDIT
[adm_ckey] [deadminlink]\[-\][D.rank.name][rights2text(D.rank.include_rights," ")][rights2text(D.rank.exclude_rights," ", "-")][rights2text(D.rank.can_edit_rights," ", "*")]
+
Search:
+ +"} + + usr << browse(jointext(output, ""),"window=editrights;size=1000x650") + +/datum/admins/proc/edit_rights_topic(list/href_list) + if(!check_rights(R_PERMISSIONS)) + message_admins("[key_name_admin(usr)] attempted to edit admin permissions without sufficient rights.") + log_admin("[key_name(usr)] attempted to edit admin permissions without sufficient rights.") + return + if(IsAdminAdvancedProcCall()) + to_chat(usr, "Admin Edit blocked: Advanced ProcCall detected.") + return + var/datum/asset/permissions_assets = get_asset_datum(/datum/asset/simple/permissions) + permissions_assets.send(src) + var/admin_ckey = ckey(href_list["ckey"]) + var/datum/admins/D = GLOB.admin_datums[admin_ckey] + var/use_db + var/task = href_list["editrights"] + var/skip + if(task == "activate" || task == "deactivate") + skip = 1 + if(!CONFIG_GET(flag/admin_legacy_system) && CONFIG_GET(flag/protect_legacy_admins) && task == "rank") + if(admin_ckey in GLOB.protected_admins) + to_chat(usr, "Editing the rank of this admin is blocked by server configuration.") + return + if(!CONFIG_GET(flag/admin_legacy_system) && CONFIG_GET(flag/protect_legacy_ranks) && task == "permissions") + if(D.rank in GLOB.protected_ranks) + to_chat(usr, "Editing the flags of this rank is blocked by server configuration.") + return + if(check_rights(R_DBRANKS, 0)) + if(!skip) + if(!SSdbcore.Connect()) + to_chat(usr, "Unable to connect to database, changes are temporary only.") + use_db = "Temporary" + if(!use_db) + use_db = alert("Permanent changes are saved to the database for future rounds, temporary changes will affect only the current round", "Permanent or Temporary?", "Permanent", "Temporary", "Cancel") + if(use_db == "Cancel") + return + if(use_db == "Permanent") + use_db = 1 + admin_ckey = sanitizeSQL(admin_ckey) + else + use_db = 0 + if(task != "add") + D = GLOB.admin_datums[admin_ckey] + if(!D) + D = GLOB.deadmins[admin_ckey] + if(!D) + return + if(!check_if_greater_rights_than_holder(D)) + message_admins("[key_name_admin(usr)] attempted to change the rank of [admin_ckey] without sufficient rights.") + log_admin("[key_name(usr)] attempted to change the rank of [admin_ckey] without sufficient rights.") + switch(task) + if("add") + admin_ckey = add_admin(use_db) + if(!admin_ckey) + return + change_admin_rank(admin_ckey, use_db) + if("remove") + remove_admin(admin_ckey, use_db, D) + if("rank") + change_admin_rank(admin_ckey, use_db, D) + if("permissions") + change_admin_flags(admin_ckey, use_db, D) + if("activate") + force_readmin(admin_ckey, D) + if("deactivate") + force_deadmin(admin_ckey, D) + edit_admin_permissions() + +/datum/admins/proc/add_admin(use_db) + . = sanitizeSQL(ckey(input("New admin's ckey","Admin ckey") as text|null)) + if(!.) + return 0 + if(. in GLOB.admin_datums+GLOB.deadmins) + to_chat(usr, "[.] is already an admin.") + return 0 + if(use_db) + var/datum/DBQuery/query_add_admin = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin")] (ckey, rank) VALUES ('[.]', 'NEW ADMIN')") + if(!query_add_admin.warn_execute()) + return 0 + var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'add admin', 'New admin added: [.]')") + if(!query_add_admin_log.warn_execute()) + return 0 + +/datum/admins/proc/remove_admin(admin_ckey, use_db, datum/admins/D) + if(alert("Are you sure you want to remove [admin_ckey]?","Confirm Removal","Do it","Cancel") == "Do it") + GLOB.admin_datums -= admin_ckey + GLOB.deadmins -= admin_ckey + D.disassociate() + if(use_db) + var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("DELETE FROM [format_table_name("admin")] WHERE ckey = '[admin_ckey]'") + if(!query_add_rank.warn_execute()) + return + var/datum/DBQuery/query_add_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'remove admin', 'Admin removed: [admin_ckey]')") + if(!query_add_rank_log.warn_execute()) + return + message_admins("[key_name_admin(usr)] removed [admin_ckey] from the admins list [use_db ? "permanently" : "temporarily"]") + log_admin("[key_name(usr)] removed [admin_ckey] from the admins list [use_db ? "permanently" : "temporarily"]") + +/datum/admins/proc/force_readmin(admin_ckey, datum/admins/D) + if(!D || !D.deadmined) + return + D.activate() + message_admins("[key_name_admin(usr)] forcefully readmined [admin_ckey]") + log_admin("[key_name(usr)] forcefully readmined [admin_ckey]") + +/datum/admins/proc/force_deadmin(admin_ckey, datum/admins/D) + if(!D || D.deadmined) + return + message_admins("[key_name_admin(usr)] forcefully deadmined [admin_ckey]") + log_admin("[key_name(usr)] forcefully deadmined [admin_ckey]") + D.deactivate() //after logs so the deadmined admin can see the message. + +/datum/admins/proc/change_admin_rank(admin_ckey, use_db, datum/admins/D) + var/datum/admin_rank/R + var/list/rank_names = list("*New Rank*") + for(R in GLOB.admin_ranks) + if((R.rights & usr.client.holder.rank.can_edit_rights) == R.rights) + rank_names[R.name] = R + var/new_rank = input("Please select a rank", "New rank") as null|anything in rank_names + if(new_rank == "*New Rank*") + new_rank = sanitizeSQL(ckeyEx(input("Please input a new rank", "New custom rank") as text|null)) + if(!new_rank) + return + R = rank_names[new_rank] + if(!R) //rank with that name doesn't exist yet - make it + if(D) + R = new(new_rank, D.rank.rights) //duplicate our previous admin_rank but with a new name + else + R = new(new_rank) //blank new admin_rank + GLOB.admin_ranks += R + if(use_db) + if(!R) + var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_ranks")] (rank, flags, exclude_flags, can_edit_rights) VALUES ('[new_rank]', '0', '0', '0')") + if(!query_add_rank.warn_execute()) + return + var/datum/DBQuery/query_add_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'add rank', 'New rank added: [admin_ckey]')") + if(!query_add_rank_log.warn_execute()) + return + var/old_rank + var/datum/DBQuery/query_get_rank = SSdbcore.NewQuery("SELECT rank FROM [format_table_name("admin")] WHERE ckey = '[admin_ckey]'") + if(!query_get_rank.warn_execute()) + return + if(query_get_rank.NextRow()) + old_rank = query_get_rank.item[1] + var/datum/DBQuery/query_change_rank = SSdbcore.NewQuery("UPDATE [format_table_name("admin")] SET rank = '[new_rank]' WHERE ckey = '[admin_ckey]'") + if(!query_change_rank.warn_execute()) + return + var/datum/DBQuery/query_change_rank_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'change admin rank', 'Rank of [admin_ckey] changed from [old_rank] to [new_rank]')") + if(!query_change_rank_log.warn_execute()) + return + if(D) //they were previously an admin + D.disassociate() //existing admin needs to be disassociated + D.rank = R //set the admin_rank as our rank + D.associate() + else + D = new(R, admin_ckey, TRUE) //new admin + message_admins("[key_name_admin(usr)] edited the admin rank of [admin_ckey] to [new_rank] [use_db ? "permanently" : "temporarily"]") + log_admin("[key_name(usr)] edited the admin rank of [admin_ckey] to [new_rank] [use_db ? "permanently" : "temporarily"]") + +/datum/admins/proc/change_admin_flags(admin_ckey, use_db, datum/admins/D) + var/new_flags = input_bitfield(usr, "Include permission flags
[use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_ckey]"]", "admin_flags", D.rank.include_rights, 350, 590, allowed_edit_list = usr.client.holder.rank.can_edit_rights) + if(isnull(new_flags)) + return + var/new_exclude_flags = input_bitfield(usr, "Exclude permission flags
Flags enabled here will be removed from a rank.
Note these take precedence over included flags.
[use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_ckey]"]", "admin_flags", D.rank.exclude_rights, 350, 660, "red", usr.client.holder.rank.can_edit_rights) + if(isnull(new_exclude_flags)) + return + var/new_can_edit_flags = input_bitfield(usr, "Editable permission flags
These are the flags this rank is allowed to edit if they have access to the permissions panel.
They will be unable to modify admins to a rank that has a flag not included here.
[use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_ckey]"]", "admin_flags", D.rank.can_edit_rights, 350, 710, allowed_edit_list = usr.client.holder.rank.can_edit_rights) + if(isnull(new_can_edit_flags)) + return + if(use_db) + var/old_flags + var/old_exclude_flags + var/old_can_edit_flags + var/datum/DBQuery/query_get_rank_flags = SSdbcore.NewQuery("SELECT flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")] WHERE rank = '[D.rank.name]'") + if(!query_get_rank_flags.warn_execute()) + return + if(query_get_rank_flags.NextRow()) + old_flags = text2num(query_get_rank_flags.item[1]) + old_exclude_flags = text2num(query_get_rank_flags.item[2]) + old_can_edit_flags = text2num(query_get_rank_flags.item[3]) + var/datum/DBQuery/query_change_rank_flags = SSdbcore.NewQuery("UPDATE [format_table_name("admin_ranks")] SET flags = '[new_flags]', exclude_flags = '[new_exclude_flags]', can_edit_flags = '[new_can_edit_flags]' WHERE rank = '[D.rank.name]'") + if(!query_change_rank_flags.warn_execute()) + return + var/datum/DBQuery/query_change_rank_flags_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'change rank flags', 'Permissions of [admin_ckey] changed from[rights2text(old_flags," ")][rights2text(old_exclude_flags," ", "-")][rights2text(old_can_edit_flags," ", "*")] to[rights2text(new_flags," ")][rights2text(new_exclude_flags," ", "-")][rights2text(new_can_edit_flags," ", "*")]')") + if(!query_change_rank_flags_log.warn_execute()) + return + for(var/datum/admin_rank/R in GLOB.admin_ranks) + if(R.name != D.rank.name) + continue + R.rights = new_flags &= ~new_exclude_flags + R.exclude_rights = new_exclude_flags + R.include_rights = new_flags + R.can_edit_rights = new_can_edit_flags + for(var/i in GLOB.admin_datums+GLOB.deadmins) + var/datum/admins/A = GLOB.admin_datums[i] + if(!A) + A = GLOB.deadmins[i] + if (!A) + continue + if(A.rank.name != D.rank.name) + continue + var/client/C = GLOB.directory[A.target] + A.disassociate() + A.associate(C) + else + D.disassociate() + if(!findtext(D.rank.name, "([admin_ckey])")) //not a modified subrank, need to duplicate the admin_rank datum to prevent modifying others too + D.rank = new("[D.rank.name]([admin_ckey])", new_flags, new_exclude_flags, new_can_edit_flags) //duplicate our previous admin_rank but with a new name + //we don't add this clone to the admin_ranks list, as it is unique to that ckey + else + D.rank.rights = new_flags &= ~new_exclude_flags + D.rank.include_rights = new_flags + D.rank.exclude_rights = new_exclude_flags + var/client/C = GLOB.directory[admin_ckey] //find the client with the specified ckey (if they are logged in) + D.associate(C) //link up with the client and add verbs + message_admins("[key_name_admin(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_ckey] temporarily"]") + log_admin("[key_name(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_ckey] temporarily"]") diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm deleted file mode 100644 index a0035afa9d..0000000000 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ /dev/null @@ -1,145 +0,0 @@ -/client/proc/edit_admin_permissions() - set category = "Admin" - set name = "Permissions Panel" - set desc = "Edit admin permissions" - if(!check_rights(R_PERMISSIONS)) - return - usr.client.holder.edit_admin_permissions() - -/datum/admins/proc/edit_admin_permissions() - if(!check_rights(R_PERMISSIONS)) - return - - var/list/output = list({" - - -Permissions Panel - - - - -
- - - - - - -"}) - - for(var/adm_ckey in GLOB.admin_datums+GLOB.deadmins) - var/datum/admins/D = GLOB.admin_datums[adm_ckey] - if(!D) - D = GLOB.deadmins[adm_ckey] - if (!D) - continue - - var/rights = rights2text(D.rank.rights," ") - if(!rights) - rights = "*none*" - var/deadminlink = "" - if (D.deadmined) - deadminlink = " \[RA\]" - else - deadminlink = " \[DA\]" - - output += "" - output += "" - output += "" - output += "" - output += "" - output += "" - - output += {" -
CKEY \[+\]RANKPERMISSIONSVERB-OVERRIDES
[adm_ckey] [deadminlink]\[-\][D.rank.name][rights][rights2text(0," ",D.rank.adds,D.rank.subs)]
-
Search:
- -"} - - usr << browse(jointext(output, ""),"window=editrights;size=900x650") - -/datum/admins/proc/log_admin_rank_modification(adm_ckey, new_rank) - if(CONFIG_GET(flag/admin_legacy_system)) - return - - if(!usr.client) - return - - if (!check_rights(R_PERMISSIONS)) - return - - if(!SSdbcore.Connect()) - to_chat(usr, "Failed to establish database connection.") - return - - if(!adm_ckey || !new_rank) - return - - adm_ckey = ckey(adm_ckey) - - if(!adm_ckey) - return - - if(!istext(adm_ckey) || !istext(new_rank)) - return - - var/datum/DBQuery/query_get_admin = SSdbcore.NewQuery("SELECT id FROM [format_table_name("admin")] WHERE ckey = '[adm_ckey]'") - if(!query_get_admin.warn_execute()) - return - - var/new_admin = 1 - var/admin_id - while(query_get_admin.NextRow()) - new_admin = 0 - admin_id = text2num(query_get_admin.item[1]) - - if(new_admin) - var/datum/DBQuery/query_add_admin = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin")]` (`id`, `ckey`, `rank`, `level`, `flags`) VALUES (null, '[adm_ckey]', '[new_rank]', -1, 0)") - if(!query_add_admin.warn_execute()) - return - var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[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]');") - if(!query_add_admin_log.warn_execute()) - return - to_chat(usr, "New admin added.") - else - if(!isnull(admin_id) && isnum(admin_id)) - var/datum/DBQuery/query_change_admin = SSdbcore.NewQuery("UPDATE `[format_table_name("admin")]` SET rank = '[new_rank]' WHERE id = [admin_id]") - if(!query_change_admin.warn_execute()) - return - var/datum/DBQuery/query_change_admin_log = SSdbcore.NewQuery("INSERT INTO `[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]');") - if(!query_change_admin_log.warn_execute()) - return - to_chat(usr, "Admin rank changed.") - - -/datum/admins/proc/log_admin_permission_modification(adm_ckey, new_permission) - if(CONFIG_GET(flag/admin_legacy_system)) - return - if(!usr.client) - return - if(check_rights(R_PERMISSIONS)) - return - - if(!SSdbcore.Connect()) - to_chat(usr, "Failed to establish database connection.") - return - - if(!adm_ckey || !istext(adm_ckey) || !isnum(new_permission)) - return - - var/datum/DBQuery/query_get_perms = SSdbcore.NewQuery("SELECT id, flags FROM [format_table_name("admin")] WHERE ckey = '[adm_ckey]'") - if(!query_get_perms.warn_execute()) - return - - var/admin_id - while(query_get_perms.NextRow()) - admin_id = text2num(query_get_perms.item[1]) - - if(!admin_id) - return - - var/datum/DBQuery/query_change_perms = SSdbcore.NewQuery("UPDATE `[format_table_name("admin")]` SET flags = [new_permission] WHERE id = [admin_id]") - if(!query_change_perms.warn_execute()) - return - var/datum/DBQuery/query_change_perms_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edit permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');") - query_change_perms_log.warn_execute() diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index a758d295e2..77038ee572 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -31,6 +31,7 @@ Reset Thunderdome to default state
Rename Station Name
Reset Station Name
+ Set Night Shift Mode

Shuttles

@@ -54,7 +55,7 @@ Power all SMES
Triple AI mode (needs to be used in the lobby)
Everyone is the traitor
- AK-47s For Everyone!
+ AK-47s For Everyone!
Summon Guns
Summon Magic
Summon Events (Toggle)
@@ -109,6 +110,7 @@ if("mentor_log") CitadelMentorLogSecret() + if("list_job_debug") var/dat = "Job Debug info.
" for(var/line in SSjob.job_debug) @@ -167,6 +169,23 @@ log_admin("[key_name(usr)] renamed the station to \"[new_name]\".") message_admins("[key_name_admin(usr)] renamed the station to: [new_name].") priority_announce("[command_name()] has renamed the station to \"[new_name]\".") + if("night_shift_set") + if(!check_rights(R_ADMIN)) + return + var/val = alert(usr, "What do you want to set night shift to? This will override the automatic system until set to automatic again.", "On", "Off", "Automatic") + switch(val) + if("Automatic") + if(CONFIG_GET(flag/enable_night_shifts)) + SSnightshift.can_fire = TRUE + SSnightshift.fire() + else + SSnightshift.update_nightshift(FALSE, TRUE) + if("On") + SSnightshift.can_fire = FALSE + SSnightshift.update_nightshift(TRUE, TRUE) + if("Off") + SSnightshift.can_fire = FALSE + SSnightshift.update_nightshift(FALSE, TRUE) if("reset_name") if(!check_rights(R_ADMIN)) @@ -466,7 +485,7 @@ message_admins("[key_name_admin(usr)] activated AK-47s for Everyone!") usr.client.ak47s() sound_to_playing_players('sound/misc/ak47s.ogg') - + if("guns") if(!check_rights(R_FUN)) return @@ -613,13 +632,13 @@ var/list/new_movement = list() for(var/i in 1 to movement_keys.len) var/key = movement_keys[i] - + var/msg = "Please input the new movement direction when the user presses [key]. Ex. northeast" var/title = "New direction for [key]" var/new_direction = text2dir(input(usr, msg, title) as text|null) if(!new_direction) new_direction = movement_keys[key] - + new_movement[key] = new_direction SSinput.movement_keys = new_movement message_admins("[key_name_admin(usr)] has configured all movement directions.") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1e66e085a5..850aca5c93 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -22,8 +22,8 @@ if(!CheckAdminHref(href, href_list)) return - citaTopic(href, href_list) // Citadel - + citaTopic(href, href_list) //CITADEL EDIT, MENTORS + if(href_list["ahelp"]) if(!check_rights(R_ADMIN, TRUE)) return @@ -874,12 +874,6 @@ else dat += "Abductor" - //Borer - if(jobban_isbanned(M, "borer") || isbanned_dept) - dat += "Borer" - else - dat += "Borer" - //Alien if(jobban_isbanned(M, ROLE_ALIEN) || isbanned_dept) dat += "Alien" @@ -1667,7 +1661,7 @@ var/mob/living/L = M var/status switch (M.stat) - if (CONSCIOUS) + if(CONSCIOUS) status = "Alive" if(SOFT_CRIT) status = "Dying" @@ -1707,6 +1701,25 @@ src.manage_free_slots() + + else if(href_list["customjobslot"]) + if(!check_rights(R_ADMIN)) + return + + var/Add = href_list["customjobslot"] + + for(var/datum/job/job in SSjob.occupations) + if(job.title == Add) + var/newtime = null + newtime = input(usr, "How many jebs do you want?", "Add wanted posters", "[newtime]") as num|null + if(!newtime) + to_chat(src.owner, "Setting to amount of positions filled for the job") + job.total_positions = job.current_positions + break + job.total_positions = newtime + + src.manage_free_slots() + else if(href_list["removejobslot"]) if(!check_rights(R_ADMIN)) return @@ -1904,7 +1917,7 @@ D.traitor_panel() else show_traitor_panel(M) - + else if(href_list["initmind"]) if(!check_rights(R_ADMIN)) return @@ -1913,7 +1926,7 @@ to_chat(usr, "This can only be used on instances on mindless mobs") return M.mind_initialize() - + else if(href_list["create_object"]) if(!check_rights(R_SPAWN)) return @@ -2413,6 +2426,15 @@ usr << browse(dat.Join("
"), "window=related_[C];size=420x300") + else if(href_list["modantagrep"]) + if(!check_rights(R_ADMIN)) + return + + var/mob/M = locate(href_list["mob"]) in GLOB.mob_list + var/client/C = M.client + usr.client.cmd_admin_mod_antag_rep(C, href_list["modantagrep"]) + show_player_panel(M) + /datum/admins/proc/HandleCMode() if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 7c610f41d8..a19ab3c100 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -235,42 +235,42 @@ if(ispath(type, /mob)) for(var/mob/d in location) - if(typecache[d.type]) + if(typecache[d.type] && d.can_vv_get()) out += d CHECK_TICK else if(ispath(type, /turf)) for(var/turf/d in location) - if(typecache[d.type]) + if(typecache[d.type] && d.can_vv_get()) out += d CHECK_TICK else if(ispath(type, /obj)) for(var/obj/d in location) - if(typecache[d.type]) + if(typecache[d.type] && d.can_vv_get()) out += d CHECK_TICK else if(ispath(type, /area)) for(var/area/d in location) - if(typecache[d.type]) + if(typecache[d.type] && d.can_vv_get()) out += d CHECK_TICK else if(ispath(type, /atom)) for(var/atom/d in location) - if(typecache[d.type]) + if(typecache[d.type] && d.can_vv_get()) out += d CHECK_TICK else if(ispath(type, /datum)) if(location == world) //snowflake for byond shortcut for(var/datum/d) //stupid byond trick to have it not return atoms to make this less laggy - if(typecache[d.type]) + if(typecache[d.type] && d.can_vv_get()) out += d CHECK_TICK else for(var/datum/d in location) - if(typecache[d.type]) + if(typecache[d.type] && d.can_vv_get()) out += d CHECK_TICK diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 0246431e89..072c31b152 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -271,157 +271,177 @@ // DEATH SQUADS /datum/admins/proc/makeDeathsquad() - return makeEmergencyresponseteam(ERT_DEATHSQUAD) - -/datum/admins/proc/makeOfficial() - var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.") - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered to be a CentCom Official?", "deathsquad") - - if(candidates.len) - var/mob/dead/observer/chosen_candidate = pick(candidates) - - //Create the official - var/mob/living/carbon/human/newmob = new (pick(GLOB.emergencyresponseteamspawn)) - chosen_candidate.client.prefs.copy_to(newmob) - newmob.real_name = newmob.dna.species.random_name(newmob.gender,1) - newmob.dna.update_dna_identity() - newmob.key = chosen_candidate.key - - - //Job - newmob.mind.assigned_role = "CentCom Official" - newmob.mind.special_role = "official" - - //Mission - var/datum/objective/missionobj = new - missionobj.owner = newmob.mind - missionobj.explanation_text = mission - missionobj.completed = 1 - - var/datum/antagonist/official/O = new - O.mission = missionobj - - newmob.mind.add_antag_datum(O) - - //Logging and cleanup - message_admins("CentCom Official [key_name_admin(newmob)] has spawned with the task: [mission]") - log_game("[key_name(newmob)] has been selected as a CentCom Official") - - return 1 - - return 0 + return makeEmergencyresponseteam(/datum/ert/deathsquad) // CENTCOM RESPONSE TEAM -/datum/admins/proc/makeEmergencyresponseteam(alert_type) - var/alert - if(!alert_type) - alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: CentCom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad") - if(!alert) - return - else - alert = alert_type - - var/teamsize = 0 - var/deathsquad = FALSE - switch(alert) - if("Delta: Deathsquad") - alert = ERT_DEATHSQUAD - teamsize = 5 - deathsquad = TRUE - if("Red: Elite ERT (Armoury Access + Pulse Weapons)") - alert = ERT_RED - if("Amber: Full ERT (Armoury Access)") - alert = ERT_AMBER - if("Blue: Light ERT (No Armoury Access)") - alert = ERT_BLUE - if("Green: CentCom Official") - return makeOfficial() - else - return - - if(!teamsize) - var/teamcheck = input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num - if(isnull(teamcheck)) - return - teamsize = min(7,teamcheck) - - - var/default_mission = deathsquad ? "Leave no witnesses." : "Assist the station." - var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", default_mission) as null|text - if(!mission) +/datum/admins/proc/makeERTTemplateModified(list/settings) + . = settings + var/datum/ert/newtemplate = settings["mainsettings"]["template"]["value"] + if (isnull(newtemplate)) return - - var/prompt_name = deathsquad ? "an elite Nanotrasen Strike Team" : "a Code [alert] Nanotrasen Emergency Response Team" - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [prompt_name] ?", "deathsquad", null) - var/teamSpawned = 0 + if (!ispath(newtemplate)) + newtemplate = text2path(newtemplate) + newtemplate = new newtemplate + .["mainsettings"]["teamsize"]["value"] = newtemplate.teamsize + .["mainsettings"]["mission"]["value"] = newtemplate.mission + .["mainsettings"]["polldesc"]["value"] = newtemplate.polldesc - if(candidates.len > 0) - //Pick the (un)lucky players - var/numagents = min(teamsize,candidates.len) //How many officers to spawn - //Create team - var/datum/team/ert/ert_team = new - if(deathsquad) - ert_team.name = "Death Squad" - - //Asign team objective - var/datum/objective/missionobj = new - missionobj.team = ert_team - missionobj.explanation_text = mission - missionobj.completed = 1 - ert_team.objectives += missionobj - ert_team.mission = missionobj +/datum/admins/proc/equipAntagOnDummy(mob/living/carbon/human/dummy/mannequin, datum/antagonist/antag) + for(var/I in mannequin.get_equipped_items()) + qdel(I) + if (ispath(antag, /datum/antagonist/ert)) + var/datum/antagonist/ert/ert = antag + mannequin.equipOutfit(initial(ert.outfit), TRUE) + else if (ispath(antag, /datum/antagonist/official)) + mannequin.equipOutfit(/datum/outfit/centcom_official, TRUE) - //We give these out in order, then back from the start if there's more than 3 - var/list/role_order = list(ERT_SEC,ERT_MED,ERT_ENG) +/datum/admins/proc/makeERTPreviewIcon(list/settings) + // Set up the dummy for its photoshoot + var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_ADMIN) - var/list/spawnpoints = GLOB.emergencyresponseteamspawn - while(numagents && candidates.len) - if (numagents > spawnpoints.len) + var/prefs = settings["mainsettings"] + var/datum/ert/template = prefs["template"]["value"] + if (isnull(template)) + return null + if (!ispath(template)) + template = text2path(prefs["template"]["value"]) // new text2path ... doesn't compile in 511 + + template = new template + var/datum/antagonist/ert/ert = template.leader_role + + equipAntagOnDummy(mannequin, ert) + + COMPILE_OVERLAYS(mannequin) + CHECK_TICK + var/icon/preview_icon = icon('icons/effects/effects.dmi', "nothing") + preview_icon.Scale(48+32, 16+32) + CHECK_TICK + mannequin.setDir(NORTH) + var/icon/stamp = getFlatIcon(mannequin) + CHECK_TICK + preview_icon.Blend(stamp, ICON_OVERLAY, 25, 17) + CHECK_TICK + mannequin.setDir(WEST) + stamp = getFlatIcon(mannequin) + CHECK_TICK + preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9) + CHECK_TICK + mannequin.setDir(SOUTH) + stamp = getFlatIcon(mannequin) + CHECK_TICK + preview_icon.Blend(stamp, ICON_OVERLAY, 49, 1) + CHECK_TICK + preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser. + CHECK_TICK + unset_busy_human_dummy(DUMMY_HUMAN_SLOT_ADMIN) + return preview_icon + +/datum/admins/proc/makeEmergencyresponseteam(var/datum/ert/ertemplate = null) + if (ertemplate) + ertemplate = new ertemplate + else + ertemplate = new /datum/ert/centcom_official + + var/list/settings = list( + "preview_callback" = CALLBACK(src, .proc/makeERTPreviewIcon), + "mainsettings" = list( + "template" = list("desc" = "Template", "callback" = CALLBACK(src, .proc/makeERTTemplateModified), "type" = "datum", "path" = "/datum/ert", "subtypesonly" = TRUE, "value" = ertemplate.type), + "teamsize" = list("desc" = "Team Size", "type" = "number", "value" = ertemplate.teamsize), + "mission" = list("desc" = "Mission", "type" = "string", "value" = ertemplate.mission), + "polldesc" = list("desc" = "Ghost poll description", "string" = "text", "value" = ertemplate.polldesc), + "enforce_human" = list("desc" = "Enforce human authority", "type" = "boolean", "value" = "[(CONFIG_GET(flag/enforce_human_authority) ? "Yes" : "No")]"), + ) + ) + + var/list/prefreturn = presentpreflikepicker(usr,"Customize ERT", "Customize ERT", Button1="Ok", width = 600, StealFocus = 1,Timeout = 0, settings=settings) + + if (isnull(prefreturn)) + return FALSE + + if (prefreturn["button"] == 1) + var/list/prefs = settings["mainsettings"] + + var/templtype = prefs["template"]["value"] + if (!ispath(prefs["template"]["value"])) + templtype = text2path(prefs["template"]["value"]) // new text2path ... doesn't compile in 511 + + if (ertemplate.type != templtype) + ertemplate = new templtype + + ertemplate.teamsize = prefs["teamsize"]["value"] + ertemplate.mission = prefs["mission"]["value"] + ertemplate.polldesc = prefs["polldesc"]["value"] + ertemplate.enforce_human = prefs["enforce_human"]["value"] == "Yes" ? TRUE : FALSE + + var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null) + var/teamSpawned = FALSE + + if(candidates.len > 0) + //Pick the (un)lucky players + var/numagents = min(ertemplate.teamsize,candidates.len) + + //Create team + var/datum/team/ert/ert_team = new ertemplate.team + if(ertemplate.rename_team) + ert_team.name = ertemplate.rename_team + + //Asign team objective + var/datum/objective/missionobj = new + missionobj.team = ert_team + missionobj.explanation_text = ertemplate.mission + missionobj.completed = TRUE + ert_team.objectives += missionobj + ert_team.mission = missionobj + + var/list/spawnpoints = GLOB.emergencyresponseteamspawn + while(numagents && candidates.len) + if (numagents > spawnpoints.len) + numagents-- + continue // This guy's unlucky, not enough spawn points, we skip him. + var/spawnloc = spawnpoints[numagents] + var/mob/dead/observer/chosen_candidate = pick(candidates) + candidates -= chosen_candidate + if(!chosen_candidate.key) + continue + + //Spawn the body + var/mob/living/carbon/human/ERTOperative = new ertemplate.mobtype(spawnloc) + chosen_candidate.client.prefs.copy_to(ERTOperative) + ERTOperative.key = chosen_candidate.key + + if(ertemplate.enforce_human || ERTOperative.dna.species.dangerous_existence) // Don't want any exploding plasmemes + ERTOperative.set_species(/datum/species/human) + + //Give antag datum + var/datum/antagonist/ert/ert_antag + + if(numagents == 1) + ert_antag = new ertemplate.leader_role + else + ert_antag = ertemplate.roles[WRAP(numagents,1,length(ertemplate.roles) + 1)] + ert_antag = new ert_antag + + ERTOperative.mind.add_antag_datum(ert_antag,ert_team) + ERTOperative.mind.assigned_role = ert_antag.name + + //Logging and cleanup + log_game("[key_name(ERTOperative)] has been selected as an [ert_antag.name]") numagents-- - continue // This guy's unlucky, not enough spawn points, we skip him. - var/spawnloc = spawnpoints[numagents] - var/mob/dead/observer/chosen_candidate = pick(candidates) - candidates -= chosen_candidate - if(!chosen_candidate.key) - continue + teamSpawned++ - //Spawn the body - var/mob/living/carbon/human/ERTOperative = new(spawnloc) - chosen_candidate.client.prefs.copy_to(ERTOperative) - ERTOperative.key = chosen_candidate.key - - if(CONFIG_GET(flag/enforce_human_authority)) - ERTOperative.set_species(/datum/species/human) + if (teamSpawned) + message_admins("[ertemplate.polldesc] has spawned with the mission: [ertemplate.mission]") - //Give antag datum - var/datum/antagonist/ert/ert_antag = new - ert_antag.high_alert = alert == ERT_RED - if(numagents == 1) - ert_antag.role = deathsquad ? DEATHSQUAD_LEADER : ERT_LEADER - else - ert_antag.role = deathsquad ? DEATHSQUAD : role_order[WRAP(numagents,1,role_order.len + 1)] - ERTOperative.mind.add_antag_datum(ert_antag,ert_team) - - ERTOperative.mind.assigned_role = ert_antag.name - - //Logging and cleanup - log_game("[key_name(ERTOperative)] has been selected as an [ert_antag.name]") - numagents-- - teamSpawned++ - - if (teamSpawned) - message_admins("[prompt_name] has spawned with the mission: [mission]") - //Open the Armory doors - if(alert != ERT_BLUE) + if(ertemplate.opendoors) for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks) - spawn(0) - door.open() - return 1 + door.open() + CHECK_TICK + return TRUE else - return 0 + return FALSE return diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 33fb3867d1..2f5cc59ec1 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -24,7 +24,7 @@ admin_sound.status = SOUND_STREAM admin_sound.volume = vol - var/res = alert(usr, "Show the title of this song to the players?",, "No", "Yes", "Cancel") + var/res = alert(usr, "Show the title of this song to the players?",, "Yes","No", "Cancel") switch(res) if("Yes") to_chat(world, "An admin played: [S]") @@ -70,12 +70,12 @@ var/web_sound_input = input("Enter content URL (supported sites only, leave blank to stop playing)", "Play Internet Sound via youtube-dl") as text|null if(istext(web_sound_input)) var/web_sound_url = "" + var/stop_web_sounds = FALSE var/pitch if(length(web_sound_input)) web_sound_input = trim(web_sound_input) - var/static/regex/html_protocol_regex = regex("https?://") - if(findtext(web_sound_input, ":") && !findtext(web_sound_input, html_protocol_regex)) + if(findtext(web_sound_input, ":") && !findtext(web_sound_input, GLOB.is_http_protocol)) to_chat(src, "Non-http(s) URIs are not allowed.") to_chat(src, "For youtube-dl shortcuts like ytsearch: please use the appropriate full url from the website.") return @@ -121,14 +121,22 @@ else //pressed ok with blank log_admin("[key_name(src)] stopped web sound") message_admins("[key_name(src)] stopped web sound") - web_sound_url = " " + web_sound_url = null + stop_web_sounds = TRUE - if(web_sound_url) + if(web_sound_url && !findtext(web_sound_url, GLOB.is_http_protocol)) + to_chat(src, "BLOCKED: Content URL not using http(s) protocol") + to_chat(src, "The media provider returned a content URL that isn't using the HTTP or HTTPS protocol") + return + if(web_sound_url || stop_web_sounds) for(var/m in GLOB.player_list) var/mob/M = m var/client/C = M.client if((C.prefs.toggles & SOUND_MIDI) && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded) - C.chatOutput.sendMusic(web_sound_url, pitch) + if(!stop_web_sounds) + C.chatOutput.sendMusic(web_sound_url, pitch) + else + C.chatOutput.stopMusic() SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Internet Sound") @@ -157,5 +165,5 @@ SEND_SOUND(M, sound(null)) var/client/C = M.client if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded) - C.chatOutput.sendMusic(" ") + C.chatOutput.stopMusic() SSblackbox.record_feedback("tally", "admin_verb", 1, "Stop All Playing Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 9f5af20b67..aaed0f2294 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -32,6 +32,12 @@ font_color = "red" prayer_type = "CULTIST PRAYER" deity = "Nar-Sie" + else if(isliving(usr)) + var/mob/living/L = usr + if(L.has_trait(TRAIT_SPIRITUAL)) + cross.icon_state = "holylight" + font_color = "blue" + prayer_type = "SPIRITUAL PRAYER" msg = "[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index bbe7c97bbf..5c87293b73 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1,8 +1,7 @@ /client/proc/cmd_admin_drop_everything(mob/M in GLOB.mob_list) set category = null set name = "Drop Everything" - if(!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return var/confirm = alert(src, "Make [M] drop everything?", "Message", "Yes", "No") @@ -26,12 +25,11 @@ if(!ismob(M)) return - if (!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return message_admins("[key_name_admin(src)] has started answering [key_name(M.key, 0, 0)]'s prayer.") - var/msg = input("Message:", text("Subtle PM to [M.key]")) as text + var/msg = input("Message:", text("Subtle PM to [M.key]")) as text|null if (!msg) message_admins("[key_name_admin(src)] decided not to answer [key_name(M.key, 0, 0)]'s prayer") @@ -47,15 +45,60 @@ admin_ticket_log(M, msg) SSblackbox.record_feedback("tally", "admin_verb", 1, "Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/cmd_admin_mod_antag_rep(client/C in GLOB.clients, var/operation) + set category = "Special Verbs" + set name = "Modify Antagonist Reputation" + + if(!check_rights(R_ADMIN)) + return + + var/msg = "" + var/log_text = "" + + if(operation == "zero") + log_text = "Set to 0" + SSpersistence.antag_rep -= C.ckey + else + var/prompt = "Please enter the amount of reputation to [operation]:" + + if(operation == "set") + prompt = "Please enter the new reputation value:" + + msg = input("Message:", prompt) as num|null + + if (!msg) + return + + var/ANTAG_REP_MAXIMUM = CONFIG_GET(number/antag_rep_maximum) + + if(operation == "set") + log_text = "Set to [num2text(msg)]" + SSpersistence.antag_rep[C.ckey] = max(0, min(msg, ANTAG_REP_MAXIMUM)) + else if(operation == "add") + log_text = "Added [num2text(msg)]" + SSpersistence.antag_rep[C.ckey] = min(SSpersistence.antag_rep[C.ckey]+msg, ANTAG_REP_MAXIMUM) + else if(operation == "subtract") + log_text = "Subtracted [num2text(msg)]" + SSpersistence.antag_rep[C.ckey] = max(SSpersistence.antag_rep[C.ckey]-msg, 0) + else + to_chat(src, "Invalid operation for antag rep modification: [operation] by user [key_name(usr)]") + return + + if(SSpersistence.antag_rep[C.ckey] <= 0) + SSpersistence.antag_rep -= C.ckey + + log_admin("[key_name(usr)]: Modified [key_name(C)]'s antagonist reputation [log_text]") + message_admins("[key_name_admin(usr)]: Modified [key_name(C)]'s antagonist reputation ([log_text])") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Modify Antagonist Reputation") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/proc/cmd_admin_world_narrate() set category = "Special Verbs" set name = "Global Narrate" - if (!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return - var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text + var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text|null if (!msg) return @@ -68,8 +111,7 @@ set category = "Special Verbs" set name = "Direct Narrate" - if(!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return if(!M) @@ -78,7 +120,7 @@ if(!M) return - var/msg = input("Message:", text("Enter the text you wish to appear to your target:")) as text + var/msg = input("Message:", text("Enter the text you wish to appear to your target:")) as text|null if( !msg ) return @@ -94,15 +136,14 @@ set category = "Special Verbs" set name = "Local Narrate" - if (!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return if(!A) return - var/range = input("Range:", "Narrate to mobs within how many tiles:", 7) as num + var/range = input("Range:", "Narrate to mobs within how many tiles:", 7) as num|null if(!range) return - var/msg = input("Message:", text("Enter the text you wish to appear to everyone within view:")) as text + var/msg = input("Message:", text("Enter the text you wish to appear to everyone within view:")) as text|null if (!msg) return for(var/mob/M in view(range,A)) @@ -115,9 +156,9 @@ /client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) set category = "Special Verbs" set name = "Godmode" - if(!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return + M.status_flags ^= GODMODE to_chat(usr, "Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]") @@ -261,9 +302,9 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Respawn Character" set desc = "Respawn a person that has been gibbed/dusted/killed. They must be a ghost for this to work and preferably should not have a body to go back into." - if(!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return + var/input = ckey(input(src, "Please specify which key will be respawned.", "Key", "")) if(!input) return @@ -428,9 +469,10 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_add_freeform_ai_law() set category = "Fun" set name = "Add Custom AI law" - if(!holder) - to_chat(src, "Only administrators may use this command.") + + if(!check_rights(R_ADMIN)) return + var/input = input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null if(!input) return @@ -450,9 +492,10 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_rejuvenate(mob/living/M in GLOB.mob_list) set category = "Special Verbs" set name = "Rejuvenate" - if(!holder) - to_chat(src, "Only administrators may use this command.") + + if(!check_rights(R_ADMIN)) return + if(!mob) return if(!istype(M)) @@ -469,9 +512,10 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_create_centcom_report() set category = "Special Verbs" set name = "Create Command Report" - if(!holder) - to_chat(src, "Only administrators may use this command.") + + if(!check_rights(R_ADMIN)) return + var/input = input(usr, "Enter a Command Report. Ensure it makes sense IC.", "What?", "") as message|null if(!input) return @@ -494,9 +538,10 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_change_command_name() set category = "Special Verbs" set name = "Change Command Name" - if(!holder) - to_chat(src, "Only administrators may use this command.") + + if(!check_rights(R_ADMIN)) return + var/input = input(usr, "Please input a new name for Central Command.", "What?", "") as text|null if(!input) return @@ -508,8 +553,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Admin" set name = "Delete" - if (!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return admin_delete(A) @@ -531,8 +575,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Admin" set name = "Manage Job Slots" - if (!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return holder.manage_free_slots() SSblackbox.record_feedback("tally", "admin_verb", 1, "Manage Job Slots") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -541,8 +584,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Explosion" - if (!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return var/devastation = input("Range of total devastation. -1 to none", text("Input")) as num|null @@ -578,8 +620,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "EM Pulse" - if (!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return var/heavy = input("Range of heavy pulse.", text("Input")) as num|null @@ -604,8 +645,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Gib" - if (!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return var/confirm = alert(src, "Drop a brain?", "Confirm", "Yes", "No","Cancel") @@ -670,8 +710,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(EMERGENCY_AT_LEAST_DOCKED) return - if (!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") @@ -755,8 +794,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set name = "Set Security Level" set desc = "Changes the security level. Announcement only, i.e. setting to Delta won't activate nuke" - if (!holder) - to_chat(src, "Only administrators may use this command.") + if(!check_rights(R_ADMIN)) return var/level = input("Select security level to change to","Set Security Level") as null|anything in list("green","blue","red","delta") @@ -775,7 +813,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return if(!N.timing) - var/newtime = input(usr, "Set activation timer.", "Activate Nuke", "[N.timer_set]") as num + var/newtime = input(usr, "Set activation timer.", "Activate Nuke", "[N.timer_set]") as num|null if(!newtime) return N.timer_set = newtime @@ -968,7 +1006,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits set name = "Toggle AntagHUD" set desc = "Toggles the Admin AntagHUD" - if(!holder) + if(!check_rights(R_ADMIN)) return var/adding_hud = !has_antag_hud() @@ -982,6 +1020,35 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits log_admin("[key_name(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Antag HUD", "[adding_hud ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/toggle_combo_hud() + set category = "Admin" + set name = "Toggle Combo HUD" + set desc = "Toggles the Admin Combo HUD (antag, sci, med, eng)" + + if(!check_rights(R_ADMIN)) + return + + var/adding_hud = !has_antag_hud() + + for(var/hudtype in list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED)) // add data huds + var/datum/atom_hud/H = GLOB.huds[hudtype] + (adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr) + for(var/datum/atom_hud/antag/H in GLOB.huds) // add antag huds + (adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr) + + if (adding_hud) + mob.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + else + mob.lighting_alpha = initial(mob.lighting_alpha) + + mob.update_sight() + + to_chat(usr, "You toggled your admin combo HUD [adding_hud ? "ON" : "OFF"].") + message_admins("[key_name_admin(usr)] toggled their admin combo HUD [adding_hud ? "ON" : "OFF"].") + log_admin("[key_name(usr)] toggled their admin combo HUD [adding_hud ? "ON" : "OFF"].") + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Combo HUD", "[adding_hud ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + /client/proc/has_antag_hud() var/datum/atom_hud/A = GLOB.huds[ANTAG_HUD_TRAITOR] return A.hudusers[mob] @@ -1000,7 +1067,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits set desc = "Infects all humans with a latent organ that will zombify \ them on death." - if(!holder) + if(!check_rights(R_ADMIN)) return var/confirm = alert(src, "Please confirm you want to add latent zombie organs in all humans?", "Confirm Zombies", "Yes", "No") @@ -1018,7 +1085,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits set category = "Fun" set name = "Mass Zombie Cure" set desc = "Removes the zombie infection from all humans, returning them to normal." - if(!holder) + if(!check_rights(R_ADMIN)) return var/confirm = alert(src, "Please confirm you want to cure all zombies?", "Confirm Zombie Cure", "Yes", "No") @@ -1037,7 +1104,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits set name = "Polymorph All" set desc = "Applies the effects of the bolt of change to every single mob." - if(!holder) + if(!check_rights(R_ADMIN)) return var/confirm = alert(src, "Please confirm you want polymorph all mobs?", "Confirm Polymorph", "Yes", "No") @@ -1071,7 +1138,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits set desc = "Sends a tip (that you specify) to all players. After all \ you're the experienced player here." - if(!holder) + if(!check_rights(R_ADMIN)) return var/input = input(usr, "Please specify your tip that you want to send to the players.", "Tip", "") as message|null @@ -1204,7 +1271,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits /client/proc/smite(mob/living/carbon/human/target as mob) set name = "Smite" set category = "Fun" - if(!holder) + if(!check_rights(R_ADMIN)) return var/list/punishment_list = list(ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_ROD) @@ -1243,7 +1310,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits /client/proc/trigger_centcom_recall() - if(!holder) + if(!check_rights(R_ADMIN)) return var/message = pick(GLOB.admiral_messages) message = input("Enter message from the on-call admiral to be put in the recall report.", "Admiral Message", message) as text|null diff --git a/code/modules/admin/verbs/spawnobjasmob.dm b/code/modules/admin/verbs/spawnobjasmob.dm new file mode 100644 index 0000000000..f51f776d6f --- /dev/null +++ b/code/modules/admin/verbs/spawnobjasmob.dm @@ -0,0 +1,70 @@ +/datum/admins/proc/spawn_objasmob(object as text) + set category = "Debug" + set desc = "(obj path) Spawn object-mob" + set name = "Spawn object-mob" + + if(!check_rights(R_SPAWN)) + return + + var/chosen = pick_closest_path(object, make_types_fancy(subtypesof(/obj))) + + if (!chosen) + return + + var/mob/living/simple_animal/hostile/mimic/copy/basemob = /mob/living/simple_animal/hostile/mimic/copy + + var/obj/chosen_obj = text2path(chosen) + + var/list/settings = list( + "mainsettings" = list( + "name" = list("desc" = "Name", "type" = "string", "value" = "Bob"), + "maxhealth" = list("desc" = "Max. health", "type" = "number", "value" = 100), + "access" = list("desc" = "Access ID", "type" = "datum", "path" = "/obj/item/card/id", "value" = "Default"), + "objtype" = list("desc" = "Base obj type", "type" = "datum", "path" = "/obj", "value" = "[chosen]"), + "googlyeyes" = list("desc" = "Googly eyes", "type" = "boolean", "value" = "No"), + "disableai" = list("desc" = "Disable AI", "type" = "boolean", "value" = "Yes"), + "idledamage" = list("desc" = "Damaged while idle", "type" = "boolean", "value" = "No"), + "dropitem" = list("desc" = "Drop obj on death", "type" = "boolean", "value" = "Yes"), + "mobtype" = list("desc" = "Base mob type", "type" = "datum", "path" = "/mob/living/simple_animal/hostile/mimic/copy", "value" = "/mob/living/simple_animal/hostile/mimic/copy"), + "ckey" = list("desc" = "ckey", "type" = "ckey", "value" = "none"), + ) + ) + + var/list/prefreturn = presentpreflikepicker(usr,"Customize mob", "Customize mob", Button1="Ok", width = 450, StealFocus = 1,Timeout = 0, settings=settings) + if (prefreturn["button"] == 1) + settings = prefreturn["settings"] + var/mainsettings = settings["mainsettings"] + chosen_obj = text2path(mainsettings["objtype"]["value"]) + + basemob = text2path(mainsettings["mobtype"]["value"]) + if (!ispath(basemob, /mob/living/simple_animal/hostile/mimic/copy) || !ispath(chosen_obj, /obj)) + to_chat(usr, "Mob or object path invalid") + + basemob = new basemob(get_turf(usr), new chosen_obj(get_turf(usr)), usr, mainsettings["dropitem"]["value"] == "Yes" ? FALSE : TRUE, (mainsettings["googlyeyes"]["value"] == "Yes" ? FALSE : TRUE)) + + if (mainsettings["disableai"]["value"] == "Yes") + basemob.toggle_ai(AI_OFF) + + if (mainsettings["idledamage"]["value"] == "No") + basemob.idledamage = FALSE + + if (mainsettings["access"]) + var/newaccess = text2path(mainsettings["access"]["value"]) + if (ispath(newaccess)) + basemob.access_card = new newaccess + + if (mainsettings["maxhealth"]["value"]) + if (!isnum(mainsettings["maxhealth"]["value"])) + mainsettings["maxhealth"]["value"] = text2num(mainsettings["maxhealth"]["value"]) + if (mainsettings["maxhealth"]["value"] > 0) + basemob.maxHealth = basemob.maxHealth = mainsettings["maxhealth"]["value"] + + if (mainsettings["name"]["value"]) + basemob.name = basemob.real_name = html_decode(mainsettings["name"]["value"]) + + if (mainsettings["ckey"]["value"] != "none") + basemob.ckey = mainsettings["ckey"]["value"] + + + log_admin("[key_name(usr)] spawned a sentient object-mob [basemob] from [chosen_obj] at ([usr.x],[usr.y],[usr.z])") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn object-mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index f9582bdce8..8b603d109a 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -13,7 +13,8 @@ GLOBAL_LIST_EMPTY(antagonists) var/replace_banned = TRUE //Should replace jobbaned player with ghosts if granted. var/list/objectives = list() var/antag_memory = ""//These will be removed with antag datum - + var/antag_moodlet //typepath of moodlet that the mob will gain with their status + //Antag panel properties var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED @@ -67,6 +68,7 @@ GLOBAL_LIST_EMPTY(antagonists) if(!silent) greet() apply_innate_effects() + give_antag_moodies() if(is_banned(owner.current) && replace_banned) replace_banned_player() @@ -88,6 +90,7 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/on_removal() remove_innate_effects() + clear_antag_moodies() if(owner) LAZYREMOVE(owner.antag_datums, src) if(!silent && owner.current) @@ -103,6 +106,20 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/farewell() return +/datum/antagonist/proc/give_antag_moodies() + if(!antag_moodlet) + return + GET_COMPONENT_FROM(mood, /datum/component/mood, owner.current) + if(mood) + mood.add_event("antag_moodlet", antag_moodlet) + +/datum/antagonist/proc/clear_antag_moodies() + if(!antag_moodlet) + return + GET_COMPONENT_FROM(mood, /datum/component/mood, owner.current) + if(mood) + mood.add_event("antag_moodlet") + //Returns the team antagonist belongs to if any. /datum/antagonist/proc/get_team() return @@ -183,7 +200,7 @@ GLOBAL_LIST_EMPTY(antagonists) edit_memory(usr) owner.traitor_panel() return - + //Some commands might delete/modify this datum clearing or changing owner var/datum/mind/persistent_owner = owner @@ -231,4 +248,4 @@ GLOBAL_LIST_EMPTY(antagonists) name = custom_name else return - ..() \ No newline at end of file + ..() diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index faa6b6c1e3..3db66dee57 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -194,15 +194,12 @@ to_chat(owner, "You feel sick.") var/datum/disease/advance/A = random_virus(pick(2,6),6) A.carrier = TRUE - owner.viruses += A - A.affected_mob = owner - owner.med_hud_set_status() + owner.ForceContractDisease(A, FALSE, TRUE) /obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level) - if(max_symptoms > SYMPTOM_LIMIT) - max_symptoms = SYMPTOM_LIMIT - var/datum/disease/advance/A = new(FALSE, null) - A.symptoms = list() + if(max_symptoms > VIRUS_SYMPTOM_LIMIT) + max_symptoms = VIRUS_SYMPTOM_LIMIT + var/datum/disease/advance/A = new /datum/disease/advance() var/list/datum/symptom/possible_symptoms = list() for(var/symptom in subtypesof(/datum/symptom)) var/datum/symptom/S = symptom diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm index 6c852684b2..9d31852d28 100644 --- a/code/modules/antagonists/blob/blob/overmind.dm +++ b/code/modules/antagonists/blob/blob/overmind.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) pass_flags = PASSBLOB faction = list(ROLE_BLOB) lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + call_life = TRUE var/obj/structure/blob/core/blob_core = null // The blob overmind's core var/blob_points = 0 var/max_blob_points = 100 @@ -67,7 +68,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(!T) CRASH("No blobspawnpoints and blob spawned in nullspace.") forceMove(T) - + /mob/camera/blob/proc/is_valid_turf(turf/T) var/area/A = get_area(T) if((A && !A.blob_allowed) || !T || !is_station_level(T.z) || isspaceturf(T)) @@ -217,9 +218,6 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/link = FOLLOW_LINK(M, src) to_chat(M, "[link] [rendered]") -/mob/camera/blob/emote(act,m_type=1,message = null) - return - /mob/camera/blob/blob_act(obj/structure/blob/B) return diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index d8371d3751..9df812822c 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -4,6 +4,7 @@ job_rank = ROLE_BROTHER var/special_role = ROLE_BROTHER var/datum/team/brother_team/team + antag_moodlet = /datum/mood_event/focused /datum/antagonist/brother/create_team(datum/team/brother_team/new_team) if(!new_team) @@ -151,4 +152,4 @@ add_objective(new/datum/objective/steal, TRUE) /datum/team/brother_team/antag_listing_name() - return "[name] blood brothers" \ No newline at end of file + return "[name] blood brothers" diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index d6afa339d5..afbe823354 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -7,6 +7,7 @@ roundend_category = "changelings" antagpanel_category = "Changeling" job_rank = ROLE_CHANGELING + antag_moodlet = /datum/mood_event/focused var/you_are_greet = TRUE var/give_objectives = TRUE @@ -542,4 +543,4 @@ return ..() + "([changelingID])" /datum/antagonist/changeling/xenobio/antag_listing_name() - return ..() + "(Xenobio)" \ No newline at end of file + return ..() + "(Xenobio)" diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 93a05834fe..cb5aba6c99 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -30,9 +30,11 @@ user.reagents.add_reagent("antihol", 10) user.reagents.add_reagent("mannitol", 25) - for(var/thing in user.viruses) - var/datum/disease/D = thing - if(D.severity == VIRUS_SEVERITY_POSITIVE) - continue - D.cure() + if(isliving(user)) + var/mob/living/L = user + for(var/thing in L.diseases) + var/datum/disease/D = thing + if(D.severity == DISEASE_SEVERITY_POSITIVE) + continue + D.cure() return TRUE diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 3f32cdaa59..98719a06de 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -242,14 +242,17 @@ return TRUE /obj/effect/clockwork/sigil/transmission/update_icon() + var/power_charge = get_clockwork_power() if(GLOB.ratvar_awakens) alpha = 255 - var/power_charge = get_clockwork_power() - alpha = min(initial(alpha) + power_charge * 0.02, 255) - if(!power_charge) - set_light(0) else - set_light(max(alpha * 0.02, 1.4), max(alpha * 0.01, 0.1)) + alpha = min(CEILING(initial(alpha) + power_charge * 0.02, 35), 255) + var/r = alpha * 0.02 + var/p = max(alpha * 0.01, 0.1) + if(!power_charge && light_range != 0) + set_light(0) + else if(r != light_range || p != light_power) + set_light(r, p) //Vitality Matrix: Drains health from non-servants to heal or even revive servants. /obj/effect/clockwork/sigil/vitality diff --git a/code/modules/antagonists/clockcult/clock_helpers/power_helpers.dm b/code/modules/antagonists/clockcult/clock_helpers/power_helpers.dm index 37f09b405f..f927fc237d 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/power_helpers.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/power_helpers.dm @@ -4,21 +4,23 @@ return amount ? GLOB.clockwork_power >= amount : GLOB.clockwork_power /proc/adjust_clockwork_power(amount) //Adjusts the global clockwork power by this amount (min 0.) + var/current_power if(GLOB.ratvar_approaches) amount *= 0.75 //The herald's beacon reduces power costs by 25% across the board! - GLOB.clockwork_power = GLOB.ratvar_awakens ? INFINITY : max(0, GLOB.clockwork_power + amount) - GLOB.clockwork_power = CLAMP(GLOB.clockwork_power, 0, MAX_CLOCKWORK_POWER) + if(GLOB.ratvar_awakens) + current_power = GLOB.clockwork_power = INFINITY + else + current_power = GLOB.clockwork_power = CLAMP(GLOB.clockwork_power + amount, 0, MAX_CLOCKWORK_POWER) for(var/obj/effect/clockwork/sigil/transmission/T in GLOB.all_clockwork_objects) T.update_icon() - var/power_overwhelming = GLOB.clockwork_power var/unlock_message - if(power_overwhelming >= SCRIPT_UNLOCK_THRESHOLD && !GLOB.script_scripture_unlocked) + if(current_power >= SCRIPT_UNLOCK_THRESHOLD && !GLOB.script_scripture_unlocked) GLOB.script_scripture_unlocked = TRUE unlock_message = "The Ark swells as a key power threshold is reached. Script scriptures are now available." - if(power_overwhelming >= APPLICATION_UNLOCK_THRESHOLD && !GLOB.application_scripture_unlocked) + if(current_power >= APPLICATION_UNLOCK_THRESHOLD && !GLOB.application_scripture_unlocked) GLOB.application_scripture_unlocked = TRUE unlock_message = "The Ark surges as a key power threshold is reached. Application scriptures are now available." - if(GLOB.servants_active) + if(unlock_message && GLOB.servants_active) hierophant_message(unlock_message) return TRUE diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm index 6f6dc69461..262910346e 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm @@ -27,26 +27,27 @@ var/OldLoc = loc if(NewLoc && !istype(NewLoc, /turf/open/indestructible/reebe_void)) var/turf/T = get_turf(NewLoc) - if (locate(/obj/effect/blessing, T)) - if(last_failed_turf != T) - T.visible_message("[T] suddenly emits a ringing sound!", null, null, null, src) - playsound(T, 'sound/machines/clockcult/ark_damage.ogg', 75, FALSE) - last_failed_turf = T - if ((world.time - lastWarning) >= 30) - lastWarning = world.time - to_chat(src, "This turf is consecrated and can't be crossed!") - return - if(!GLOB.ratvar_awakens && istype(get_area(T), /area/chapel)) - if ((world.time - lastWarning) >= 30) - lastWarning = world.time - to_chat(src, "The Chapel is hallowed ground under a heretical deity, and can't be accessed!") - return + if(!GLOB.ratvar_awakens) + if(locate(/obj/effect/blessing, T)) + if(last_failed_turf != T) + T.visible_message("[T] suddenly emits a ringing sound!", null, null, null, src) + playsound(T, 'sound/machines/clockcult/ark_damage.ogg', 75, FALSE) + last_failed_turf = T + if((world.time - lastWarning) >= 30) + lastWarning = world.time + to_chat(src, "This turf is consecrated and can't be crossed!") + return + if(istype(get_area(T), /area/chapel)) + if((world.time - lastWarning) >= 30) + lastWarning = world.time + to_chat(src, "The Chapel is hallowed ground under a heretical deity, and can't be accessed!") + return + else + for(var/turf/TT in range(5, src)) + if(prob(166 - (get_dist(src, TT) * 33))) + TT.ratvar_act() //Causes moving to leave a swath of proselytized area behind the Eminence forceMove(T) - Moved(OldLoc, direct) - if(GLOB.ratvar_awakens) - for(var/turf/T in range(5, src)) - if(prob(166 - (get_dist(src, T) * 33))) - T.ratvar_act() //Causes moving to leave a swath of proselytized area behind the Eminence + Moved(OldLoc, direct) /mob/camera/eminence/Process_Spacemove(movement_dir = 0) return TRUE diff --git a/code/modules/antagonists/clockcult/clockcult.dm b/code/modules/antagonists/clockcult/clockcult.dm index 067801677b..f921b6b527 100644 --- a/code/modules/antagonists/clockcult/clockcult.dm +++ b/code/modules/antagonists/clockcult/clockcult.dm @@ -4,6 +4,7 @@ roundend_category = "clock cultists" antagpanel_category = "Clockcult" job_rank = ROLE_SERVANT_OF_RATVAR + antag_moodlet = /datum/mood_event/cult var/datum/action/innate/hierophant/hierophant_network = new() var/datum/team/clockcult/clock_team var/make_team = TRUE //This should be only false for tutorial scarabs @@ -216,4 +217,4 @@ parts += "Ratvar's servants were:" parts += printplayerlist(members - eminence) - return "
[parts.Join("
")]
" \ No newline at end of file + return "
[parts.Join("
")]
" diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 36bd8fb826..acf516259f 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -72,10 +72,10 @@ else to_chat(owner, "You are already invoking blood magic!") return - if(do_after(owner, 100 - rune*65, target = owner)) + if(do_after(owner, 100 - rune*60, target = owner)) if(ishuman(owner)) var/mob/living/carbon/human/H = owner - H.bleed(30 - rune*25) + H.bleed(40 - rune*32) var/datum/action/innate/cult/blood_spell/new_spell = new BS(owner) new_spell.Grant(owner, src) spells += new_spell @@ -177,6 +177,7 @@ desc = "A sinister spell used to convert:
Plasteel into runed metal
25 metal into a construct shell
Cyborgs directly into constructs
Cyborg shells into construct shells
Airlocks into runed airlocks (harm intent)" button_icon_state = "transmute" magic_path = "/obj/item/melee/blood_magic/construction" + health_cost = 10 /datum/action/innate/cult/blood_spell/equipment name = "Summon Equipment" @@ -414,7 +415,7 @@ target.visible_message("[L]'s holy weapon absorbs the light!", \ "Your holy weapon absorbs the blinding light!") else - L.Knockdown(180) + L.Knockdown(160) L.flash_act(1,1) if(issilicon(target)) var/mob/living/silicon/S = L @@ -733,11 +734,11 @@ to_chat(user, "You decide against conducting a greater blood rite.") return switch(choice) - if("Blood Spear (200)") - if(uses < 200) + if("Blood Spear (150)") + if(uses < 150) to_chat(user, "You need 200 charges to perform this rite.") else - uses -= 200 + uses -= 150 var/turf/T = get_turf(user) qdel(src) var/datum/action/innate/cult/spear/S = new(user) @@ -749,24 +750,24 @@ else user.visible_message("A [rite.name] appears at [user]'s feet!", \ "A [rite.name] materializes at your feet.") - if("Blood Bolt Barrage (400)") - if(uses < 400) + if("Blood Bolt Barrage (300)") + if(uses < 300) to_chat(user, "You need 400 charges to perform this rite.") else var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood() - uses -= 400 + uses -= 300 qdel(src) if(user.put_in_hands(rite)) to_chat(user, "Your hands glow with power!") else to_chat(user, "You need a free hand for this rite!") qdel(rite) - if("Blood Beam (600)") - if(uses < 600) + if("Blood Beam (500)") + if(uses < 500) to_chat(user, "You need 600 charges to perform this rite.") else var/obj/rite = new /obj/item/blood_beam() - uses -= 600 + uses -= 500 qdel(src) if(user.put_in_hands(rite)) to_chat(user, "Your hands glow with POWER OVERWHELMING!!!") diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 1c90834cbd..a31f29efe0 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -4,6 +4,7 @@ name = "Cultist" roundend_category = "cultists" antagpanel_category = "Cult" + antag_moodlet = /datum/mood_event/cult var/datum/action/innate/cult/comm/communion = new var/datum/action/innate/cult/mastervote/vote = new var/datum/action/innate/cult/blood_magic/magic = new diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 961f071b02..308cd38c80 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -1,5 +1,4 @@ // Contains cult communion, guide, and cult master abilities -#define MARK_COOLDOWN /datum/action/innate/cult icon_icon = 'icons/mob/actions/actions_cult.dmi' diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 14787fb30e..eacf4fb518 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -32,8 +32,6 @@ Runes can either be invoked by one's self or with many different cultists. Each var/scribe_delay = 40 //how long the rune takes to create var/scribe_damage = 0.1 //how much damage you take doing it - - var/allow_excess_invokers = FALSE //if we allow excess invokers when being invoked var/invoke_damage = 0 //how much damage invokers take when invoking it var/construct_invoke = TRUE //if constructs can invoke it @@ -109,12 +107,9 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/proc/can_invoke(var/mob/living/user=null) //This proc determines if the rune can be invoked at the time. If there are multiple required cultists, it will find all nearby cultists. var/list/invokers = list() //people eligible to invoke the rune - var/list/chanters = list() //people who will actually chant the rune when passed to invoke() if(user) - chanters += user invokers += user - - if(req_cultists > 1 || allow_excess_invokers) + if(req_cultists > 1 || istype(src, /obj/effect/rune/convert)) var/list/things_in_range = range(1, src) var/obj/item/toy/plush/narplush/plushsie = locate() in things_in_range if(istype(plushsie) && plushsie.is_invoker) @@ -130,17 +125,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(L.stat) continue invokers += L - if(allow_excess_invokers) - chanters += invokers - else - shuffle_inplace(invokers) - for(var/i in 1 to req_cultists) - var/C = pick_n_take(invokers) - if(!C) - break - if(C != user) - chanters += C - return chanters + return invokers /obj/effect/rune/proc/invoke(var/list/invokers) //This proc contains the effects of the rune as well as things that happen afterwards. If you want it to spawn an object and then delete itself, have both here. @@ -160,9 +145,9 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/proc/do_invoke_glow() set waitfor = FALSE var/oldtransform = transform - animate(src, transform = matrix()*2, alpha = 0, time = 5) //fade out + animate(src, transform = matrix()*2, alpha = 0, time = 5, flags = ANIMATION_END_NOW) //fade out sleep(5) - animate(src, transform = oldtransform, alpha = 255, time = 0) + animate(src, transform = oldtransform, alpha = 255, time = 0, flags = ANIMATION_END_NOW) /obj/effect/rune/proc/fail_invoke() //This proc contains the effects of a rune if it is not invoked correctly, through either invalid wording or not enough cultists. By default, it's just a basic fizzle. @@ -197,7 +182,6 @@ structure_check() searches for nearby cultist structures required for the invoca icon_state = "3" color = RUNE_COLOR_OFFER req_cultists = 1 - allow_excess_invokers = TRUE rune_in_use = FALSE /obj/effect/rune/convert/do_invoke_glow() @@ -247,7 +231,7 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers) if(invokers.len < 2) for(var/M in invokers) - to_chat(M, "You need more invokers to convert [convertee]!") + to_chat(M, "You need at least two invokers to convert [convertee]!") log_game("Offer rune failed - tried conversion with one invoker") return 0 if(convertee.anti_magic_check(TRUE, TRUE)) @@ -938,7 +922,6 @@ structure_check() searches for nearby cultist structures required for the invoca icon_state = "apoc" pixel_x = -32 pixel_y = -32 - allow_excess_invokers = TRUE color = RUNE_COLOR_DARKRED req_cultists = 3 scribe_delay = 100 diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm new file mode 100644 index 0000000000..8172d58d8e --- /dev/null +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -0,0 +1,347 @@ +/* +Abilities that can be purchased by disease mobs. Most are just passive symptoms that will be +added to their disease, but some are active abilites that affect only the target the overmind +is currently following. +*/ + +GLOBAL_LIST_INIT(disease_ability_singletons, list( + new /datum/disease_ability/action/cough(), + new /datum/disease_ability/action/sneeze(), + new /datum/disease_ability/symptom/cough(), + new /datum/disease_ability/symptom/sneeze(),\ + new /datum/disease_ability/symptom/hallucigen(), + new /datum/disease_ability/symptom/choking(), + new /datum/disease_ability/symptom/confusion(), + new /datum/disease_ability/symptom/youth(), + new /datum/disease_ability/symptom/vomit(), + new /datum/disease_ability/symptom/voice_change(), + new /datum/disease_ability/symptom/visionloss(), + new /datum/disease_ability/symptom/viraladaptation(), + new /datum/disease_ability/symptom/vitiligo(), + new /datum/disease_ability/symptom/sensory_restoration(), + new /datum/disease_ability/symptom/itching(), + new /datum/disease_ability/symptom/weight_loss(), + new /datum/disease_ability/symptom/metabolism_heal(), + new /datum/disease_ability/symptom/coma_heal() + )) + +/datum/disease_ability + var/name + var/cost = 0 + var/required_total_points = 0 + var/start_with = FALSE + var/short_desc = "" + var/long_desc = "" + var/stat_block = "" + var/threshold_block = "" + var/category = "" + + var/list/symptoms + var/list/actions + +/datum/disease_ability/New() + ..() + if(symptoms) + var/stealth = 0 + var/resistance = 0 + var/stage_speed = 0 + var/transmittable = 0 + for(var/T in symptoms) + var/datum/symptom/S = T + stealth += initial(S.stealth) + resistance += initial(S.resistance) + stage_speed += initial(S.stage_speed) + transmittable += initial(S.transmittable) + threshold_block += "

[initial(S.threshold_desc)]" + stat_block = "Resistance: [resistance]
Stealth: [stealth]
Stage Speed: [stage_speed]
Transmittability: [transmittable]

" + +/datum/disease_ability/proc/CanBuy(mob/camera/disease/D) + if(world.time < D.next_adaptation_time) + return FALSE + if(!D.unpurchased_abilities[src]) + return FALSE + return (D.points >= cost) && (D.total_points >= required_total_points) + +/datum/disease_ability/proc/Buy(mob/camera/disease/D, silent = FALSE, trigger_cooldown = TRUE) + if(!silent) + to_chat(D, "Purchased [name].") + D.points -= cost + D.unpurchased_abilities -= src + if(trigger_cooldown) + D.adapt_cooldown() + D.purchased_abilities[src] = TRUE + for(var/V in (D.disease_instances+D.disease_template)) + var/datum/disease/advance/sentient_disease/SD = V + if(symptoms) + for(var/T in symptoms) + var/datum/symptom/S = new T() + SD.symptoms += S + if(SD.processing) + S.Start(SD) + SD.Refresh() + for(var/T in actions) + var/datum/action/A = new T() + A.Grant(D) + + +/datum/disease_ability/proc/CanRefund(mob/camera/disease/D) + if(world.time < D.next_adaptation_time) + return FALSE + return D.purchased_abilities[src] + +/datum/disease_ability/proc/Refund(mob/camera/disease/D, silent = FALSE, trigger_cooldown = TRUE) + if(!silent) + to_chat(D, "Refunded [name].") + D.points += cost + D.unpurchased_abilities[src] = TRUE + if(trigger_cooldown) + D.adapt_cooldown() + D.purchased_abilities -= src + for(var/V in (D.disease_instances+D.disease_template)) + var/datum/disease/advance/sentient_disease/SD = V + if(symptoms) + for(var/T in symptoms) + var/datum/symptom/S = locate(T) in SD.symptoms + if(S) + SD.symptoms -= S + if(SD.processing) + S.End(SD) + qdel(S) + SD.Refresh() + for(var/T in actions) + var/datum/action/A = locate(T) in D.actions + qdel(A) + +//these sybtypes are for conveniently separating the different categories, they have no unique code. + +/datum/disease_ability/action + category = "Active" + +/datum/disease_ability/symptom + category = "Symptom" + +//active abilities and their associated actions + +/datum/disease_ability/action/cough + name = "Voluntary Coughing" + actions = list(/datum/action/cooldown/disease_cough) + cost = 0 + required_total_points = 0 + start_with = TRUE + short_desc = "Force the host you are following to cough, spreading your infection to those nearby." + long_desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmitability is low.
Cooldown: 10 seconds" + + +/datum/action/cooldown/disease_cough + name = "Cough" + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "cough" + desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmitability is low.
Cooldown: 10 seconds" + cooldown_time = 100 + +/datum/action/cooldown/disease_cough/Trigger() + if(!..()) + return FALSE + var/mob/camera/disease/D = owner + var/mob/living/L = D.following_host + if(!L) + return FALSE + if(L.stat != CONSCIOUS) + to_chat(D, "Your host must be concious to cough.") + return FALSE + to_chat(D, "You force [L.real_name] to cough.") + L.emote("cough") + var/datum/disease/advance/sentient_disease/SD = D.hosts[L] + SD.spread(2) + StartCooldown() + return TRUE + + +/datum/disease_ability/action/sneeze + name = "Voluntary Sneezing" + actions = list(/datum/action/cooldown/disease_sneeze) + cost = 2 + required_total_points = 3 + short_desc = "Force the host you are following to sneeze, spreading your infection to those in front of them." + long_desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host.
Cooldown: 20 seconds" + + +/datum/action/cooldown/disease_sneeze + name = "Sneeze" + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "sneeze" + desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host even if your transmitability is low.
Cooldown: 20 seconds" + cooldown_time = 200 + +/datum/action/cooldown/disease_sneeze/Trigger() + if(!..()) + return FALSE + var/mob/camera/disease/D = owner + var/mob/living/L = D.following_host + if(!L) + return FALSE + if(L.stat != CONSCIOUS) + to_chat(D, "Your host must be concious to sneeze.") + return FALSE + to_chat(D, "You force [L.real_name] to sneeze.") + L.emote("sneeze") + var/datum/disease/advance/sentient_disease/SD = D.hosts[L] + + for(var/mob/living/M in oview(4, SD.affected_mob)) + if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M))) + M.AirborneContractDisease(SD, TRUE) + + StartCooldown() + return TRUE + +//passive symptom abilities + +/datum/disease_ability/symptom/cough + name = "Involuntary Coughing" + symptoms = list(/datum/symptom/cough) + cost = 2 + required_total_points = 4 + short_desc = "Cause victims to cough intermittently." + long_desc = "Cause victims to cough intermittently, spreading your infection if your transmitability is high." + +/datum/disease_ability/symptom/sneeze + name = "Involuntary Sneezing" + symptoms = list(/datum/symptom/sneeze) + cost = 2 + required_total_points = 4 + short_desc = "Cause victims to sneeze intermittently." + long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmitability and resistance, at the cost of stealth." + +/datum/disease_ability/symptom/beard + //I don't think I need to justify the fact that this is the best symptom + name = "Beard Growth" + symptoms = list(/datum/symptom/beard) + cost = 1 + required_total_points = 8 + short_desc = "Cause all victims to grow a luscious beard." + long_desc = "Cause all victims to grow a luscious beard. Decreases stats slightly. Ineffective against Santa Claus." + +/datum/disease_ability/symptom/hallucigen + name = "Hallucinations" + symptoms = list(/datum/symptom/hallucigen) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to hallucinate." + long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance." + + +/datum/disease_ability/symptom/choking + name = "Choking" + symptoms = list(/datum/symptom/choking) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to choke." + long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmittability." + + +/datum/disease_ability/symptom/confusion + name = "Confusion" + symptoms = list(/datum/symptom/confusion) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to become confused." + long_desc = "Cause victims to become confused intermittently." + + +/datum/disease_ability/symptom/youth + name = "Eternal Youth" + symptoms = list(/datum/symptom/youth) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to become eternally young." + long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmittability." + + +/datum/disease_ability/symptom/vomit + name = "Vomiting" + symptoms = list(/datum/symptom/vomit) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to vomit." + long_desc = "Cause victims to vomit. Slightly increases transmittability. Vomiting also also causes the victims to lose nutrition and removes some toxin damage." + + +/datum/disease_ability/symptom/voice_change + name = "Voice Changing" + symptoms = list(/datum/symptom/voice_change) + cost = 4 + required_total_points = 8 + short_desc = "Change the voice of victims." + long_desc = "Change the voice of victims, causing confusion in communications." + + +/datum/disease_ability/symptom/visionloss + name = "Vision Loss" + symptoms = list(/datum/symptom/visionloss) + cost = 4 + required_total_points = 8 + short_desc = "Damage the eyes of victims, eventually causing blindness." + long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats." + + +/datum/disease_ability/symptom/viraladaptation + name = "Self-Adaptation" + symptoms = list(/datum/symptom/viraladaptation) + cost = 4 + required_total_points = 8 + short_desc = "Cause your infection to become more resistant to detection and eradication." + long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed." + + +/datum/disease_ability/symptom/vitiligo + name = "Skin Paleness" + symptoms = list(/datum/symptom/vitiligo) + cost = 1 + required_total_points = 8 + short_desc = "Cause victims to become pale." + long_desc = "Cause victims to become pale. Decreases all stats." + + +/datum/disease_ability/symptom/sensory_restoration + name = "Sensory Restoration" + symptoms = list(/datum/symptom/sensory_restoration) + cost = 4 + required_total_points = 8 + short_desc = "Regenerate eye and ear damage of victims." + long_desc = "Regenerate eye and ear damage of victims." + + +/datum/disease_ability/symptom/itching + name = "Itching" + symptoms = list(/datum/symptom/itching) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to itch." + long_desc = "Cause victims to itch, increasing all stats except stealth." + + +/datum/disease_ability/symptom/weight_loss + name = "Weight Loss" + symptoms = list(/datum/symptom/weight_loss) + cost = 4 + required_total_points = 8 + short_desc = "Cause victims to lose weight." + long_desc = "Cause victims to lose weight, and make it almost immpossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing." + + +/datum/disease_ability/symptom/metabolism_heal + name = "Metabolic Boost" + symptoms = list(/datum/symptom/heal/metabolism) + cost = 4 + required_total_points = 16 + short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster." + long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly." + + +/datum/disease_ability/symptom/coma_heal + name = "Regenerative Coma" + symptoms = list(/datum/symptom/heal/coma) + cost = 8 + required_total_points = 16 + short_desc = "Cause victims to fall into a healing coma when hurt." + long_desc = "Cause victims to fall into a healing coma when hurt." diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm new file mode 100644 index 0000000000..eb0feac0a2 --- /dev/null +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -0,0 +1,99 @@ +/datum/antagonist/disease + name = "Sentient Disease" + roundend_category = "diseases" + antagpanel_category = "Disease" + var/disease_name = "" + +/datum/antagonist/disease/on_gain() + owner.special_role = "Sentient Disease" + owner.assigned_role = "Sentient Disease" + var/datum/objective/O = new /datum/objective/disease_infect() + O.owner = owner + objectives += O + owner.objectives += O + + O = new /datum/objective/disease_infect_centcom() + O.owner = owner + objectives += O + owner.objectives += O + + . = ..() + +/datum/antagonist/disease/greet() + to_chat(owner.current, "You are the [owner.special_role]!") + to_chat(owner.current, "Infect members of the crew to gain adaptation points, and spread your infection further.") + owner.announce_objectives() + +/datum/antagonist/disease/apply_innate_effects(mob/living/mob_override) + if(!istype(owner.current, /mob/camera/disease)) + var/turf/T = get_turf(owner.current) + T = T ? T : SSmapping.get_station_center() + var/mob/camera/disease/D = new /mob/camera/disease(T) + owner.transfer_to(D) + +/datum/antagonist/disease/admin_add(datum/mind/new_owner,mob/admin) + ..() + var/mob/camera/disease/D = new_owner.current + D.pick_name() + +/datum/antagonist/disease/roundend_report() + var/list/result = list() + + result += "Disease name: [disease_name]" + result += printplayer(owner) + + var/win = TRUE + var/objectives_text = "" + var/count = 1 + for(var/datum/objective/objective in objectives) + if(objective.check_completion()) + objectives_text += "
Objective #[count]: [objective.explanation_text] Success!" + else + objectives_text += "
Objective #[count]: [objective.explanation_text] Fail." + win = FALSE + count++ + + result += objectives_text + + var/special_role_text = lowertext(name) + + if(win) + result += "The [special_role_text] was successful!" + else + result += "The [special_role_text] has failed!" + + if(istype(owner.current, /mob/camera/disease)) + var/mob/camera/disease/D = owner.current + result += "[disease_name] completed the round with [D.hosts.len] infected hosts, and reached a maximum of [D.total_points] concurrent infections." + result += "[disease_name] completed the round with the following adaptations:" + var/list/adaptations = list() + for(var/V in D.purchased_abilities) + var/datum/disease_ability/A = V + adaptations += A.name + result += adaptations.Join(", ") + + return result.Join("
") + + +/datum/objective/disease_infect + explanation_text = "Survive and infect as many people as possible." + +/datum/objective/disease_infect/check_completion() + var/mob/camera/disease/D = owner.current + if(istype(D) && D.hosts.len) //theoretically it should not exist if it has no hosts, but better safe than sorry. + return TRUE + return FALSE + + +/datum/objective/disease_infect_centcom + explanation_text = "Ensure that at least one infected host escapes on the shuttle or an escape pod." + +/datum/objective/disease_infect_centcom/check_completion() + var/mob/camera/disease/D = owner.current + if(!istype(D)) + return FALSE + for(var/V in D.hosts) + var/mob/living/L = V + if(L.onCentCom() || L.onSyndieBase()) + return TRUE + return FALSE diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm new file mode 100644 index 0000000000..8ee36e8829 --- /dev/null +++ b/code/modules/antagonists/disease/disease_disease.dm @@ -0,0 +1,59 @@ +/datum/disease/advance/sentient_disease + form = "Virus" + name = "Sentient Virus" + desc = "An apparently sentient virus, extremely adaptable and resistant to outside sources of mutation." + viable_mobtypes = list(/mob/living/carbon/human) + mutable = FALSE + var/mob/camera/disease/overmind + +/datum/disease/advance/sentient_disease/New() + ..() + GLOB.sentient_disease_instances += src + +/datum/disease/advance/sentient_disease/Destroy() + . = ..() + GLOB.sentient_disease_instances -= src + +/datum/disease/advance/sentient_disease/remove_disease() + if(overmind) + overmind.remove_infection(src) + ..() + +/datum/disease/advance/sentient_disease/infect(var/mob/living/infectee, make_copy = TRUE) + if(make_copy && overmind && (overmind.disease_template != src)) + overmind.disease_template.infect(infectee, TRUE) //get an updated version of the virus + else + ..() + + +/datum/disease/advance/sentient_disease/IsSame(datum/disease/D) + if(istype(src, D.type)) + var/datum/disease/advance/sentient_disease/V = D + if(V.overmind == overmind) + return TRUE + return FALSE + + +/datum/disease/advance/sentient_disease/Copy() + var/datum/disease/advance/sentient_disease/D = ..() + D.overmind = overmind + return D + +/datum/disease/advance/sentient_disease/after_add() + if(overmind) + overmind.add_infection(src) + + +/datum/disease/advance/sentient_disease/GetDiseaseID() + return "[type]|[overmind ? overmind.tag : null]" + +/datum/disease/advance/sentient_disease/GenerateCure() + if(cures.len) + return + var/list/not_used = advance_cures.Copy() + cures = list(pick_n_take(not_used), pick_n_take(not_used)) + + // Get the cure name from the cure_id + var/datum/reagent/D1 = GLOB.chemical_reagents_list[cures[1]] + var/datum/reagent/D2 = GLOB.chemical_reagents_list[cures[2]] + cure_text = "[D1.name] and [D2.name]" diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm new file mode 100644 index 0000000000..ad66ee0cbb --- /dev/null +++ b/code/modules/antagonists/disease/disease_event.dm @@ -0,0 +1,26 @@ + +/datum/round_event_control/sentient_disease + name = "Spawn Sentient Disease" + typepath = /datum/round_event/ghost_role/sentient_disease + weight = 7 + max_occurrences = 1 + min_players = 5 + + +/datum/round_event/ghost_role/sentient_disease + role_name = "sentient disease" + +/datum/round_event/ghost_role/sentient_disease/spawn_role() + var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) + if(!candidates.len) + return NOT_ENOUGH_PLAYERS + + var/mob/dead/observer/selected = pick_n_take(candidates) + + var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) + virus.key = selected.key + INVOKE_ASYNC(virus, /mob/camera/disease/proc/pick_name) + message_admins("[key_name_admin(virus)] has been made into a sentient disease by an event.") + log_game("[key_name(virus)] was spawned as a sentient disease by an event.") + spawned_mobs += virus + return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm new file mode 100644 index 0000000000..f348704c77 --- /dev/null +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -0,0 +1,378 @@ +/* +A mob of type /mob/camera/disease is an overmind coordinating at least one instance of /datum/disease/advance/sentient_disease +that has infected a host. All instances in a host will be synchronized with the stats of the overmind's disease_template. Any +samples outside of a host will retain the stats they had when they left the host, but infecting a new host will cause +the new instance inside the host to be updated to the template's stats. +*/ + +/mob/camera/disease + name = "" + real_name = "" + desc = "" + icon = 'icons/mob/blob.dmi' + icon_state = "marker" + mouse_opacity = MOUSE_OPACITY_ICON + move_on_shuttle = FALSE + see_in_dark = 8 + invisibility = INVISIBILITY_OBSERVER + layer = BELOW_MOB_LAYER + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + sight = SEE_SELF|SEE_THRU + initial_language_holder = /datum/language_holder/empty + + var/freemove = TRUE + var/freemove_end = 0 + var/const/freemove_time = 1200 + var/freemove_end_timerid + + var/datum/action/innate/disease_adapt/adaptation_menu_action + var/datum/disease_ability/examining_ability + var/datum/browser/browser + var/browser_open = FALSE + + var/mob/living/following_host + var/datum/component/redirect/move_listener + var/list/disease_instances + var/list/hosts //this list is associative, affected_mob -> disease_instance + var/datum/disease/advance/sentient_disease/disease_template + + var/total_points = 0 + var/points = 0 + + var/last_move_tick = 0 + var/move_delay = 1 + + var/next_adaptation_time = 0 + var/adaptation_cooldown = 1200 + + var/list/purchased_abilities + var/list/unpurchased_abilities + +/mob/camera/disease/Initialize(mapload) + .= ..() + + disease_instances = list() + hosts = list() + + purchased_abilities = list() + unpurchased_abilities = list() + + disease_template = new /datum/disease/advance/sentient_disease() + disease_template.overmind = src + qdel(SSdisease.archive_diseases[disease_template.GetDiseaseID()]) + SSdisease.archive_diseases[disease_template.GetDiseaseID()] = disease_template //important for stuff that uses disease IDs + + var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] + my_hud.add_hud_to(src) + + browser = new /datum/browser(src, "disease_menu", "Adaptation Menu", 1000, 770, src) + + freemove_end = world.time + freemove_time + freemove_end_timerid = addtimer(CALLBACK(src, .proc/infect_random_patient_zero), freemove_time, TIMER_STOPPABLE) + +/mob/camera/disease/Destroy() + . = ..() + QDEL_NULL(adaptation_menu_action) + for(var/V in GLOB.sentient_disease_instances) + var/datum/disease/advance/sentient_disease/S = V + if(S.overmind == src) + S.overmind = null + +/mob/camera/disease/Login() + ..() + if(freemove) + to_chat(src, "You have [round((freemove_end - world.time)/10)] seconds to select your first host. Click on a human to select your host.") + + +/mob/camera/disease/Stat() + ..() + if(statpanel("Status")) + if(freemove) + stat("Host Selection Time: [round((freemove_end - world.time)/10)]s") + else + stat("Adaptation Points: [points]/[total_points]") + stat("Hosts: [disease_instances.len]") + var/adapt_ready = next_adaptation_time - world.time + if(adapt_ready > 0) + stat("Adaptation Ready: [round(adapt_ready/10, 0.1)]s") + +/mob/camera/disease/say(message) + return + +/mob/camera/disease/Move(NewLoc, Dir = 0) + if(freemove) + forceMove(NewLoc) + else + if(world.time > (last_move_tick + move_delay)) + follow_next(Dir & NORTHWEST) + last_move_tick = world.time + +/mob/camera/disease/mind_initialize() + . = ..() + if(!mind.has_antag_datum(/datum/antagonist/disease)) + mind.add_antag_datum(/datum/antagonist/disease) + +/mob/camera/disease/proc/pick_name() + var/static/list/taken_names + if(!taken_names) + taken_names = list("Unknown" = TRUE) + for(var/T in (subtypesof(/datum/disease) - /datum/disease/advance)) + var/datum/disease/D = T + taken_names[initial(D.name)] = TRUE + var/set_name + while(!set_name) + var/input = stripped_input(src, "Select a name for your disease", "Select Name", "", MAX_NAME_LEN) + if(!input) + set_name = "Sentient Virus" + break + if(taken_names[input]) + to_chat(src, "You cannot use the name of such a well-known disease!") + else + set_name = input + real_name = "[set_name] (Sentient Disease)" + name = "[set_name] (Sentient Disease)" + disease_template.AssignName(set_name) + var/datum/antagonist/disease/A = mind.has_antag_datum(/datum/antagonist/disease) + if(A) + A.disease_name = set_name + +/mob/camera/disease/proc/infect_random_patient_zero(del_on_fail = TRUE) + if(!freemove) + return FALSE + var/list/possible_hosts = list() + var/list/afk_possible_hosts = list() + for(var/mob/living/carbon/human/H in GLOB.carbon_list) + var/turf/T = get_turf(H) + if((H.stat != DEAD) && T && is_station_level(T.z) && H.CanContractDisease(disease_template)) + if(H.client && !H.client.is_afk()) + possible_hosts += H + else + afk_possible_hosts += H + + shuffle_inplace(possible_hosts) + shuffle_inplace(afk_possible_hosts) + possible_hosts += afk_possible_hosts //ideally we want a not-afk person, but we will settle for an afk one if there are no others (mostly for testing) + + while(possible_hosts.len) + var/mob/living/carbon/human/target = possible_hosts[1] + if(force_infect(target)) + return TRUE + possible_hosts.Cut(1, 2) + + if(del_on_fail) + to_chat(src, "No hosts were available for your disease to infect.") + qdel(src) + return FALSE + +/mob/camera/disease/proc/force_infect(mob/living/L) + var/datum/disease/advance/sentient_disease/V = disease_template.Copy() + var/result = L.ForceContractDisease(V, FALSE, TRUE) + if(result && freemove) + end_freemove() + return result + +/mob/camera/disease/proc/end_freemove() + if(!freemove) + return + freemove = FALSE + move_on_shuttle = TRUE + adaptation_menu_action = new /datum/action/innate/disease_adapt() + adaptation_menu_action.Grant(src) + for(var/V in GLOB.disease_ability_singletons) + unpurchased_abilities[V] = TRUE + var/datum/disease_ability/A = V + if(A.start_with && A.CanBuy(src)) + A.Buy(src, TRUE, FALSE) + if(freemove_end_timerid) + deltimer(freemove_end_timerid) + sight = SEE_SELF + +/mob/camera/disease/proc/add_infection(datum/disease/advance/sentient_disease/V) + disease_instances += V + hosts[V.affected_mob] = V + total_points = max(total_points, disease_instances.len) + points += 1 + + var/image/holder = V.affected_mob.hud_list[SENTIENT_DISEASE_HUD] + var/mutable_appearance/MA = new /mutable_appearance(holder) + MA.icon_state = "virus_infected" + MA.layer = BELOW_MOB_LAYER + MA.color = COLOR_GREEN_GRAY + MA.alpha = 200 + holder.appearance = MA + var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] + my_hud.add_to_hud(V.affected_mob) + + to_chat(src, "A new host, [V.affected_mob.real_name], has been infected.") + + if(!following_host) + set_following(V.affected_mob) + refresh_adaptation_menu() + +/mob/camera/disease/proc/remove_infection(datum/disease/advance/sentient_disease/V) + if(QDELETED(src)) + disease_instances -= V + hosts -= V.affected_mob + else + points -= 1 + to_chat(src, "One of your hosts, [V.affected_mob.real_name], has been purged of your infection.") + + var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] + my_hud.remove_from_hud(V.affected_mob) + + if(following_host == V.affected_mob) + follow_next() + + disease_instances -= V + hosts -= V.affected_mob + + if(!disease_instances.len) + to_chat(src, "The last of your infection has disappeared.") + set_following(null) + qdel(src) + refresh_adaptation_menu() + +/mob/camera/disease/proc/set_following(mob/living/L) + following_host = L + if(!move_listener) + move_listener = L.AddComponent(/datum/component/redirect, COMSIG_MOVABLE_MOVED, CALLBACK(src, .proc/follow_mob)) + else + L.TakeComponent(move_listener) + if(QDELING(move_listener)) + move_listener = null + follow_mob() + +/mob/camera/disease/proc/follow_next(reverse = FALSE) + var/index = hosts.Find(following_host) + if(index) + if(reverse) + index = index == 1 ? hosts.len : index - 1 + else + index = index == hosts.len ? 1 : index + 1 + set_following(hosts[index]) + +/mob/camera/disease/proc/follow_mob(newloc, dir) + var/turf/T = get_turf(following_host) + if(T) + forceMove(T) + +/mob/camera/disease/DblClickOn(var/atom/A, params) + if(hosts[A]) + set_following(A) + else + ..() + +/mob/camera/disease/ClickOn(var/atom/A, params) + if(freemove && ishuman(A)) + var/mob/living/carbon/human/H = A + if(alert(src, "Select [H.name] as your initial host?", "Select Host", "Yes", "No") != "Yes") + return + if(!freemove) + return + if(QDELETED(H) || !force_infect(H)) + to_chat(src, "[H ? H.name : "Host"] cannot be infected.") + else + ..() + +/mob/camera/disease/proc/adapt_cooldown() + to_chat(src, "You have altered your genetic structure. You will be unable to adapt again for [adaptation_cooldown/10] seconds.") + next_adaptation_time = world.time + adaptation_cooldown + addtimer(CALLBACK(src, .proc/notify_adapt_ready), adaptation_cooldown) + +/mob/camera/disease/proc/notify_adapt_ready() + to_chat(src, "You are now ready to adapt again.") + refresh_adaptation_menu() + +/mob/camera/disease/proc/refresh_adaptation_menu() + if(browser_open) + adaptation_menu() + +/mob/camera/disease/proc/adaptation_menu() + var/datum/disease/advance/sentient_disease/DT = disease_template + if(!DT) + return + var/list/dat = list() + + if(examining_ability) + dat += "Back

[examining_ability.name]

[examining_ability.stat_block][examining_ability.long_desc][examining_ability.threshold_block]" + else + dat += "

Disease Statistics


\ + Resistance: [DT.totalResistance()]
\ + Stealth: [DT.totalStealth()]
\ + Stage Speed: [DT.totalStageSpeed()]
\ + Transmittability: [DT.totalTransmittable()]
\ + Cure: [DT.cure_text]" + dat += "

Adaptations

\ + Points: [points] / [total_points]\ + \ + " + for(var/V in GLOB.disease_ability_singletons) + var/datum/disease_ability/A = V + var/purchase_text + if(unpurchased_abilities[A]) + if(A.CanBuy(src)) + purchase_text = "Purchase" + else + purchase_text = "Purchase" + else + if(A.CanRefund(src)) + purchase_text = "Refund" + else + purchase_text = "Refund" + dat += "" + + dat += "
CostUnlockNameTypeDescription
[A.cost][purchase_text][A.required_total_points][A.name][A.category][A.short_desc]

Infect many hosts at once to gain adaptation points.

Infected Hosts

" + for(var/V in hosts) + var/mob/living/L = V + dat += "
[L.real_name]" + + browser.set_content(dat.Join()) + browser.open() + browser_open = TRUE + +/mob/camera/disease/Topic(href, list/href_list) + ..() + if(href_list["close"]) + browser_open = FALSE + if(usr != src) + return + if(href_list["follow_instance"]) + var/mob/living/L = locate(href_list["follow_instance"]) in hosts + set_following(L) + + if(href_list["buy_ability"]) + var/datum/disease_ability/A = locate(href_list["buy_ability"]) + if(!istype(A)) + return + if(A.CanBuy(src)) + A.Buy(src) + adaptation_menu() + + if(href_list["refund_ability"]) + var/datum/disease_ability/A = locate(href_list["refund_ability"]) + if(!istype(A)) + return + if(A.CanRefund(src)) + A.Refund(src) + adaptation_menu() + + if(href_list["examine_ability"]) + var/datum/disease_ability/A = locate(href_list["examine_ability"]) + if(!istype(A)) + return + examining_ability = A + adaptation_menu() + + if(href_list["main_menu"]) + examining_ability = null + adaptation_menu() + + +/datum/action/innate/disease_adapt + name = "Adaptation Menu" + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "disease_menu" + +/datum/action/innate/disease_adapt/Activate() + var/mob/camera/disease/D = owner + D.adaptation_menu() diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index b2fab75eb4..f1e1d92c9d 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -6,9 +6,12 @@ /datum/antagonist/ert name = "Emergency Response Officer" var/datum/team/ert/ert_team - var/role = ERT_SEC - var/high_alert = FALSE + var/leader = FALSE + var/datum/outfit/outfit = /datum/outfit/ert/security + var/role = "Security Officer" + var/list/name_source show_in_antagpanel = FALSE + antag_moodlet = /datum/mood_event/focused /datum/antagonist/ert/on_gain() update_name() @@ -19,25 +22,76 @@ /datum/antagonist/ert/get_team() return ert_team +/datum/antagonist/ert/New() + . = ..() + name_source = GLOB.last_names + /datum/antagonist/ert/proc/update_name() - var/new_name - switch(role) - if(ERT_ENG) - new_name = "Engineer [pick(GLOB.last_names)]" - if(ERT_MED) - new_name = "Medical Officer [pick(GLOB.last_names)]" - if(ERT_SEC) - new_name = "Security Officer [pick(GLOB.last_names)]" - if(ERT_LEADER) - new_name = "Commander [pick(GLOB.last_names)]" - name = "Emergency Response Commander" - if(DEATHSQUAD) - new_name = "Trooper [pick(GLOB.commando_names)]" - name = "Deathsquad Trooper" - if(DEATHSQUAD_LEADER) - new_name = "Officer [pick(GLOB.commando_names)]" - name = "Deathsquad Officer" - owner.current.fully_replace_character_name(owner.current.real_name,new_name) + owner.current.fully_replace_character_name(owner.current.real_name,"[role] [pick(name_source)]") + +/datum/antagonist/ert/deathsquad/New() + . = ..() + name_source = GLOB.commando_names + +/datum/antagonist/ert/security // kinda handled by the base template but here for completion + +/datum/antagonist/ert/security/red + outfit = /datum/outfit/ert/security/alert + +/datum/antagonist/ert/engineer + role = "Engineer" + outfit = /datum/outfit/ert/engineer + +/datum/antagonist/ert/engineer/red + outfit = /datum/outfit/ert/engineer/alert + +/datum/antagonist/ert/medic + role = "Medical Officer" + outfit = /datum/outfit/ert/medic + +/datum/antagonist/ert/medic/red + outfit = /datum/outfit/ert/medic/alert + +/datum/antagonist/ert/commander + role = "Commander" + outfit = /datum/outfit/ert/commander + +/datum/antagonist/ert/commander/red + outfit = /datum/outfit/ert/commander/alert + +/datum/antagonist/ert/deathsquad + name = "Deathsquad Trooper" + outfit = /datum/outfit/death_commando + role = "Trooper" + +/datum/antagonist/ert/medic/inquisitor + outfit = /datum/outfit/ert/medic/inquisitor + +/datum/antagonist/ert/security/inquisitor + outfit = /datum/outfit/ert/security/inquisitor + +/datum/antagonist/ert/chaplain + role = "Chaplain" + outfit = /datum/outfit/ert/chaplain + +/datum/antagonist/ert/chaplain/inquisitor + outfit = /datum/outfit/ert/chaplain/inquisitor + +/datum/antagonist/ert/chaplain/on_gain() + . = ..() + owner.isholy = TRUE + +/datum/antagonist/ert/commander/inquisitor + outfit = /datum/outfit/ert/commander/inquisitor + +/datum/antagonist/ert/commander/inquisitor/on_gain() + . = ..() + owner.isholy = TRUE + +/datum/antagonist/ert/deathsquad/leader + name = "Deathsquad Officer" + outfit = /datum/outfit/death_commando + role = "Officer" /datum/antagonist/ert/create_team(datum/team/ert/new_team) if(istype(new_team)) @@ -52,37 +106,36 @@ var/mob/living/carbon/human/H = owner.current if(!istype(H)) return - var/outfit - switch(role) - if(ERT_LEADER) - outfit = high_alert ? /datum/outfit/ert/commander/alert : /datum/outfit/ert/commander - if(ERT_ENG) - outfit = high_alert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer - if(ERT_MED) - outfit = high_alert ? /datum/outfit/ert/medic/alert : /datum/outfit/ert/medic - if(ERT_SEC) - outfit = high_alert ? /datum/outfit/ert/security/alert : /datum/outfit/ert/security - if(DEATHSQUAD) - outfit = /datum/outfit/death_commando/officer - if(DEATHSQUAD_LEADER) - outfit = /datum/outfit/death_commando H.equipOutfit(outfit) /datum/antagonist/ert/greet() if(!ert_team) return - - var/leader = role == ERT_LEADER || role == DEATHSQUAD_LEADER - + to_chat(owner, "You are the [name].") - + var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division." if(leader) //If Squad Leader missiondesc += " Lead your squad to ensure the completion of the mission. Board the shuttle when your team is ready." else missiondesc += " Follow orders given to you by your squad leader." - if(role != DEATHSQUAD && role != DEATHSQUAD_LEADER) + missiondesc += "Avoid civilian casualites when possible." - + + missiondesc += "
Your Mission : [ert_team.mission.explanation_text]" + to_chat(owner,missiondesc) + +/datum/antagonist/ert/deathsquad/greet() + if(!ert_team) + return + + to_chat(owner, "You are the [name].") + + var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division." + if(leader) //If Squad Leader + missiondesc += " Lead your squad to ensure the completion of the mission. Board the shuttle when your team is ready." + else + missiondesc += " Follow orders given to you by your squad leader." + missiondesc += "
Your Mission : [ert_team.mission.explanation_text]" to_chat(owner,missiondesc) diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index 185bedba8f..aeca9c18bd 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -5,16 +5,12 @@ show_name_in_check_antagonists = TRUE /datum/antagonist/highlander/apply_innate_effects(mob/living/mob_override) - var/mob/living/carbon/human/H = owner.current || mob_override - if(!istype(H)) - return - H.dna.species.species_traits |= NOGUNS //nice try jackass + var/mob/living/L = owner.current || mob_override + L.add_trait(TRAIT_NOGUNS, "highlander") /datum/antagonist/highlander/remove_innate_effects(mob/living/mob_override) - var/mob/living/carbon/human/H = owner.current || mob_override - if(!istype(H)) - return - H.dna.species.species_traits &= ~NOGUNS + var/mob/living/L = owner.current || mob_override + L.remove_trait(TRAIT_NOGUNS, "highlander") /datum/antagonist/highlander/on_removal() owner.objectives -= objectives @@ -76,7 +72,7 @@ sword.admin_spawned = TRUE //To prevent announcing sword.pickup(H) //For the stun shielding H.put_in_hands(sword) - + var/obj/item/bloodcrawl/antiwelder = new(H) antiwelder.name = "compulsion of honor" diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm index 196adf5c22..9ce28eb60d 100644 --- a/code/modules/antagonists/monkey/monkey.dm +++ b/code/modules/antagonists/monkey/monkey.dm @@ -40,11 +40,10 @@ owner.special_role = null SSticker.mode.ape_infectees -= owner - var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.viruses + var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.diseases if(D) - D.remove_virus() qdel(D) - + . = ..() /datum/antagonist/monkey/create_team(datum/team/monkey/new_team) diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm index b55165e712..385c9c5f47 100644 --- a/code/modules/antagonists/ninja/ninja.dm +++ b/code/modules/antagonists/ninja/ninja.dm @@ -3,6 +3,7 @@ antagpanel_category = "Ninja" job_rank = ROLE_NINJA show_name_in_check_antagonists = TRUE + antag_moodlet = /datum/mood_event/focused var/helping_station = FALSE var/give_objectives = TRUE var/give_equipment = TRUE @@ -149,4 +150,4 @@ /datum/antagonist/ninja/proc/update_ninja_icons_removed(var/mob/living/carbon/human/ninja) var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA] ninjahud.leave_hud(ninja) - set_antag_hud(ninja, null) \ No newline at end of file + set_antag_hud(ninja, null) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index ce750e6a88..e7165fc136 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -3,6 +3,8 @@ #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. +GLOBAL_LIST_EMPTY(jam_on_wardec) + /obj/item/device/nuclear_challenge name = "Declaration of War (Challenge Mode)" icon_state = "gangtool-red" @@ -54,6 +56,9 @@ var/obj/item/circuitboard/computer/syndicate_shuttle/board = V board.challenge = TRUE + for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec) + D.jammed = TRUE + new /obj/item/device/radio/uplink/nuclear(get_turf(user), user.key, CHALLENGE_TELECRYSTALS) CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY)) SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1) diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 7b07b762c0..9b3fa4bed9 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -3,6 +3,7 @@ roundend_category = "syndicate operatives" //just in case antagpanel_category = "NukeOp" job_rank = ROLE_OPERATIVE + antag_moodlet = /datum/mood_event/focused var/datum/team/nuclear/nuke_team var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. @@ -136,7 +137,7 @@ to_chat(owner.current, "The nuclear authorization code is: [code]") else to_chat(admin, "No valid nuke found!") - + /datum/antagonist/nukeop/leader name = "Nuclear Operative Leader" nukeop_outfit = /datum/outfit/syndicate/leader @@ -366,4 +367,4 @@ return common_part + disk_report /datum/team/nuclear/is_gamemode_hero() - return SSticker.mode.name == "nuclear emergency" \ No newline at end of file + return SSticker.mode.name == "nuclear emergency" diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 1d694e4033..36ecef0925 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -4,6 +4,7 @@ //Admin-spawn or random event #define INVISIBILITY_REVENANT 50 +#define REVENANT_NAME_FILE "revenant_names.json" /mob/living/simple_animal/revenant name = "\a Revenant" @@ -70,6 +71,15 @@ AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null)) + random_revenant_name() + +/mob/living/simple_animal/revenant/proc/random_revenant_name() + var/built_name = "" + built_name += pick(strings(REVENANT_NAME_FILE, "spirit_type")) + built_name += " of " + built_name += pick(strings(REVENANT_NAME_FILE, "adverb")) + built_name += pick(strings(REVENANT_NAME_FILE, "theme")) + name = built_name /mob/living/simple_animal/revenant/Login() ..() diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index b83892dd46..f81371b504 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -354,12 +354,12 @@ if(H.dna && H.dna.species) H.dna.species.handle_hair(H,"#1d2953") //will be reset when blight is cured var/blightfound = FALSE - for(var/datum/disease/revblight/blight in H.viruses) + for(var/datum/disease/revblight/blight in H.diseases) blightfound = TRUE if(blight.stage < 5) blight.stage++ if(!blightfound) - H.AddDisease(new /datum/disease/revblight) + H.ForceContractDisease(new /datum/disease/revblight(), FALSE, TRUE) to_chat(H, "You feel [pick("suddenly sick", "a surge of nausea", "like your skin is wrong")].") else if(mob.reagents) diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 21bc534f27..7037ecae86 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -2,7 +2,7 @@ name = "Unnatural Wasting" max_stages = 5 stage_prob = 10 - spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS cure_text = "Holy water or extensive rest." spread_text = "A burst of unholy energy" cures = list("holywater") @@ -11,7 +11,7 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CURABLE permeability_mod = 1 - severity = VIRUS_SEVERITY_HARMFUL + severity = DISEASE_SEVERITY_HARMFUL var/stagedamage = 0 //Highest stage reached. var/finalstage = 0 //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects. diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index e708cb9254..eeeee03663 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -6,6 +6,7 @@ roundend_category = "revolutionaries" // if by some miracle revolutionaries without revolution happen antagpanel_category = "Revolution" job_rank = ROLE_REV + antag_moodlet = /datum/mood_event/revolution var/hud_type = "rev" var/datum/team/revolution/rev_team @@ -365,4 +366,4 @@ return common_part + heads_report /datum/team/revolution/is_gamemode_hero() - return SSticker.mode.name == "revolution" \ No newline at end of file + return SSticker.mode.name == "revolution" diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index e5fdc18f32..c6aaee9c2c 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -3,6 +3,7 @@ roundend_category = "traitors" antagpanel_category = "Traitor" job_rank = ROLE_TRAITOR + antag_moodlet = /datum/mood_event/focused var/should_specialise = TRUE //do we split into AI and human, set to true on inital assignment only var/ai_datum = /datum/antagonist/traitor/AI var/human_datum = /datum/antagonist/traitor/human @@ -11,7 +12,7 @@ var/give_objectives = TRUE var/should_give_codewords = TRUE - + /datum/antagonist/traitor/human show_in_antagpanel = FALSE @@ -343,7 +344,7 @@ var/static/icon/badass = icon('icons/badass.dmi', "badass") uplink_text += "[icon2html(badass, world)]" result += uplink_text - + result += objectives_text var/special_role_text = lowertext(name) @@ -361,4 +362,4 @@ The code responses were: [GLOB.syndicate_code_response]
" /datum/antagonist/traitor/is_gamemode_hero() - return SSticker.mode.name == "traitor" \ No newline at end of file + return SSticker.mode.name == "traitor" diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index c23d7fe5a5..ba89d2ed9f 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -3,6 +3,7 @@ roundend_category = "wizards/witches" antagpanel_category = "Wizard" job_rank = ROLE_WIZARD + antag_moodlet = /datum/mood_event/focused var/give_objectives = TRUE var/strip = TRUE //strip before equipping var/allow_rename = TRUE @@ -331,4 +332,4 @@ parts += "[master_wizard.owner.name] apprentices were:" parts += printplayerlist(members - master_wizard.owner) - return "
[parts.Join("
")]
" \ No newline at end of file + return "
[parts.Join("
")]
" diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index fb37c878a3..2ffe64f327 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -44,7 +44,7 @@ var/obj/item/bodypart/affecting = null if(ishuman(target)) var/mob/living/carbon/human/H = target - if(PIERCEIMMUNE in H.dna.species.species_traits) + if(H.has_trait(TRAIT_PIERCEIMMUNE)) playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) armed = 0 update_icon() diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 7c4ca2c85f..138a7a2607 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -98,11 +98,11 @@ var/list/new_overlay_types = tile_graphic() var/list/atmos_overlay_types = src.atmos_overlay_types // Cache for free performance - /*#if DM_VERSION >= 513 + #if DM_VERSION >= 513 #warning 512 is stable now for sure, remove the old code - #endif*/ + #endif - /*#if DM_VERSION >= 512 + #if DM_VERSION >= 512 if (atmos_overlay_types) for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added vars["vis_contents"] -= overlay @@ -112,7 +112,7 @@ vars["vis_contents"] += new_overlay_types - atmos_overlay_types //don't add overlays that already exist else vars["vis_contents"] += new_overlay_types - #else*/ + #else if (atmos_overlay_types) for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added cut_overlay(overlay) @@ -122,7 +122,7 @@ add_overlay(new_overlay_types - atmos_overlay_types) //don't add overlays that already exist else add_overlay(new_overlay_types) - //#endif + #endif UNSETEMPTY(new_overlay_types) src.atmos_overlay_types = new_overlay_types @@ -248,8 +248,11 @@ pressure_difference = difference /turf/open/proc/high_pressure_movements() - for(var/atom/movable/M in src) - M.experience_pressure_difference(pressure_difference, pressure_direction) + var/atom/movable/M + for(var/thing in src) + M = thing + if (!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired) + M.experience_pressure_difference(pressure_difference, pressure_direction) /atom/movable/var/pressure_resistance = 10 /atom/movable/var/last_high_pressure_movement_air_cycle = 0 @@ -258,17 +261,13 @@ var/const/PROBABILITY_OFFSET = 25 var/const/PROBABILITY_BASE_PRECENT = 75 set waitfor = 0 - . = FALSE - if (!anchored && !pulledby) - . = TRUE - if (last_high_pressure_movement_air_cycle < SSair.times_fired) - var/move_prob = 100 - if (pressure_resistance > 0) - move_prob = (pressure_difference/pressure_resistance*PROBABILITY_BASE_PRECENT)-PROBABILITY_OFFSET - move_prob += pressure_resistance_prob_delta - if (move_prob > PROBABILITY_OFFSET && prob(move_prob)) - step(src, direction) - last_high_pressure_movement_air_cycle = SSair.times_fired + var/move_prob = 100 + if (pressure_resistance > 0) + move_prob = (pressure_difference/pressure_resistance*PROBABILITY_BASE_PRECENT)-PROBABILITY_OFFSET + move_prob += pressure_resistance_prob_delta + if (move_prob > PROBABILITY_OFFSET && prob(move_prob)) + step(src, direction) + last_high_pressure_movement_air_cycle = SSair.times_fired ///////////////////////////EXCITED GROUPS///////////////////////////// diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index 1a9c76cb4d..5dfdcddbc7 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -62,7 +62,6 @@ It's like a regular ol' straight pipe, but you can turn it on and off. investigate_log("Valve, [src.name], was manipiulated by [key_name(usr)] at [x], [y], [z], [A]", "atmos") message_admins("Valve, [src.name], was manipulated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(T)], [A]") - /obj/machinery/atmospherics/components/binary/valve/digital // can be controlled by AI name = "digital valve" desc = "A digitally controlled valve." diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 608985981a..61681c0b38 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -136,7 +136,7 @@ merger.gases[spawn_id][MOLES] = (spawn_mol) merger.temperature = spawn_temp O.assume_air(merger) - O.air_update_turf() + O.air_update_turf(TRUE) /obj/machinery/atmospherics/miner/attack_ai(mob/living/silicon/user) if(broken) diff --git a/code/modules/atmospherics/machinery/other/zvent.dm b/code/modules/atmospherics/machinery/other/zvent.dm deleted file mode 100644 index d12c6196ec..0000000000 --- a/code/modules/atmospherics/machinery/other/zvent.dm +++ /dev/null @@ -1,36 +0,0 @@ -/obj/machinery/zvent - name = "interfloor air transfer system" - - icon = 'icons/obj/atmospherics/components/unary_devices.dmi' - icon_state = "vent_map" - density = FALSE - anchored=1 - desc = "This may be needed some day." - - var/on = FALSE - var/volume_rate = 800 - -/obj/machinery/zvent/New() - ..() - SSair.atmos_machinery += src - -/obj/machinery/zvent/Destroy() - SSair.atmos_machinery -= src - return ..() - -/obj/machinery/zvent/process_atmos() - - //all this object does, is make its turf share air with the ones above and below it, if they have a vent too. - if(isturf(loc)) //if we're not on a valid turf, forget it - for (var/new_z in list(-1,1)) //change this list if a fancier system of z-levels gets implemented - var/turf/open/zturf_conn = locate(x,y,z+new_z) - if (istype(zturf_conn)) - var/obj/machinery/zvent/zvent_conn= locate(/obj/machinery/zvent) in zturf_conn - if (istype(zvent_conn)) - //both floors have simulated turfs, share() - var/turf/open/myturf = loc - var/datum/gas_mixture/conn_air = zturf_conn.air //TODO: pop culture reference - var/datum/gas_mixture/my_air = myturf.air - if (istype(conn_air) && istype(my_air)) - my_air.share(conn_air) - air_update_turf() diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 56fe498603..20ec34e3a0 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -315,6 +315,16 @@ holding.forceMove(T) holding = null +/obj/machinery/portable_atmospherics/canister/replace_tank(mob/living/user, close_valve) + . = ..() + if(.) + if(close_valve) + valve_open = FALSE + update_icon() + investigate_log("Valve was closed by [key_name(user)].
", INVESTIGATE_ATMOS) + else if(valve_open && holding) + investigate_log("[key_name(user)] started a transfer into [holding].
", INVESTIGATE_ATMOS) + /obj/machinery/portable_atmospherics/canister/process_atmos() ..() if(stat & BROKEN) @@ -435,7 +445,7 @@ message_admins(msg) else logmsg = "Valve was closed by [key_name(usr)], stopping the transfer into \the [holding || "air"].
" - investigate_log(logmsg, "atmos") + investigate_log(logmsg, INVESTIGATE_ATMOS) release_log += logmsg . = TRUE if("timer") diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index a584c2ceef..10c5ab1f43 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -80,13 +80,38 @@ /obj/machinery/portable_atmospherics/portableConnectorReturnAir() return air_contents +/obj/machinery/portable_atmospherics/AltClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, !ismonkey(user))) + return + if(holding) + to_chat(user, "You remove [holding] from [src].") + replace_tank(user, TRUE) + +/obj/machinery/portable_atmospherics/examine(mob/user) + ..() + if(holding) + to_chat(user, "\The [src] contains [holding]. Alt-click [src] to remove it.") + +/obj/machinery/portable_atmospherics/proc/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank) + if(holding) + holding.forceMove(drop_location()) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(holding) + if(new_tank) + holding = new_tank + else + holding = null + update_icon() + return TRUE + /obj/machinery/portable_atmospherics/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/tank)) if(!(stat & BROKEN)) var/obj/item/tank/T = W - if(holding || !user.transferItemToLoc(T, src)) + if(!user.transferItemToLoc(T, src)) return - holding = T + to_chat(user, "[holding ? "In one smooth motion you pop [holding] out of [src]'s connector and replace it with [T]" : "You insert [T] into [src]"].") + replace_tank(user, FALSE, T) update_icon() else if(istype(W, /obj/item/wrench)) if(!(stat & BROKEN)) diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index e94492ad2d..798b555444 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -67,6 +67,16 @@ update_icon() ..() +/obj/machinery/portable_atmospherics/pump/replace_tank(mob/living/user, close_valve) + . = ..() + if(.) + if(close_valve) + if(on) + on = FALSE + update_icon() + else if(on && holding && direction == PUMP_OUT) + investigate_log("[key_name(user)] started a transfer into [holding].
", INVESTIGATE_ATMOS) + /obj/machinery/portable_atmospherics/pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) @@ -105,11 +115,15 @@ var/area/A = get_area(src) message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][ADMIN_JMP(src)]") log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][COORD(src)]") + else if(on && direction == PUMP_OUT) + investigate_log("[key_name(usr)] started a transfer into [holding].
", INVESTIGATE_ATMOS) . = TRUE if("direction") if(direction == PUMP_OUT) direction = PUMP_IN else + if(on && holding) + investigate_log("[key_name(usr)] started a transfer into [holding].
", INVESTIGATE_ATMOS) direction = PUMP_OUT . = TRUE if("pressure") diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index bfde6397b7..4fc3aaf55a 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -232,8 +232,8 @@ explosion(loc,-1,0,2, flame_range = 2) if(9) //Cold - var/datum/disease/D = new /datum/disease/cold - user.ForceContractDisease(D) + var/datum/disease/D = new /datum/disease/cold() + user.ForceContractDisease(D, FALSE, TRUE) if(10) //Nothing visible_message("[src] roll perfectly.") diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index a382af0bd8..59c8fa002f 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -77,7 +77,8 @@ data["supplies"][P.group]["packs"] += list(list( "name" = P.name, "cost" = P.cost, - "id" = pack + "id" = pack, + "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name. )) data["cart"] = list() diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 6c4d691d0f..d6b736ab31 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -57,8 +57,9 @@ continue // i'd be right happy to meme_pack_data[P.group]["packs"] += list(list( "name" = P.name, - "cost" = P.cost * 2, //displays twice the normal cost - "id" = pack + "cost" = P.cost, + "id" = pack, + "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name. )) /obj/machinery/computer/cargo/express/ui_interact(mob/living/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state. @@ -120,12 +121,12 @@ CHECK_TICK if(empty_turfs && empty_turfs.len) var/LZ = empty_turfs[rand(empty_turfs.len-1)] - SSshuttle.points -= SO.pack.cost * 2 + SSshuttle.points -= SO.pack.cost new /obj/effect/DPtarget(LZ, SO, podID) . = TRUE update_icon() else - if(SO.pack.cost * (1.2*MAX_EMAG_ROCKETS) <= SSshuttle.points) // bulk discount :^) + if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= SSshuttle.points) // bulk discount :^) landingzone = locate(pick(GLOB.the_station_areas)) in GLOB.sortedAreas for(var/turf/open/floor/T in landingzone.contents) if(is_blocked_turf(T)) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 4930b04c99..856e85ef0b 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -8,11 +8,13 @@ var/access_any = FALSE var/list/contains = null var/crate_name = "crate" + var/desc = ""//no desc by default var/crate_type = /obj/structure/closet/crate var/dangerous = FALSE // Should we message admins? var/special = FALSE //Event/Station Goals/Admin enabled packs var/special_enabled = FALSE var/DropPodOnly = FALSE//only usable by the Bluespace Drop Pod via the express cargo console + var/admin_spawned = FALSE /datum/supply_pack/proc/generate(turf/T) var/obj/structure/closet/crate/C = new crate_type(T) @@ -27,8 +29,13 @@ return C /datum/supply_pack/proc/fill(obj/structure/closet/crate/C) - for(var/item in contains) - new item(C) + if (admin_spawned) + for(var/item in contains) + var/atom/A = new item(C) + A.admin_spawned = TRUE + else + for(var/item in contains) + new item(C) ////////////////////////////////////////////////////////////////////////////// @@ -38,21 +45,9 @@ /datum/supply_pack/emergency group = "Emergency" -/datum/supply_pack/emergency/spacesuit - name = "Space Suit Crate" - cost = 3000 - access = ACCESS_EVA - contains = list(/obj/item/clothing/suit/space, - /obj/item/clothing/suit/space, - /obj/item/clothing/head/helmet/space, - /obj/item/clothing/head/helmet/space, - /obj/item/clothing/mask/breath, - /obj/item/clothing/mask/breath) - crate_name = "space suit crate" - crate_type = /obj/structure/closet/crate/secure - /datum/supply_pack/emergency/vehicle name = "Biker Gang Kit" //TUNNEL SNAKES OWN THIS TOWN + desc = "TUNNEL SNAKES OWN THIS TOWN. Contains an unbranded All Terrain Vehicle, and a complete gang outfit -- consists of black gloves, a menacing skull bandanna, and a SWEET leather overcoat!" cost = 2000 contraband = TRUE contains = list(/obj/vehicle/ridden/atv, @@ -64,8 +59,18 @@ crate_name = "Biker Kit" crate_type = /obj/structure/closet/crate/large +/datum/supply_pack/emergency/droneshells + name = "Drone Shell Crate" + desc = "The station's little helpers. Contains three Drone Shells." + cost = 1000 + contains = list(/obj/item/drone_shell, + /obj/item/drone_shell, + /obj/item/drone_shell) + crate_name = "drone shell crate" + /datum/supply_pack/emergency/equipment - name = "Emergency Equipment" + name = "Emergency Bot/Internals Crate" + desc = "Explosions got you down? These supplies are guaranteed to patch up holes, in stations and people alike! Comes with two floorbots, two medbots, five oxygen masks and five small oxygen tanks." cost = 3500 contains = list(/mob/living/simple_animal/bot/floorbot, /mob/living/simple_animal/bot/floorbot, @@ -84,26 +89,9 @@ crate_name = "emergency crate" crate_type = /obj/structure/closet/crate/internals -/datum/supply_pack/emergency/internals - name = "Internals Crate" - cost = 1000 - contains = list(/obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/gas, - /obj/item/clothing/mask/breath, - /obj/item/clothing/mask/breath, - /obj/item/clothing/mask/breath, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/air, - /obj/item/tank/internals/air, - /obj/item/tank/internals/air) - crate_name = "internals crate" - crate_type = /obj/structure/closet/crate/internals - /datum/supply_pack/emergency/firefighting name = "Firefighting Crate" + desc = "Only you can prevent station fires. Partner up with two firefighter suits, gas masks, flashlights, large oxygen tanks, extinguishers, and hardhats!" cost = 1000 contains = list(/obj/item/clothing/suit/fire/firefighter, /obj/item/clothing/suit/fire/firefighter, @@ -120,68 +108,43 @@ crate_name = "firefighting crate" /datum/supply_pack/emergency/atmostank - name = "Firefighting Watertank" + name = "Firefighting Tank Backpack" + desc = "Mow down fires with this high-capacity fire fighting tank backpack. Requires Atmospherics access to open." cost = 1000 access = ACCESS_ATMOSPHERICS contains = list(/obj/item/watertank/atmos) - crate_name = "firefighting watertank crate" + crate_name = "firefighting backpack crate" crate_type = /obj/structure/closet/crate/secure -/datum/supply_pack/emergency/radiation - name = "Radiation Protection Crate" +/datum/supply_pack/emergency/internals + name = "Internals Crate" + desc = "Master your life energy and control your breathing with three breath masks, three emergency oxygen tanks and three large air tanks."//IS THAT A cost = 1000 - contains = list(/obj/item/clothing/head/radiation, - /obj/item/clothing/head/radiation, - /obj/item/clothing/suit/radiation, - /obj/item/clothing/suit/radiation, - /obj/item/device/geiger_counter, - /obj/item/device/geiger_counter, - /obj/item/reagent_containers/food/drinks/bottle/vodka, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass) - crate_name = "radiation protection crate" - crate_type = /obj/structure/closet/crate/radiation - -/datum/supply_pack/emergency/weedcontrol - name = "Weed Control Crate" - cost = 1500 - access = ACCESS_HYDROPONICS - contains = list(/obj/item/scythe, + contains = list(/obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, - /obj/item/grenade/chem_grenade/antiweed, - /obj/item/grenade/chem_grenade/antiweed) - crate_name = "weed control crate" - crate_type = /obj/structure/closet/crate/secure/hydroponics + /obj/item/clothing/mask/gas, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/breath, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/air, + /obj/item/tank/internals/air, + /obj/item/tank/internals/air) + crate_name = "internals crate" + crate_type = /obj/structure/closet/crate/internals /datum/supply_pack/emergency/metalfoam name = "Metal Foam Grenade Crate" + desc = "Seal up those pesky hull breaches with 7 Metal Foam Grenades." cost = 1000 contains = list(/obj/item/storage/box/metalfoam) crate_name = "metal foam grenade crate" -/datum/supply_pack/emergency/droneshells - name = "Drone Shell Crate" - cost = 1000 - contains = list(/obj/item/drone_shell, - /obj/item/drone_shell, - /obj/item/drone_shell) - crate_name = "drone shell crate" - -/datum/supply_pack/emergency/specialops - name = "Special Ops Supplies" - hidden = TRUE - cost = 2000 - contains = list(/obj/item/storage/box/emps, - /obj/item/grenade/smokebomb, - /obj/item/grenade/smokebomb, - /obj/item/grenade/smokebomb, - /obj/item/pen/sleepy, - /obj/item/grenade/chem_grenade/incendiary) - crate_name = "emergency crate" - crate_type = /obj/structure/closet/crate/internals - /datum/supply_pack/emergency/syndicate name = "NULL_ENTRY" + desc = "(#@&^$THIS PACKAGE CONTAINS 30TC WORTH OF SOME RANDOM SYNDICATE GEAR WE HAD LYING AROUND THE WAREHOUSE. GIVE EM HELL, OPERATIVE@&!*() " hidden = TRUE cost = 20000 contains = list() @@ -204,6 +167,74 @@ crate_value -= I.cost new I.item(C) +/datum/supply_pack/emergency/plasmaman + name = "Plasmaman Supply Kit" + desc = "Keep those Plasmamen alive with two sets of Plasmaman outfits. Each set contains a plasmaman jumpsuit, internals tank, and helmet." + cost = 2000 + contains = list(/obj/item/clothing/under/plasmaman, + /obj/item/clothing/under/plasmaman, + /obj/item/tank/internals/plasmaman/belt/full, + /obj/item/tank/internals/plasmaman/belt/full, + /obj/item/clothing/head/helmet/space/plasmaman, + /obj/item/clothing/head/helmet/space/plasmaman) + crate_name = "plasmaman supply kit" + +/datum/supply_pack/emergency/radiation + name = "Radiation Protection Crate" + desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and geiger counter. We'll even throw in a bottle of vodka and some glasses too, considering the life-expectancy of people who order this." + cost = 1000 + contains = list(/obj/item/clothing/head/radiation, + /obj/item/clothing/head/radiation, + /obj/item/clothing/suit/radiation, + /obj/item/clothing/suit/radiation, + /obj/item/device/geiger_counter, + /obj/item/device/geiger_counter, + /obj/item/reagent_containers/food/drinks/bottle/vodka, + /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, + /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass) + crate_name = "radiation protection crate" + crate_type = /obj/structure/closet/crate/radiation + +/datum/supply_pack/emergency/spacesuit + name = "Space Suit Crate" + desc = "Contains two aging suits from Space-Goodwill. Requires EVA access to open." + cost = 3000 + access = ACCESS_EVA + contains = list(/obj/item/clothing/suit/space, + /obj/item/clothing/suit/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/breath) + crate_name = "space suit crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/emergency/specialops + name = "Special Ops Supplies" + desc = "(*!&@#TOO CHEAP FOR THAT NULL_ENTRY, HUH OPERATIVE? WELL, THIS LITTLE ORDER CAN STILL HELP YOU OUT IN A PINCH. CONTAINS A BOX OF FIVE EMP GRENADES, THREE SMOKEBOMBS, AN INCENDIARY GRENADE, AND A \"SLEEPY PEN\" FULL OF NICE TOXINS!#@*$" + hidden = TRUE + cost = 2000 + contains = list(/obj/item/storage/box/emps, + /obj/item/grenade/smokebomb, + /obj/item/grenade/smokebomb, + /obj/item/grenade/smokebomb, + /obj/item/pen/sleepy, + /obj/item/grenade/chem_grenade/incendiary) + crate_name = "emergency crate" + crate_type = /obj/structure/closet/crate/internals + +/datum/supply_pack/emergency/weedcontrol + name = "Weed Control Crate" + desc = "Keep those invasive species OUT. Contains a scythe, gasmask, and two anti-weed chemical grenades. Warrenty void if used on ambrosia. Requires Hydroponics access to open." + cost = 1500 + access = ACCESS_HYDROPONICS + contains = list(/obj/item/scythe, + /obj/item/clothing/mask/gas, + /obj/item/grenade/chem_grenade/antiweed, + /obj/item/grenade/chem_grenade/antiweed) + crate_name = "weed control crate" + crate_type = /obj/structure/closet/crate/secure/hydroponics + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Security //////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -213,66 +244,18 @@ access = ACCESS_SECURITY crate_type = /obj/structure/closet/crate/secure/gear -/datum/supply_pack/security/supplies - name = "Security Supplies Crate" - cost = 1000 - contains = list(/obj/item/storage/box/flashbangs, - /obj/item/storage/box/teargas, - /obj/item/storage/box/flashes, - /obj/item/storage/box/handcuffs) - crate_name = "security supply crate" - -/datum/supply_pack/security/helmets - name = "Helmets Crate" - cost = 1000 - contains = list(/obj/item/clothing/head/helmet/sec, - /obj/item/clothing/head/helmet/sec, - /obj/item/clothing/head/helmet/sec) - crate_name = "helmet crate" - /datum/supply_pack/security/armor name = "Armor Crate" + desc = "Three vests of well-rounded, decently-protective armor. Requires Security access to open." cost = 1000 contains = list(/obj/item/clothing/suit/armor/vest, /obj/item/clothing/suit/armor/vest, /obj/item/clothing/suit/armor/vest) crate_name = "armor crate" -/datum/supply_pack/security/baton - name = "Stun Batons Crate" - cost = 1000 - contains = list(/obj/item/melee/baton/loaded, - /obj/item/melee/baton/loaded, - /obj/item/melee/baton/loaded) - crate_name = "stun baton crate" - -/datum/supply_pack/security/wall_flash - name = "Wall-Mounted Flash Crate" - cost = 1000 - contains = list(/obj/item/storage/box/wall_flash, - /obj/item/storage/box/wall_flash, - /obj/item/storage/box/wall_flash, - /obj/item/storage/box/wall_flash) - crate_name = "wall-mounted flash crate" - -/datum/supply_pack/security/laser - name = "Lasers Crate" - cost = 2000 - contains = list(/obj/item/gun/energy/laser, - /obj/item/gun/energy/laser, - /obj/item/gun/energy/laser) - crate_name = "laser crate" - -/datum/supply_pack/security/taser - name = "Taser Crate" - cost = 3000 - contains = list(/obj/item/gun/energy/e_gun/advtaser, - /obj/item/gun/energy/e_gun/advtaser, - /obj/item/gun/energy/e_gun/advtaser) - crate_name = "taser crate" - /datum/supply_pack/security/disabler name = "Disabler Crate" + desc = "Three stamina-draining disabler weapons. Requires Security access to open." cost = 1500 contains = list(/obj/item/gun/energy/disabler, /obj/item/gun/energy/disabler, @@ -281,6 +264,7 @@ /datum/supply_pack/security/forensics name = "Forensics Crate" + desc = "Stay hot on the criminal's heels with Nanotrasen's Detective Essentials(tm). Contains a forensics scanner, six evidence bags, camera, tape recorder, white crayon, and of course, a fedora. Requires Security access to open." cost = 2000 contains = list(/obj/item/device/detective_scanner, /obj/item/storage/box/evidence, @@ -290,149 +274,27 @@ /obj/item/clothing/head/fedora/det_hat) crate_name = "forensics crate" -/datum/supply_pack/security/armory - access = ACCESS_ARMORY - crate_type = /obj/structure/closet/crate/secure/weapon +/datum/supply_pack/security/helmets + name = "Helmets Crate" + desc = "Contains three standard-issue brain buckets. Requires Security access to open." + cost = 1000 + contains = list(/obj/item/clothing/head/helmet/sec, + /obj/item/clothing/head/helmet/sec, + /obj/item/clothing/head/helmet/sec) + crate_name = "helmet crate" -/datum/supply_pack/security/armory/riothelmets - name = "Riot Helmets Crate" - cost = 1500 - contains = list(/obj/item/clothing/head/helmet/riot, - /obj/item/clothing/head/helmet/riot, - /obj/item/clothing/head/helmet/riot) - crate_name = "riot helmets crate" - -/datum/supply_pack/security/armory/riotarmor - name = "Riot Armor Crate" - cost = 1500 - contains = list(/obj/item/clothing/suit/armor/riot, - /obj/item/clothing/suit/armor/riot, - /obj/item/clothing/suit/armor/riot) - crate_name = "riot armor crate" - -/datum/supply_pack/security/armory/riotshields - name = "Riot Shields Crate" +/datum/supply_pack/security/laser + name = "Lasers Crate" + desc = "Contains three lethal, high-energy laser guns. Requires Security access to open." cost = 2000 - contains = list(/obj/item/shield/riot, - /obj/item/shield/riot, - /obj/item/shield/riot) - crate_name = "riot shields crate" - -/datum/supply_pack/security/armory/bulletarmor - name = "Bulletproof Armor Crate" - cost = 1500 - contains = list(/obj/item/clothing/suit/armor/bulletproof, - /obj/item/clothing/suit/armor/bulletproof, - /obj/item/clothing/suit/armor/bulletproof) - crate_name = "bulletproof armor crate" - -/datum/supply_pack/security/armory/swat - name = "SWAT Crate" - cost = 6000 - contains = list(/obj/item/clothing/head/helmet/swat/nanotrasen, - /obj/item/clothing/head/helmet/swat/nanotrasen, - /obj/item/clothing/suit/space/swat, - /obj/item/clothing/suit/space/swat, - /obj/item/clothing/mask/gas/sechailer/swat, - /obj/item/clothing/mask/gas/sechailer/swat, - /obj/item/storage/belt/military/assault, - /obj/item/storage/belt/military/assault, - /obj/item/clothing/gloves/combat, - /obj/item/clothing/gloves/combat) - crate_name = "swat crate" - -/datum/supply_pack/security/armory/combatknives - name = "Combat Knives Crate" - cost = 3000 - contains = list(/obj/item/kitchen/knife/combat, - /obj/item/kitchen/knife/combat, - /obj/item/kitchen/knife/combat) - crate_name = "combat knife crate" - -/datum/supply_pack/security/armory/laserarmor - name = "Reflector Vest Crate" - cost = 2000 - contains = list(/obj/item/clothing/suit/armor/laserproof, - /obj/item/clothing/suit/armor/laserproof) - crate_name = "reflector vest crate" - crate_type = /obj/structure/closet/crate/secure/plasma - -/datum/supply_pack/security/armory/ballistic - name = "Combat Shotguns Crate" - cost = 8000 - contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat, - /obj/item/gun/ballistic/shotgun/automatic/combat, - /obj/item/gun/ballistic/shotgun/automatic/combat, - /obj/item/storage/belt/bandolier, - /obj/item/storage/belt/bandolier, - /obj/item/storage/belt/bandolier) - crate_name = "combat shotguns crate" - -/datum/supply_pack/security/armory/energy - name = "Energy Guns Crate" - cost = 2500 - contains = list(/obj/item/gun/energy/e_gun, - /obj/item/gun/energy/e_gun) - crate_name = "energy gun crate" - crate_type = /obj/structure/closet/crate/secure/plasma - -/datum/supply_pack/security/armory/fire - name = "Incendiary Weapons Crate" - cost = 1500 - access = ACCESS_HEADS - contains = list(/obj/item/flamethrower/full, - /obj/item/tank/internals/plasma, - /obj/item/tank/internals/plasma, - /obj/item/tank/internals/plasma, - /obj/item/grenade/chem_grenade/incendiary, - /obj/item/grenade/chem_grenade/incendiary, - /obj/item/grenade/chem_grenade/incendiary) - crate_name = "incendiary weapons crate" - crate_type = /obj/structure/closet/crate/secure/plasma - dangerous = TRUE - -/datum/supply_pack/security/armory/wt550 - name = "WT-550 Auto Rifle Crate" - cost = 3500 - contains = list(/obj/item/gun/ballistic/automatic/wt550, - /obj/item/gun/ballistic/automatic/wt550) - crate_name = "auto rifle crate" - -/datum/supply_pack/security/armory/wt550ammo - name = "WT-550 Auto Rifle Ammo Crate" - cost = 3000 - contains = list(/obj/item/ammo_box/magazine/wt550m9, - /obj/item/ammo_box/magazine/wt550m9, - /obj/item/ammo_box/magazine/wt550m9, - /obj/item/ammo_box/magazine/wt550m9) - crate_name = "auto rifle ammo crate" - -/datum/supply_pack/security/armory/mindshield - name = "mindshield implants Crate" - cost = 4000 - contains = list(/obj/item/storage/lockbox/loyalty) - crate_name = "mindshield implant crate" - -/datum/supply_pack/security/armory/trackingimp - name = "Tracking Implants Crate" - cost = 2000 - contains = list(/obj/item/storage/box/trackimp) - crate_name = "tracking implant crate" - -/datum/supply_pack/security/armory/chemimp - name = "Chemical Implants Crate" - cost = 2000 - contains = list(/obj/item/storage/box/chemimp) - crate_name = "chemical implant crate" - -/datum/supply_pack/security/armory/exileimp - name = "Exile Implants Crate" - cost = 3000 - contains = list(/obj/item/storage/box/exileimp) - crate_name = "exile implant crate" + contains = list(/obj/item/gun/energy/laser, + /obj/item/gun/energy/laser, + /obj/item/gun/energy/laser) + crate_name = "laser crate" /datum/supply_pack/security/securitybarriers - name = "Security Barriers Crate" + name = "Security Barrier Grenades" + desc = "Stem the tide with four Security Barrier grenades. Requires Security access to open." contains = list(/obj/item/grenade/barrier, /obj/item/grenade/barrier, /obj/item/grenade/barrier, @@ -440,15 +302,9 @@ cost = 2000 crate_name = "security barriers crate" -/datum/supply_pack/security/firingpins - name = "Standard Firing Pins Crate" - cost = 2000 - contains = list(/obj/item/storage/box/firingpins, - /obj/item/storage/box/firingpins) - crate_name = "firing pins crate" - /datum/supply_pack/security/securityclothes name = "Security Clothing Crate" + desc = "Contains appropriate outfits for the station's private security force. Contains outfits for the Warden, Head of Security, and two Security Officers. Each outfit comes with a rank-appropriate jumpsuit, suit, and beret. Requires Security access to open." cost = 3000 contains = list(/obj/item/clothing/under/rank/security/navyblue, /obj/item/clothing/under/rank/security/navyblue, @@ -464,14 +320,225 @@ /obj/item/clothing/head/beret/sec/navyhos) crate_name = "security clothing crate" +/datum/supply_pack/security/supplies + name = "Security Supplies Crate" + desc = "Contains seven flashbangs, seven teargas grenades, six flashes, and seven handcuffs. Requires Security access to open." + cost = 1000 + contains = list(/obj/item/storage/box/flashbangs, + /obj/item/storage/box/teargas, + /obj/item/storage/box/flashes, + /obj/item/storage/box/handcuffs) + crate_name = "security supply crate" + +/datum/supply_pack/security/firingpins + name = "Standard Firing Pins Crate" + desc = "Upgrade your arsenal with 10 standard firing pins. Requires Security access to open." + cost = 2000 + contains = list(/obj/item/storage/box/firingpins, + /obj/item/storage/box/firingpins) + crate_name = "firing pins crate" + /datum/supply_pack/security/justiceinbound name = "Standard Justice Enforcer Crate" + desc = "This is it. The Bee's Knees. The Creme of the Crop. The Pick of the Litter. The best of the best of the best. The Crown Jewel of Nanotrasen. The Alpha and the Omega of security headwear. Guaranteed to strike fear into the hearts of each and every criminal aboard the station. Also comes with a security gasmask. Requires Security access to open." cost = 6000 //justice comes at a price. An expensive, noisy price. contraband = TRUE contains = list(/obj/item/clothing/head/helmet/justice, /obj/item/clothing/mask/gas/sechailer) crate_name = "security clothing crate" +/datum/supply_pack/security/baton + name = "Stun Batons Crate" + desc = "Arm the Civil Protection Forces with three stun batons. Batteries included. Requires Security access to open." + cost = 1000 + contains = list(/obj/item/melee/baton/loaded, + /obj/item/melee/baton/loaded, + /obj/item/melee/baton/loaded) + crate_name = "stun baton crate" + +/datum/supply_pack/security/taser + name = "Taser Crate" + desc = "From the depths of stunbased combat, this order rises above, supreme. Contains three hybrid tasers, capable of firing both electrodes and disabling shots. Requires Security access to open." + cost = 3000 + contains = list(/obj/item/gun/energy/e_gun/advtaser, + /obj/item/gun/energy/e_gun/advtaser, + /obj/item/gun/energy/e_gun/advtaser) + crate_name = "taser crate" + +/datum/supply_pack/security/wall_flash + name = "Wall-Mounted Flash Crate" + desc = "Contains four wall-mounted flashes. Requires Security access to open." + cost = 1000 + contains = list(/obj/item/storage/box/wall_flash, + /obj/item/storage/box/wall_flash, + /obj/item/storage/box/wall_flash, + /obj/item/storage/box/wall_flash) + crate_name = "wall-mounted flash crate" + +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Armory ////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/security/armory + group = "Armory" + access = ACCESS_ARMORY + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/security/armory/bulletarmor + name = "Bulletproof Armor Crate" + desc = "Contains three sets of bulletproof armor. Guaranteed to reduce a bullet's stopping power by over half. Requires Armory access to open." + cost = 1500 + contains = list(/obj/item/clothing/suit/armor/bulletproof, + /obj/item/clothing/suit/armor/bulletproof, + /obj/item/clothing/suit/armor/bulletproof) + crate_name = "bulletproof armor crate" + +/datum/supply_pack/security/armory/combatknives + name = "Combat Knives Crate" + desc = "Contains three sharpened combat knives. Each knife guaranteed to fit snugly inside any Nanotrasen-standard boot. Requires Armory access to open." + cost = 3000 + contains = list(/obj/item/kitchen/knife/combat, + /obj/item/kitchen/knife/combat, + /obj/item/kitchen/knife/combat) + crate_name = "combat knife crate" + +/datum/supply_pack/security/armory/ballistic + name = "Combat Shotguns Crate" + desc = "For when the enemy absolutely needs to be replaced with lead. Contains three Aussec-designed Combat Shotguns, and three Shotgun Bandoliers. Requires Armory access to open." + cost = 8000 + contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat, + /obj/item/gun/ballistic/shotgun/automatic/combat, + /obj/item/gun/ballistic/shotgun/automatic/combat, + /obj/item/storage/belt/bandolier, + /obj/item/storage/belt/bandolier, + /obj/item/storage/belt/bandolier) + crate_name = "combat shotguns crate" + +/datum/supply_pack/security/armory/energy + name = "Energy Guns Crate" + desc = "Contains two Energy Guns, capable of firing both nonlethal and lethal blasts of light. Requires Armory access to open." + cost = 2500 + contains = list(/obj/item/gun/energy/e_gun, + /obj/item/gun/energy/e_gun) + crate_name = "energy gun crate" + crate_type = /obj/structure/closet/crate/secure/plasma + +/datum/supply_pack/security/armory/chemimp + name = "Chemical Implants Crate" + desc = "Contains five Remote Chemical implants. Requires Armory access to open." + cost = 2000 + contains = list(/obj/item/storage/box/chemimp) + crate_name = "chemical implant crate" + +/datum/supply_pack/security/armory/exileimp + name = "Exile Implants Crate" + desc = "Contains five Exile implants. Requires Armory access to open." + cost = 3000 + contains = list(/obj/item/storage/box/exileimp) + crate_name = "exile implant crate" + +/datum/supply_pack/security/armory/mindshield + name = "Mindshield Implants Crate" + desc = "Prevent against radical thoughts with three Mindshield implants. Requires Armory access to open." + cost = 4000 + contains = list(/obj/item/storage/lockbox/loyalty) + crate_name = "mindshield implant crate" + +/datum/supply_pack/security/armory/trackingimp + name = "Tracking Implants Crate" + desc = "Contains four tracking implants. Requires Armory access to open." + cost = 2000 + contains = list(/obj/item/storage/box/trackimp) + crate_name = "tracking implant crate" + +/datum/supply_pack/security/armory/fire + name = "Incendiary Weapons Crate" + desc = "Burn, baby burn. Contains three incendiary grenades, three plasma canisters, and a flamethrower. Requires Armory access to open." + cost = 1500 + access = ACCESS_HEADS + contains = list(/obj/item/flamethrower/full, + /obj/item/tank/internals/plasma, + /obj/item/tank/internals/plasma, + /obj/item/tank/internals/plasma, + /obj/item/grenade/chem_grenade/incendiary, + /obj/item/grenade/chem_grenade/incendiary, + /obj/item/grenade/chem_grenade/incendiary) + crate_name = "incendiary weapons crate" + crate_type = /obj/structure/closet/crate/secure/plasma + dangerous = TRUE + +/datum/supply_pack/security/armory/laserarmor + name = "Reflector Vest Crate" + desc = "Contains two vests of highly reflective material. Each armor peice diffuses a laser's energy by over half, as well as offering a good chance to reflect the laser entirely. Requires Armory access to open." + cost = 2000 + contains = list(/obj/item/clothing/suit/armor/laserproof, + /obj/item/clothing/suit/armor/laserproof) + crate_name = "reflector vest crate" + crate_type = /obj/structure/closet/crate/secure/plasma + +/datum/supply_pack/security/armory/riotarmor + name = "Riot Armor Crate" + desc = "Contains three sets of heavy body armor. Advanced padding protects against close-ranged weaponry, making melee attacks feel only half as potent to the user. Requires Armory access to open." + cost = 1500 + contains = list(/obj/item/clothing/suit/armor/riot, + /obj/item/clothing/suit/armor/riot, + /obj/item/clothing/suit/armor/riot) + crate_name = "riot armor crate" + +/datum/supply_pack/security/armory/riothelmets + name = "Riot Helmets Crate" + desc = "Contains three riot helmets. Requires Armory access to open." + cost = 1500 + contains = list(/obj/item/clothing/head/helmet/riot, + /obj/item/clothing/head/helmet/riot, + /obj/item/clothing/head/helmet/riot) + crate_name = "riot helmets crate" + +/datum/supply_pack/security/armory/riotshields + name = "Riot Shields Crate" + desc = "For when the greytide gets really uppity. Contains three riot shields. Requires Armory access to open." + cost = 2000 + contains = list(/obj/item/shield/riot, + /obj/item/shield/riot, + /obj/item/shield/riot) + crate_name = "riot shields crate" + +/datum/supply_pack/security/armory/swat + name = "SWAT Crate" + desc = "Contains two fullbody sets of tough, fireproof, pressurized suits designed in a joint effort by IS-ERI and Nanotrasen. Each set contains a suit, helmet, mask, combat belt, and combat gloves. Requires Armory access to open." + cost = 6000 + contains = list(/obj/item/clothing/head/helmet/swat/nanotrasen, + /obj/item/clothing/head/helmet/swat/nanotrasen, + /obj/item/clothing/suit/space/swat, + /obj/item/clothing/suit/space/swat, + /obj/item/clothing/mask/gas/sechailer/swat, + /obj/item/clothing/mask/gas/sechailer/swat, + /obj/item/storage/belt/military/assault, + /obj/item/storage/belt/military/assault, + /obj/item/clothing/gloves/combat, + /obj/item/clothing/gloves/combat) + crate_name = "swat crate" + + +/datum/supply_pack/security/armory/wt550 + name = "WT-550 Auto Rifle Crate" + desc = "Contains two high-powered, semiautomatic rifles chambered in 4.6x30mm. Requires Armory access to open." + cost = 3500 + contains = list(/obj/item/gun/ballistic/automatic/wt550, + /obj/item/gun/ballistic/automatic/wt550) + crate_name = "auto rifle crate" + +/datum/supply_pack/security/armory/wt550ammo + name = "WT-550 Auto Rifle Ammo Crate" + desc = "Contains four 20-round magazines for the WT-550 Auto Rifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." + cost = 3000 + contains = list(/obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9) + crate_name = "auto rifle ammo crate" + + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Engineering ///////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -480,83 +547,17 @@ group = "Engineering" crate_type = /obj/structure/closet/crate/engineering -/datum/supply_pack/engineering/fueltank - name = "Fuel Tank Crate" - cost = 800 - contains = list(/obj/structure/reagent_dispensers/fueltank) - crate_name = "fuel tank crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/engineering/oxygen - name = "Oxygen Canister" - cost = 1500 - contains = list(/obj/machinery/portable_atmospherics/canister/oxygen) - crate_name = "oxygen canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/engineering/nitrogen - name = "Nitrogen Canister" - cost = 2000 - contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen) - crate_name = "nitrogen canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/engineering/carbon_dio - name = "Carbon Dioxide Canister" - cost = 3000 - contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide) - crate_name = "carbon dioxide canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/science/nitrous_oxide_canister - name = "Nitrous Oxide Canister" - cost = 3000 - access = ACCESS_ATMOSPHERICS - contains = list(/obj/machinery/portable_atmospherics/canister/nitrous_oxide) - crate_name = "nitrous oxide canister crate" - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/engineering/tools - name = "Toolbox Crate" - contains = list(/obj/item/storage/toolbox/electrical, - /obj/item/storage/toolbox/electrical, - /obj/item/storage/toolbox/mechanical, - /obj/item/storage/toolbox/electrical, - /obj/item/storage/toolbox/mechanical, - /obj/item/storage/toolbox/mechanical) - cost = 1000 - crate_name = "toolbox crate" - -/datum/supply_pack/engineering/powergamermitts - name = "Insulated Gloves Crate" - cost = 2000 //Made of pure-grade bullshittinium - contains = list(/obj/item/clothing/gloves/color/yellow, - /obj/item/clothing/gloves/color/yellow, - /obj/item/clothing/gloves/color/yellow) - crate_name = "insulated gloves crate" - -/datum/supply_pack/engineering/power - name = "Powercell Crate" - cost = 1000 - contains = list(/obj/item/stock_parts/cell/high, - /obj/item/stock_parts/cell/high, - /obj/item/stock_parts/cell/high) - crate_name = "electrical maintenance crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - -/obj/item/stock_parts/cell/inducer_supply - maxcharge = 5000 - charge = 5000 - -/datum/supply_pack/engineering/inducers - name = "NT-75 Electromagnetic Power Inducers Crate" - cost = 2000 - contains = list(/obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}, /obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}) //FALSE doesn't work in modified type paths apparently. - crate_name = "inducer crate" - crate_type = /obj/structure/closet/crate/engineering/electrical +/datum/supply_pack/engineering/shieldgen + name = "Anti-breach Shield Projector Crate" + desc = "Hull breaches again? Say no more with the Nanotrasen Anti-Breach Shield Projector! Uses forcefield technology to keep the air in, and the space out. Contains two shield projectors." + cost = 2500 + contains = list(/obj/machinery/shieldgen, + /obj/machinery/shieldgen) + crate_name = "anti-breach shield projector crate" /datum/supply_pack/engineering/engiequipment name = "Engineering Gear Crate" + desc = "Gear up with three toolbelts, high-visibility vests, welding helmets, hardhats, and two pairs of meson goggles!" cost = 1300 contains = list(/obj/item/storage/belt/utility, /obj/item/storage/belt/utility, @@ -574,16 +575,120 @@ /obj/item/clothing/glasses/meson/engine) crate_name = "engineering gear crate" +/datum/supply_pack/engineering/powergamermitts + name = "Insulated Gloves Crate" + desc = "The backbone of modern society. Barely ever ordered for actual engineering. Contains three insulated gloves." + cost = 2000 //Made of pure-grade bullshittinium + contains = list(/obj/item/clothing/gloves/color/yellow, + /obj/item/clothing/gloves/color/yellow, + /obj/item/clothing/gloves/color/yellow) + crate_name = "insulated gloves crate" -/datum/supply_pack/engineering/shieldgen - name = "Anti-breach Shield Projector Crate" +/obj/item/stock_parts/cell/inducer_supply//what is this doing here + maxcharge = 5000 + charge = 5000 + +/datum/supply_pack/engineering/inducers + name = "NT-75 Electromagnetic Power Inducers Crate" + desc = "No rechargers? No problem, with the NT-75 EPI, you can recharge any standard cell-based equipment anytime, anywhere. Contains two Inducers." + cost = 2000 + contains = list(/obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}, /obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}) //FALSE doesn't work in modified type paths apparently. + crate_name = "inducer crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + +/datum/supply_pack/engineering/pacman + name = "P.A.C.M.A.N Generator Crate" + desc = "Engineers can't set up the engine? Not an issue for you, once you get your hands on this P.A.C.M.A.N. Generator! Takes in plasma and spits out sweet sweet energy." cost = 2500 - contains = list(/obj/machinery/shieldgen, - /obj/machinery/shieldgen) - crate_name = "anti-breach shield projector crate" + contains = list(/obj/machinery/power/port_gen/pacman) + crate_name = "PACMAN generator crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + +/datum/supply_pack/engineering/power + name = "Power Cell Crate" + desc = "Looking for power overwhelming? Look no further. Contains three high-voltage power cells." + cost = 1000 + contains = list(/obj/item/stock_parts/cell/high, + /obj/item/stock_parts/cell/high, + /obj/item/stock_parts/cell/high) + crate_name = "power cell crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + +/datum/supply_pack/engineering/shuttle_engine + name = "Shuttle Engine Crate" + desc = "Through advanced bluespace-shenanigins, our engineers have managed to fit an entire shuttle engine into one tiny little crate. Requires CE access to open." + cost = 5000 + access = ACCESS_CE + contains = list(/obj/structure/shuttle/engine/propulsion/burst/cargo) + crate_name = "shuttle engine crate" + crate_type = /obj/structure/closet/crate/secure/engineering + special = TRUE + +/datum/supply_pack/engineering/tools + name = "Toolbox Crate" + desc = "Any robust spaceman is never far from their trusty toolbox. Contains three electrical toolboxes and three mechanical toolboxes." + contains = list(/obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/electrical, + /obj/item/storage/toolbox/mechanical, + /obj/item/storage/toolbox/mechanical, + /obj/item/storage/toolbox/mechanical) + cost = 1000 + crate_name = "toolbox crate" + +/datum/supply_pack/engineering/engine/am_jar + name = "Antimatter Containment Jar Crate" + desc = "Two Antimatter containment jars stuffed into a single crate." + cost = 2000 + contains = list(/obj/item/am_containment, + /obj/item/am_containment) + crate_name = "antimatter jar crate" + +/datum/supply_pack/engineering/engine/am_core + name = "Antimatter Control Crate" + desc = "The brains of the Antimatter engine, this device is sure to teach the station's powergrid the true meaning of real power." + cost = 5000 + contains = list(/obj/machinery/power/am_control_unit) + crate_name = "antimatter control crate" + +/datum/supply_pack/engineering/engine/am_shielding + name = "Antimatter Shielding Crate" + desc = "Contains ten Antimatter shields, somehow crammed into a crate." + cost = 2000 + contains = list(/obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container) //10 shields: 3x3 containment and a core + crate_name = "antimatter shielding crate" + +/datum/supply_pack/engineering/engine + name = "Emitter Crate" + desc = "Useful for powering forcefield generators while destroying locked crates and intruders alike. Contains two high-powered energy emitters. Requires CE access to open." + cost = 1500 + access = ACCESS_CE + contains = list(/obj/machinery/power/emitter, + /obj/machinery/power/emitter) + crate_name = "emitter crate" + crate_type = /obj/structure/closet/crate/secure/engineering + dangerous = TRUE + +/datum/supply_pack/engineering/engine/field_gen + name = "Field Generator Crate" + desc = "Typically the only thing standing between the station and a messy death. Powered by emitters. Contains two field generators." + cost = 1500 + contains = list(/obj/machinery/field/generator, + /obj/machinery/field/generator) + crate_name = "field generator crate" /datum/supply_pack/engineering/grounding_rods name = "Grounding Rod Crate" + desc = "Four grounding rods guaranteed to keep any uppity tesla's lightning under control." cost = 1700 contains = list(/obj/machinery/power/grounding_rod, /obj/machinery/power/grounding_rod, @@ -592,15 +697,38 @@ crate_name = "grounding rod crate" crate_type = /obj/structure/closet/crate/engineering/electrical -/datum/supply_pack/engineering/pacman - name = "P.A.C.M.A.N Generator Crate" +/datum/supply_pack/engineering/engine/PA + name = "Particle Accelerator Crate" + desc = "A supermassive black hole or hyper-powered teslaball are the perfect way to spice up any party! This \"My First Apocalypse\" kit contains everything you need to build your own Particle Accelerator! Ages 10 and up." + cost = 3000 + contains = list(/obj/structure/particle_accelerator/fuel_chamber, + /obj/machinery/particle_accelerator/control_box, + /obj/structure/particle_accelerator/particle_emitter/center, + /obj/structure/particle_accelerator/particle_emitter/left, + /obj/structure/particle_accelerator/particle_emitter/right, + /obj/structure/particle_accelerator/power_box, + /obj/structure/particle_accelerator/end_cap) + crate_name = "particle accelerator crate" + +/datum/supply_pack/engineering/engine/collector + name = "Radiation Collector Crate" + desc = "Contains three radiation collectors. Useful for collecting energy off nearby Supermatter Crystals, Singularities or Teslas!" cost = 2500 - contains = list(/obj/machinery/power/port_gen/pacman) - crate_name = "PACMAN generator crate" - crate_type = /obj/structure/closet/crate/engineering/electrical + contains = list(/obj/machinery/power/rad_collector, + /obj/machinery/power/rad_collector, + /obj/machinery/power/rad_collector) + crate_name = "collector crate" + +/datum/supply_pack/engineering/engine/sing_gen + name = "Singularity Generator Crate" + desc = "The key to unlocking the power of Lord Singuloth. Particle Accelerator not included." + cost = 5000 + contains = list(/obj/machinery/the_singularitygen) + crate_name = "singularity generator crate" /datum/supply_pack/engineering/solar name = "Solar Panel Crate" + desc = "Go green with this DIY advanced solar array. Contains twenty one solar assemblies, a solar-control circuit board, and tracker. If you have any questions, please check out the enclosed instruction book." cost = 2000 contains = list(/obj/item/solar_assembly, /obj/item/solar_assembly, @@ -629,57 +757,9 @@ crate_name = "solar panel crate" crate_type = /obj/structure/closet/crate/engineering/electrical -/datum/supply_pack/engineering/engine - name = "Emitter Crate" - cost = 1500 - access = ACCESS_CE - contains = list(/obj/machinery/power/emitter, - /obj/machinery/power/emitter) - crate_name = "emitter crate" - crate_type = /obj/structure/closet/crate/secure/engineering - dangerous = TRUE - -/datum/supply_pack/engineering/engine/field_gen - name = "Field Generator Crate" - cost = 1500 - contains = list(/obj/machinery/field/generator, - /obj/machinery/field/generator) - crate_name = "field generator crate" - -/datum/supply_pack/engineering/engine/sing_gen - name = "Singularity Generator Crate" - cost = 5000 - contains = list(/obj/machinery/the_singularitygen) - crate_name = "singularity generator crate" - -/datum/supply_pack/engineering/engine/tesla_gen - name = "Tesla Generator Crate" - cost = 5000 - contains = list(/obj/machinery/the_singularitygen/tesla) - crate_name = "tesla generator crate" - -/datum/supply_pack/engineering/engine/collector - name = "Collector Crate" - cost = 2500 - contains = list(/obj/machinery/power/rad_collector, - /obj/machinery/power/rad_collector, - /obj/machinery/power/rad_collector) - crate_name = "collector crate" - -/datum/supply_pack/engineering/engine/PA - name = "Particle Accelerator Crate" - cost = 3000 - contains = list(/obj/structure/particle_accelerator/fuel_chamber, - /obj/machinery/particle_accelerator/control_box, - /obj/structure/particle_accelerator/particle_emitter/center, - /obj/structure/particle_accelerator/particle_emitter/left, - /obj/structure/particle_accelerator/particle_emitter/right, - /obj/structure/particle_accelerator/power_box, - /obj/structure/particle_accelerator/end_cap) - crate_name = "particle accelerator crate" - /datum/supply_pack/engineering/engine/supermatter_shard name = "Supermatter Shard Crate" + desc = "The power of the heavens condensed into a single crystal. Requires CE access to open." cost = 10000 access = ACCESS_CE contains = list(/obj/machinery/power/supermatter_shard) @@ -687,42 +767,211 @@ crate_type = /obj/structure/closet/crate/secure/engineering dangerous = TRUE -/datum/supply_pack/engineering/engine/am_shielding - name = "Antimatter Shielding Crate" - cost = 2000 - contains = list(/obj/item/device/am_shielding_container, - /obj/item/device/am_shielding_container, - /obj/item/device/am_shielding_container, - /obj/item/device/am_shielding_container, - /obj/item/device/am_shielding_container, - /obj/item/device/am_shielding_container, - /obj/item/device/am_shielding_container, - /obj/item/device/am_shielding_container, - /obj/item/device/am_shielding_container, - /obj/item/device/am_shielding_container)//10 shields: 3x3 containment and a core - crate_name = "antimatter shielding crate" - -/datum/supply_pack/engineering/engine/am_core - name = "Antimatter Control Crate" +/datum/supply_pack/engineering/engine/tesla_gen + name = "Tesla Generator Crate" + desc = "The key to unlocking the power of the Tesla energy ball. Particle Accelerator not included." cost = 5000 - contains = list(/obj/machinery/power/am_control_unit) - crate_name = "antimatter control crate" + contains = list(/obj/machinery/the_singularitygen/tesla) + crate_name = "tesla generator crate" -/datum/supply_pack/engineering/engine/am_jar - name = "Antimatter Containment Jar Crate" - cost = 2000 - contains = list(/obj/item/am_containment, - /obj/item/am_containment) - crate_name = "antimatter jar crate" - -/datum/supply_pack/engineering/shuttle_engine - name = "Shuttle Engine Crate" - cost = 5000 - access = ACCESS_CE - contains = list(/obj/structure/shuttle/engine/propulsion/burst/cargo) - crate_name = "shuttle engine crate" - crate_type = /obj/structure/closet/crate/secure/engineering +/datum/supply_pack/engineering/bsa + name = "Bluespace Artillery Parts" + desc = "The pride of Nanotrasen Naval Command. The legendary Bluespace Artillery Cannon is a devastating feat of human engineering and testament to wartime determination. Highly advanced research is required for proper construction. " + cost = 15000 special = TRUE + contains = list(/obj/item/circuitboard/machine/bsa/front, + /obj/item/circuitboard/machine/bsa/middle, + /obj/item/circuitboard/machine/bsa/back, + /obj/item/circuitboard/computer/bsa_control + ) + crate_name= "bluespace artillery parts crate" + +/datum/supply_pack/engineering/dna_vault + name = "DNA Vault Parts" + desc = "Secure the longevity of the current state of humanity within this massive library of scientific knowledge, capable of granting superhuman powers and abilities. Highly advanced research is required for proper construction. Also contains five DNA probes." + cost = 12000 + special = TRUE + contains = list( + /obj/item/circuitboard/machine/dna_vault, + /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 + ) + crate_name= "dna vault parts crate" + +/datum/supply_pack/engineering/dna_probes + name = "DNA Vault Samplers" + desc = "Contains five DNA probes for use in the DNA vault." + cost = 3000 + 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 + ) + crate_name= "dna samplers crate" + + +/datum/supply_pack/engineering/shield_sat + name = "Shield Generator Satellite" + desc = "Protect the very existence of this station with these Anti-Meteor defenses. Contains three Shield Generator Satellites." + cost = 3000 + special = TRUE + contains = list( + /obj/machinery/satellite/meteor_shield, + /obj/machinery/satellite/meteor_shield, + /obj/machinery/satellite/meteor_shield + ) + crate_name= "shield sat crate" + + +/datum/supply_pack/engineering/shield_sat_control + name = "Shield System Control Board" + desc = "A control system for the Shield Generator Satellite system." + cost = 5000 + special = TRUE + contains = list(/obj/item/circuitboard/computer/sat_control) + crate_name= "shield control board crate" + +////////////////////////////////////////////////////////////////////////////// +//////////////////////// Canisters & Materials//////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/materials + group = "Canisters & Materials" + +/datum/supply_pack/materials/cardboard50 + name = "50 Cardboard Sheets" + desc = "Create a bunch of boxes." + cost = 1000 + contains = list(/obj/item/stack/sheet/cardboard/fifty) + crate_name = "cardboard sheets crate" + +/datum/supply_pack/materials/glass50 + name = "50 Glass Sheets" + desc = "Let some nice light in with fifty glass sheets!" + cost = 1000 + contains = list(/obj/item/stack/sheet/glass/fifty) + crate_name = "glass sheets crate" + +/datum/supply_pack/materials/metal50 + name = "50 Metal Sheets" + desc = "Any construction project begins with a good stack of fifty metal sheets!" + cost = 1000 + contains = list(/obj/item/stack/sheet/metal/fifty) + crate_name = "metal sheets crate" + +/datum/supply_pack/materials/plasteel20 + name = "20 Plasteel Sheets" + desc = "Reinforce the station's integrity with twenty plasteel sheets!" + cost = 7500 + contains = list(/obj/item/stack/sheet/plasteel/twenty) + crate_name = "plasteel sheets crate" + +/datum/supply_pack/materials/plasteel50 + name = "50 Plasteel Sheets" + desc = "For when you REALLY have to reinforce something." + cost = 16500 + contains = list(/obj/item/stack/sheet/plasteel/fifty) + crate_name = "plasteel sheets crate" + +/datum/supply_pack/materials/plastic50 + name = "50 Plastic Sheets" + desc = "Build a limitless amount of toys with fifty plastic sheets!" + cost = 1000 + contains = list(/obj/item/stack/sheet/plastic/fifty) + crate_name = "plastic sheets crate" + +/datum/supply_pack/materials/sandstone30 + name = "30 Sandstone Blocks" + desc = "Neither sandy nor stoney, these thirty blocks will still get the job done." + cost = 1000 + contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty) + crate_name = "sandstone blocks crate" + +/datum/supply_pack/materials/wood50 + name = "50 Wood Planks" + desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!" + cost = 2000 + contains = list(/obj/item/stack/sheet/mineral/wood/fifty) + crate_name = "wood planks crate" + +/datum/supply_pack/materials/bz + name = "BZ Canister Crate" + desc = "Contains a canister of BZ. Requires Toxins access to open." + cost = 4000 + access = ACCESS_TOX_STORAGE + contains = list(/obj/machinery/portable_atmospherics/canister/bz) + crate_name = "BZ canister crate" + crate_type = /obj/structure/closet/crate/secure/science + +/datum/supply_pack/materials/carbon_dio + name = "Carbon Dioxide Canister" + desc = "Contains a canister of Carbon Dioxide." + cost = 3000 + contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide) + crate_name = "carbon dioxide canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/nitrogen + name = "Nitrogen Canister" + desc = "Contains a canister of Nitrogen." + cost = 2000 + contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen) + crate_name = "nitrogen canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/nitrous_oxide_canister + name = "Nitrous Oxide Canister" + desc = "Contains a canister of Nitrous Oxide. Requires Atmospherics access to open." + cost = 3000 + access = ACCESS_ATMOSPHERICS + contains = list(/obj/machinery/portable_atmospherics/canister/nitrous_oxide) + crate_name = "nitrous oxide canister crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/materials/oxygen + name = "Oxygen Canister" + desc = "Contains a canister of Oxygen. Canned in Druidia." + cost = 1500 + contains = list(/obj/machinery/portable_atmospherics/canister/oxygen) + crate_name = "oxygen canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/water_vapor + name = "Water Vapor Canister" + desc = "Contains a canister of Water Vapor. I swear to god if you open this in the halls..." + cost = 2500 + contains = list(/obj/machinery/portable_atmospherics/canister/water_vapor) + crate_name = "water vapor canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/fueltank + name = "Fuel Tank Crate" + desc = "Contains a welding fuel tank. Caution, highly flammable." + cost = 800 + contains = list(/obj/structure/reagent_dispensers/fueltank) + crate_name = "fuel tank crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/watertank + name = "Water Tank Crate" + desc = "Contains a tank of dihydrogen monoxide... sounds dangerous." + cost = 600 + contains = list(/obj/structure/reagent_dispensers/watertank) + crate_name = "water tank crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/hightank + name = "Large Water Tank Crate" + desc = "Contains a high-capacity water tank. Useful for botany or other service jobs." + cost = 1200 + contains = list(/obj/structure/reagent_dispensers/watertank/high) + crate_name = "high-capacity water tank crate" + crate_type = /obj/structure/closet/crate/large ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Medical ///////////////////////////////////////// @@ -732,8 +981,86 @@ group = "Medical" crate_type = /obj/structure/closet/crate/medical + +/datum/supply_pack/medical/firstaidbruises + name = "Bruise Treatment Kit Crate" + desc = "Contains three first aid kits focused on healing bruises and broken bones." + cost = 1000 + contains = list(/obj/item/storage/firstaid/brute, + /obj/item/storage/firstaid/brute, + /obj/item/storage/firstaid/brute) + crate_name = "brute treatment kit crate" + +/datum/supply_pack/medical/firstaidburns + name = "Burn Treatment Kit Crate" + desc = "Contains three first aid kits focused on healing severe burns." + cost = 1000 + contains = list(/obj/item/storage/firstaid/fire, + /obj/item/storage/firstaid/fire, + /obj/item/storage/firstaid/fire) + crate_name = "burn treatment kit crate" + +/datum/supply_pack/medical/firstaid + name = "First Aid Kit Crate" + desc = "Contains four first aid kits for healing most types of wounds." + cost = 1000 + contains = list(/obj/item/storage/firstaid/regular, + /obj/item/storage/firstaid/regular, + /obj/item/storage/firstaid/regular, + /obj/item/storage/firstaid/regular) + crate_name = "first aid kit crate" + +/datum/supply_pack/medical/firstaidoxygen + name = "Oxygen Deprivation Kit Crate" + desc = "Contains three first aid kits focused on helping oxygen deprivation victims." + cost = 1000 + contains = list(/obj/item/storage/firstaid/o2, + /obj/item/storage/firstaid/o2, + /obj/item/storage/firstaid/o2) + crate_name = "oxygen deprivation kit crate" + +/datum/supply_pack/medical/firstaidtoxins + name = "Toxin Treatment Kit Crate" + desc = "Contains three first aid kits focused on healing damage dealt by heavy toxins." + cost = 1000 + contains = list(/obj/item/storage/firstaid/toxin, + /obj/item/storage/firstaid/toxin, + /obj/item/storage/firstaid/toxin) + crate_name = "toxin treatment kit crate" + +/datum/supply_pack/medical/bloodpacks + name = "Blood Pack Variety Crate" + desc = "Contains eight different blood packs for reintroducing blood to patients." + cost = 3500 + contains = list(/obj/item/reagent_containers/blood, + /obj/item/reagent_containers/blood, + /obj/item/reagent_containers/blood/APlus, + /obj/item/reagent_containers/blood/AMinus, + /obj/item/reagent_containers/blood/BPlus, + /obj/item/reagent_containers/blood/BMinus, + /obj/item/reagent_containers/blood/OPlus, + /obj/item/reagent_containers/blood/OMinus) + crate_name = "blood freezer" + crate_type = /obj/structure/closet/crate/freezer + +/datum/supply_pack/medical/defibs + name = "Defibrillator Crate" + desc = "Contains two defibrillators for bringing the recently-deceased back to life." + cost = 2500 + contains = list(/obj/item/defibrillator/loaded, + /obj/item/defibrillator/loaded) + crate_name = "defibrillator crate" + +/datum/supply_pack/medical/iv_drip + name = "IV Drip Crate" + desc = "Contains a single IV drip for administering blood to patients." + cost = 1000 + contains = list(/obj/machinery/iv_drip) + crate_name = "iv drip crate" + /datum/supply_pack/medical/supplies name = "Medical Supplies Crate" + desc = "Contains seven beakers, syringes, and bodybags. Six morphine bottles, four insulin pills. Two charcoal bottles, epinephrine bottles, antitoxin bottles, and large beakers. Finally, a single roll of medical gauze. German doctor not included." cost = 2000 contains = list(/obj/item/reagent_containers/glass/bottle/charcoal, /obj/item/reagent_containers/glass/bottle/charcoal, @@ -755,53 +1082,23 @@ /obj/item/reagent_containers/pill/insulin, /obj/item/stack/medical/gauze, /obj/item/storage/box/beakers, + /obj/item/storage/box/medsprays, /obj/item/storage/box/syringes, - /obj/item/storage/box/bodybags) + /obj/item/storage/box/bodybags) crate_name = "medical supplies crate" -/datum/supply_pack/medical/firstaid - name = "First Aid Kit Crate" - cost = 1000 - contains = list(/obj/item/storage/firstaid/regular, - /obj/item/storage/firstaid/regular, - /obj/item/storage/firstaid/regular, - /obj/item/storage/firstaid/regular) - crate_name = "first aid kit crate" - -/datum/supply_pack/medical/firstaidbruises - name = "Bruise Treatment Kit Crate" - cost = 1000 - contains = list(/obj/item/storage/firstaid/brute, - /obj/item/storage/firstaid/brute, - /obj/item/storage/firstaid/brute) - crate_name = "brute treatment kit crate" - -/datum/supply_pack/medical/firstaidburns - name = "Burn Treatment Kit Crate" - cost = 1000 - contains = list(/obj/item/storage/firstaid/fire, - /obj/item/storage/firstaid/fire, - /obj/item/storage/firstaid/fire) - crate_name = "burn treatment kit crate" - -/datum/supply_pack/medical/firstaidtoxins - name = "Toxin Treatment Kit Crate" - cost = 1000 - contains = list(/obj/item/storage/firstaid/toxin, - /obj/item/storage/firstaid/toxin, - /obj/item/storage/firstaid/toxin) - crate_name = "toxin treatment kit crate" - -/datum/supply_pack/medical/firstaidoxygen - name = "Oxygen Deprivation Kit Crate" - cost = 1000 - contains = list(/obj/item/storage/firstaid/o2, - /obj/item/storage/firstaid/o2, - /obj/item/storage/firstaid/o2) - crate_name = "oxygen deprivation kit crate" +/datum/supply_pack/medical/vending + name = "Medical Vending Crate" + desc = "Contains refills for medical vending machines." + cost = 2000 + contains = list(/obj/item/vending_refill/medical, + /obj/item/vending_refill/medical, + /obj/item/vending_refill/medical) + crate_name = "medical vending crate" /datum/supply_pack/medical/virus name = "Virus Crate" + desc = "Contains twelve different bottles, each filled with a different chemical compound, each useful for virology. Also includes seven beakers and syringes. Balled-up jeans not included. Requires CMO access to open." cost = 2500 access = ACCESS_CMO contains = list(/obj/item/reagent_containers/glass/bottle/flu_virion, @@ -822,41 +1119,6 @@ crate_type = /obj/structure/closet/crate/secure/plasma dangerous = TRUE -/datum/supply_pack/medical/bloodpacks - name = "Blood Pack Variety Crate" - cost = 3500 - contains = list(/obj/item/reagent_containers/blood, - /obj/item/reagent_containers/blood, - /obj/item/reagent_containers/blood/APlus, - /obj/item/reagent_containers/blood/AMinus, - /obj/item/reagent_containers/blood/BPlus, - /obj/item/reagent_containers/blood/BMinus, - /obj/item/reagent_containers/blood/OPlus, - /obj/item/reagent_containers/blood/OMinus) - crate_name = "blood freezer" - crate_type = /obj/structure/closet/crate/freezer - -/datum/supply_pack/medical/iv_drip - name = "IV Drip Crate" - cost = 1000 - contains = list(/obj/machinery/iv_drip) - crate_name = "iv drip crate" - -/datum/supply_pack/medical/defibs - name = "Defibrillator Crate" - cost = 2500 - contains = list(/obj/item/defibrillator/loaded, - /obj/item/defibrillator/loaded) - crate_name = "defibrillator crate" - -/datum/supply_pack/medical/vending - name = "Medical Vending Crate" - cost = 2000 - contains = list(/obj/item/vending_refill/medical, - /obj/item/vending_refill/medical, - /obj/item/vending_refill/medical) - crate_name = "medical vending crate" - ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Science ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -865,30 +1127,19 @@ group = "Science" crate_type = /obj/structure/closet/crate/science -/datum/supply_pack/science/bz - name = "BZ canister" - cost = 4000 - access = ACCESS_TOX_STORAGE - contains = list(/obj/machinery/portable_atmospherics/canister/bz) - crate_name = "BZ canister crate" - crate_type = /obj/structure/closet/crate/secure/science - -/datum/supply_pack/science/robotics - name = "Robotics Assembly Crate" - cost = 1000 +/datum/supply_pack/science/robotics/mecha_odysseus + name = "Circuit Crate (Odysseus)" + desc = "Ever wanted to build your own giant medical robot? Well now you can! Contains the Odysseus main control board and Odysseus peripherals board. Requires Robotics access to open." + cost = 2500 access = ACCESS_ROBOTICS - contains = list(/obj/item/device/assembly/prox_sensor, - /obj/item/device/assembly/prox_sensor, - /obj/item/device/assembly/prox_sensor, - /obj/item/storage/toolbox/electrical, - /obj/item/storage/box/flashes, - /obj/item/stock_parts/cell/high, - /obj/item/stock_parts/cell/high) - crate_name = "robotics assembly crate" + contains = list(/obj/item/circuitboard/mecha/odysseus/peripherals, + /obj/item/circuitboard/mecha/odysseus/main) + crate_name = "\improper Odysseus circuit crate" crate_type = /obj/structure/closet/crate/secure/science /datum/supply_pack/science/robotics/mecha_ripley name = "Circuit Crate (Ripley APLU)" + desc = "Rip apart rocks and xenomorphs alike with the Ripley APLU. Contains the Main Ripley control board, as well as the Ripley Peripherals board. Requires Robotics access to open." cost = 3000 access = ACCESS_ROBOTICS contains = list(/obj/item/book/manual/ripley_build_and_repair, @@ -897,17 +1148,9 @@ crate_name = "\improper APLU Ripley circuit crate" crate_type = /obj/structure/closet/crate/secure/science -/datum/supply_pack/science/robotics/mecha_odysseus - name = "Circuit Crate (Odysseus)" - cost = 2500 - access = ACCESS_ROBOTICS - contains = list(/obj/item/circuitboard/mecha/odysseus/peripherals, - /obj/item/circuitboard/mecha/odysseus/main) - crate_name = "\improper Odysseus circuit crate" - crate_type = /obj/structure/closet/crate/secure/science - /datum/supply_pack/science/plasma name = "Plasma Assembly Crate" + desc = "Everything you need to burn something to the ground, this contains three plasma assembly sets. Each set contains a plasma tank, igniter, proximity sensor, and timer! Warranty void if exposed to high temperatures. Requires Toxins access to open." cost = 1000 access = ACCESS_TOX_STORAGE contains = list(/obj/item/tank/internals/plasma, @@ -925,8 +1168,24 @@ crate_name = "plasma assembly crate" crate_type = /obj/structure/closet/crate/secure/plasma +/datum/supply_pack/science/robotics + name = "Robotics Assembly Crate" + desc = "The tools you need to replace those finicky humans with a loyal robot army! Contains three proximity sensors, two high-powered cells, six flashes, and an electrical toolbox. Requires Robotics access to open." + cost = 1000 + access = ACCESS_ROBOTICS + contains = list(/obj/item/device/assembly/prox_sensor, + /obj/item/device/assembly/prox_sensor, + /obj/item/device/assembly/prox_sensor, + /obj/item/storage/toolbox/electrical, + /obj/item/storage/box/flashes, + /obj/item/stock_parts/cell/high, + /obj/item/stock_parts/cell/high) + crate_name = "robotics assembly crate" + crate_type = /obj/structure/closet/crate/secure/science + /datum/supply_pack/science/shieldwalls - name = "Shield Generators" + name = "Shield Generator Crate" + desc = "These high powered Shield Wall Generators are guaranteed to keep any unwanted lifeforms on the outside, where they belong! Contains four shield wall generators. Requires Teleporter access to open." cost = 2000 access = ACCESS_TELEPORTER contains = list(/obj/machinery/shieldwallgen, @@ -936,18 +1195,9 @@ crate_name = "shield generators crate" crate_type = /obj/structure/closet/crate/secure/science -/datum/supply_pack/science/transfer_valves - name = "Tank Transfer Valves Crate" - cost = 6000 - access = ACCESS_RD - contains = list(/obj/item/device/transfer_valve, - /obj/item/device/transfer_valve) - crate_name = "tank transfer valves crate" - crate_type = /obj/structure/closet/crate/secure/science - dangerous = TRUE - /datum/supply_pack/science/tablets name = "Tablet Crate" + desc = "What's a computer? Contains five cargo tablets." cost = 5000 contains = list(/obj/item/device/modular_computer/tablet/preset/cargo, /obj/item/device/modular_computer/tablet/preset/cargo, @@ -956,6 +1206,17 @@ /obj/item/device/modular_computer/tablet/preset/cargo) crate_name = "tablet crate" +/datum/supply_pack/science/transfer_valves + name = "Tank Transfer Valves Crate" + desc = "The key ingredient for making a lot of people very angry very fast. Contains two tank transfer valves. Requires RD access to open." + cost = 6000 + access = ACCESS_RD + contains = list(/obj/item/device/transfer_valve, + /obj/item/device/transfer_valve) + crate_name = "tank transfer valves crate" + crate_type = /obj/structure/closet/crate/secure/science + dangerous = TRUE + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Organic ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -964,8 +1225,19 @@ group = "Food & Livestock" crate_type = /obj/structure/closet/crate/freezer +/datum/supply_pack/organic/hydroponics/beekeeping_suits + name = "Beekeeper Suit Crate" + desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear." + cost = 1000 + contains = list(/obj/item/clothing/head/beekeeper_head, + /obj/item/clothing/suit/beekeeper_suit, + /obj/item/clothing/head/beekeeper_head, + /obj/item/clothing/suit/beekeeper_suit) + crate_name = "beekeeper suits" + /datum/supply_pack/organic/food name = "Food Crate" + desc = "Get things cooking with this crate full of useful ingredients! Contains a dozen eggs, three bananas, and some flour, rice, milk, soymilk, salt, pepper, enzyme, sugar, and monkeymeat." cost = 1000 contains = list(/obj/item/reagent_containers/food/condiment/flour, /obj/item/reagent_containers/food/condiment/rice, @@ -982,8 +1254,88 @@ /obj/item/reagent_containers/food/snacks/grown/banana) crate_name = "food crate" +/datum/supply_pack/organic/hydroponics/beekeeping_fullkit + name = "Beekeeping Starter Crate" + desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit and helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!" + cost = 1500 + contains = list(/obj/structure/beebox, + /obj/item/honey_frame, + /obj/item/honey_frame, + /obj/item/honey_frame, + /obj/item/queen_bee/bought, + /obj/item/clothing/head/beekeeper_head, + /obj/item/clothing/suit/beekeeper_suit, + /obj/item/melee/flyswatter) + crate_name = "beekeeping starter crate" + +/datum/supply_pack/organic/cream_piee + name = "High-yield Clown-grade Cream Pie Crate" + desc = "Designed by Aussec's Advanced Warfare Research Division, these high-yield, Clown-grade cream pies are powered by a synergy of performance and efficiency. Guaranteed to provide maximum results." + cost = 6000 + contains = list(/obj/item/storage/backpack/duffelbag/clown/cream_pie) + crate_name = "party equipment crate" + contraband = TRUE + access = ACCESS_THEATRE + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/organic/hydroponics + name = "Hydroponics Crate" + desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron." + cost = 1500 + contains = list(/obj/item/reagent_containers/spray/plantbgone, + /obj/item/reagent_containers/spray/plantbgone, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/reagent_containers/glass/bottle/ammonia, + /obj/item/hatchet, + /obj/item/cultivator, + /obj/item/device/plant_analyzer, + /obj/item/clothing/gloves/botanic_leather, + /obj/item/clothing/suit/apron) + crate_name = "hydroponics crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/organic/hydroponics/hydrotank + name = "Hydroponics Backpack Crate" + desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open." + cost = 1000 + access = ACCESS_HYDROPONICS + contains = list(/obj/item/watertank) + crate_name = "hydroponics backpack crate" + crate_type = /obj/structure/closet/crate/secure + +/datum/supply_pack/organic/monkey + name = "Monkey Cube Crate" + desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!" + cost = 2000 + contains = list (/obj/item/storage/box/monkeycubes) + crate_name = "monkey cube crate" + +/datum/supply_pack/organic/party + name = "Party Equipment" + desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, and a bottle of patron, goldschlager, and shaker!" + cost = 2000 + contains = list(/obj/item/storage/box/drinkingglasses, + /obj/item/reagent_containers/food/drinks/shaker, + /obj/item/reagent_containers/food/drinks/bottle/patron, + /obj/item/reagent_containers/food/drinks/bottle/goldschlager, + /obj/item/reagent_containers/food/drinks/ale, + /obj/item/reagent_containers/food/drinks/ale, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/reagent_containers/food/drinks/beer, + /obj/item/device/flashlight/glowstick, + /obj/item/device/flashlight/glowstick/red, + /obj/item/device/flashlight/glowstick/blue, + /obj/item/device/flashlight/glowstick/cyan, + /obj/item/device/flashlight/glowstick/orange, + /obj/item/device/flashlight/glowstick/yellow, + /obj/item/device/flashlight/glowstick/pink) + crate_name = "party equipment crate" + /datum/supply_pack/organic/pizza name = "Pizza Crate" + desc = "Best prices on this side of the galaxy. All deliveries are guaranteed to be 99% anomaly-free!" cost = 6000 // Best prices this side of the galaxy. contains = list(/obj/item/pizzabox/margherita, /obj/item/pizzabox/mushroom, @@ -1015,164 +1367,9 @@ considered \[REDACTED\] and returned at your leisure. Note that objects the anomaly produces are specifically attuned exactly to the individual opening the anomaly; regardless \ of species, the individual will find the object edible and it will taste great according to their personal definitions, which vary significantly based on person and species.") -/datum/supply_pack/organic/cream_piee - name = "High-yield Clown-grade Cream Pie Crate" - cost = 6000 - contains = list(/obj/item/storage/backpack/duffelbag/clown/cream_pie) - crate_name = "party equipment crate" - contraband = TRUE - access = ACCESS_THEATRE - crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/organic/monkey - name = "Monkey Crate" - cost = 2000 - contains = list (/obj/item/storage/box/monkeycubes) - crate_name = "monkey crate" - -/datum/supply_pack/organic/party - name = "Party Equipment" - cost = 2000 - contains = list(/obj/item/storage/box/drinkingglasses, - /obj/item/reagent_containers/food/drinks/shaker, - /obj/item/reagent_containers/food/drinks/bottle/patron, - /obj/item/reagent_containers/food/drinks/bottle/goldschlager, - /obj/item/reagent_containers/food/drinks/ale, - /obj/item/reagent_containers/food/drinks/ale, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/reagent_containers/food/drinks/beer, - /obj/item/device/flashlight/glowstick, - /obj/item/device/flashlight/glowstick/red, - /obj/item/device/flashlight/glowstick/blue, - /obj/item/device/flashlight/glowstick/cyan, - /obj/item/device/flashlight/glowstick/orange, - /obj/item/device/flashlight/glowstick/yellow, - /obj/item/device/flashlight/glowstick/pink) - crate_name = "party equipment crate" - -/datum/supply_pack/organic/critter - crate_type = /obj/structure/closet/crate/critter - -/datum/supply_pack/organic/critter/cow - name = "Cow Crate" - cost = 3000 - contains = list(/mob/living/simple_animal/cow) - crate_name = "cow crate" - -/datum/supply_pack/organic/critter/goat - name = "Goat Crate" - cost = 2500 - contains = list(/mob/living/simple_animal/hostile/retaliate/goat) - crate_name = "goat crate" - -/datum/supply_pack/organic/critter/snake - name = "Snake Crate" - cost = 3000 - contains = list(/mob/living/simple_animal/hostile/retaliate/poison/snake, - /mob/living/simple_animal/hostile/retaliate/poison/snake, - /mob/living/simple_animal/hostile/retaliate/poison/snake) - crate_name = "snake crate" - -/datum/supply_pack/organic/critter/chick - name = "Chicken Crate" - cost = 2000 - contains = list( /mob/living/simple_animal/chick) - crate_name = "chicken crate" - -/datum/supply_pack/organic/critter/corgi - name = "Corgi Crate" - cost = 5000 - contains = list(/mob/living/simple_animal/pet/dog/corgi, - /obj/item/clothing/neck/petcollar) - crate_name = "corgi crate" - -/datum/supply_pack/organic/critter/corgi/generate() - . = ..() - if(prob(50)) - var/mob/living/simple_animal/pet/dog/corgi/D = locate() in . - qdel(D) - new /mob/living/simple_animal/pet/dog/corgi/Lisa(.) - -/datum/supply_pack/organic/critter/cat - name = "Cat Crate" - cost = 5000 //Cats are worth as much as corgis. - contains = list(/mob/living/simple_animal/pet/cat, - /obj/item/clothing/neck/petcollar, - /obj/item/toy/cattoy) - crate_name = "cat crate" - -/datum/supply_pack/organic/critter/cat/generate() - . = ..() - if(prob(50)) - var/mob/living/simple_animal/pet/cat/C = locate() in . - qdel(C) - new /mob/living/simple_animal/pet/cat/Proc(.) - -/datum/supply_pack/organic/critter/pug - name = "Pug Crate" - cost = 5000 - contains = list(/mob/living/simple_animal/pet/dog/pug, - /obj/item/clothing/neck/petcollar) - crate_name = "pug crate" - -/datum/supply_pack/organic/critter/fox - name = "Fox Crate" - cost = 5000 - contains = list(/mob/living/simple_animal/pet/fox, - /obj/item/clothing/neck/petcollar) - crate_name = "fox crate" - -/datum/supply_pack/organic/critter/butterfly - name = "Butterflies Crate" - contraband = TRUE - cost = 5000 - contains = list(/mob/living/simple_animal/butterfly) - crate_name = "entomology samples crate" - -/datum/supply_pack/organic/critter/butterfly/generate() - . = ..() - for(var/i in 1 to 49) - new /mob/living/simple_animal/butterfly(.) - -/datum/supply_pack/organic/critter/crab - name = "Crab Rocket" - cost = 5000 - contains = list(/mob/living/simple_animal/crab) - crate_name = "look sir free crabs" - DropPodOnly = TRUE - -/datum/supply_pack/organic/critter/crab/generate() - . = ..() - for(var/i in 1 to 49) - new /mob/living/simple_animal/crab(.) - -/datum/supply_pack/organic/hydroponics - name = "Hydroponics Crate" - cost = 1500 - contains = list(/obj/item/reagent_containers/spray/plantbgone, - /obj/item/reagent_containers/spray/plantbgone, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/reagent_containers/glass/bottle/ammonia, - /obj/item/hatchet, - /obj/item/cultivator, - /obj/item/device/plant_analyzer, - /obj/item/clothing/gloves/botanic_leather, - /obj/item/clothing/suit/apron) - crate_name = "hydroponics crate" - crate_type = /obj/structure/closet/crate/hydroponics - -/datum/supply_pack/organic/hydroponics/hydrotank - name = "Hydroponics Backpack Crate" - cost = 1000 - access = ACCESS_HYDROPONICS - contains = list(/obj/item/watertank) - crate_name = "hydroponics backpack crate" - crate_type = /obj/structure/closet/crate/secure - /datum/supply_pack/organic/potted_plants name = "Potted Plants Crate" + desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown." cost = 700 contains = list(/obj/item/twohanded/required/kirbyplants/random, /obj/item/twohanded/required/kirbyplants/random, @@ -1184,6 +1381,7 @@ /datum/supply_pack/organic/hydroponics/seeds name = "Seeds Crate" + desc = "Big things have small beginnings. Contains thirteen different seeds." cost = 1000 contains = list(/obj/item/seeds/chili, /obj/item/seeds/berry, @@ -1202,6 +1400,7 @@ /datum/supply_pack/organic/hydroponics/exoticseeds name = "Exotic Seeds Crate" + desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!" cost = 1500 contains = list(/obj/item/seeds/nettle, /obj/item/seeds/replicapod, @@ -1217,30 +1416,115 @@ /obj/item/seeds/random) crate_name = "exotic seeds crate" -/datum/supply_pack/organic/hydroponics/beekeeping_fullkit - name = "Beekeeping Starter Crate" - cost = 1500 - contains = list(/obj/structure/beebox, - /obj/item/honey_frame, - /obj/item/honey_frame, - /obj/item/honey_frame, - /obj/item/queen_bee/bought, - /obj/item/clothing/head/beekeeper_head, - /obj/item/clothing/suit/beekeeper_suit, - /obj/item/melee/flyswatter) - crate_name = "beekeeping starter crate" +/datum/supply_pack/organic/critter + crate_type = /obj/structure/closet/crate/critter -/datum/supply_pack/organic/hydroponics/beekeeping_suits - name = "Beekeeper Suit Crate" - cost = 1000 - contains = list(/obj/item/clothing/head/beekeeper_head, - /obj/item/clothing/suit/beekeeper_suit, - /obj/item/clothing/head/beekeeper_head, - /obj/item/clothing/suit/beekeeper_suit) - crate_name = "beekeeper suits" +/datum/supply_pack/organic/critter/butterfly + name = "Butterflies Crate" + desc = "Not a very dangerous insect, but they do give off a better image than, say, flies or cockroaches."//is that a motherfucking worm reference + contraband = TRUE + cost = 5000 + contains = list(/mob/living/simple_animal/butterfly) + crate_name = "entomology samples crate" + +/datum/supply_pack/organic/critter/butterfly/generate() + . = ..() + for(var/i in 1 to 49) + new /mob/living/simple_animal/butterfly(.) + +/datum/supply_pack/organic/critter/cat + name = "Cat Crate" + desc = "The cat goes meow! Comes with a collar and a nice cat toy! Cheeseburger not included."//i can't believe im making this reference + cost = 5000 //Cats are worth as much as corgis. + contains = list(/mob/living/simple_animal/pet/cat, + /obj/item/clothing/neck/petcollar, + /obj/item/toy/cattoy) + crate_name = "cat crate" + +/datum/supply_pack/organic/critter/cat/generate() + . = ..() + if(prob(50)) + var/mob/living/simple_animal/pet/cat/C = locate() in . + qdel(C) + new /mob/living/simple_animal/pet/cat/Proc(.) + +/datum/supply_pack/organic/critter/chick + name = "Chicken Crate" + desc = "The chicken goes bwaak!" + cost = 2000 + contains = list( /mob/living/simple_animal/chick) + crate_name = "chicken crate" + +/datum/supply_pack/organic/critter/crab + name = "Crab Rocket" + desc = "CRAAAAAAB ROCKET. CRAB ROCKET. CRAB ROCKET. CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB ROCKET. CRAFT. ROCKET. BUY. CRAFT ROCKET. CRAB ROOOCKET. CRAB ROOOOCKET. CRAB CRAB CRAB CRAB CRAB CRAB CRAB CRAB ROOOOOOOOOOOOOOOOOOOOOOCK EEEEEEEEEEEEEEEEEEEEEEEEE EEEETTTTTTTTTTTTAAAAAAAAA AAAHHHHHHHHHHHHH. CRAB ROCKET. CRAAAB ROCKEEEEEEEEEGGGGHHHHTT CRAB CRAB CRAABROCKET CRAB ROCKEEEET."//fun fact: i actually spent like 10 minutes and transcribed the entire video. + cost = 5000 + contains = list(/mob/living/simple_animal/crab) + crate_name = "look sir free crabs" + DropPodOnly = TRUE + +/datum/supply_pack/organic/critter/crab/generate() + . = ..() + for(var/i in 1 to 49) + new /mob/living/simple_animal/crab(.) + +/datum/supply_pack/organic/critter/corgi + name = "Corgi Crate" + desc = "Considered the optimal dog breed by thousands of research scientists, this Corgi is but one dog from the millions of Ian's noble bloodline. Comes with a cute collar!" + cost = 5000 + contains = list(/mob/living/simple_animal/pet/dog/corgi, + /obj/item/clothing/neck/petcollar) + crate_name = "corgi crate" + +/datum/supply_pack/organic/critter/corgi/generate() + . = ..() + if(prob(50)) + var/mob/living/simple_animal/pet/dog/corgi/D = locate() in . + qdel(D) + new /mob/living/simple_animal/pet/dog/corgi/Lisa(.) + +/datum/supply_pack/organic/critter/cow + name = "Cow Crate" + desc = "The cow goes moo!" + cost = 3000 + contains = list(/mob/living/simple_animal/cow) + crate_name = "cow crate" + +/datum/supply_pack/organic/critter/fox + name = "Fox Crate" + desc = "The fox goes...? Comes with a collar!"//what does the fox say + cost = 5000 + contains = list(/mob/living/simple_animal/pet/fox, + /obj/item/clothing/neck/petcollar) + crate_name = "fox crate" + +/datum/supply_pack/organic/critter/goat + name = "Goat Crate" + desc = "The goat goes baa! Warranty void if used as a replacement for Pete." + cost = 2500 + contains = list(/mob/living/simple_animal/hostile/retaliate/goat) + crate_name = "goat crate" + +/datum/supply_pack/organic/critter/pug + name = "Pug Crate" + desc = "Like a normal dog, but... squished. Comes with a nice collar!" + cost = 5000 + contains = list(/mob/living/simple_animal/pet/dog/pug, + /obj/item/clothing/neck/petcollar) + crate_name = "pug crate" + +/datum/supply_pack/organic/critter/snake + name = "Snake Crate" + desc = "Tired of these MOTHER FUCKING snakes on this MOTHER FUCKING space station? Then this isn't the crate for you. Contains three poisonous snakes." + cost = 3000 + contains = list(/mob/living/simple_animal/hostile/retaliate/poison/snake, + /mob/living/simple_animal/hostile/retaliate/poison/snake, + /mob/living/simple_animal/hostile/retaliate/poison/snake) + crate_name = "snake crate" /datum/supply_pack/organic/vending name = "Bartending Supply Crate" + desc = "Bring on the booze with six vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!" cost = 2000 contains = list(/obj/item/vending_refill/boozeomat, /obj/item/vending_refill/boozeomat, @@ -1251,24 +1535,9 @@ /obj/item/book/action_granting/drink_fling) crate_name = "bartending supply crate" -/datum/supply_pack/organic/vending/snack - name = "Snack Supply Crate" - cost = 1500 - contains = list(/obj/item/vending_refill/snack, - /obj/item/vending_refill/snack, - /obj/item/vending_refill/snack) - crate_name = "snacks supply crate" - -/datum/supply_pack/organic/vending/cola - name = "Softdrinks Supply Crate" - cost = 1500 - contains = list(/obj/item/vending_refill/cola, - /obj/item/vending_refill/cola, - /obj/item/vending_refill/cola) - crate_name = "soft drinks supply crate" - /datum/supply_pack/organic/vending/cigarette name = "Cigarette Supply Crate" + desc = "Don't believe the reports - smoke today! Contains cigarette vending machine refills." cost = 1500 contains = list(/obj/item/vending_refill/cigarette, /obj/item/vending_refill/cigarette, @@ -1277,66 +1546,30 @@ /datum/supply_pack/organic/vending/games name = "Games Supply Crate" + desc = "Get your game on with these three game vending machine refills." cost = 1000 contains = list(/obj/item/vending_refill/games, /obj/item/vending_refill/games, /obj/item/vending_refill/games) crate_name = "games supply crate" -////////////////////////////////////////////////////////////////////////////// -//////////////////////////// Materials /////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// +/datum/supply_pack/organic/vending/snack + name = "Snack Supply Crate" + desc = "Three vending machine refills of cavity-bringin' goodness! The number one dentist recommended order!" + cost = 1500 + contains = list(/obj/item/vending_refill/snack, + /obj/item/vending_refill/snack, + /obj/item/vending_refill/snack) + crate_name = "snacks supply crate" -/datum/supply_pack/materials - group = "Raw Materials" - -/datum/supply_pack/materials/metal50 - name = "50 Metal Sheets" - cost = 1000 - contains = list(/obj/item/stack/sheet/metal/fifty) - crate_name = "metal sheets crate" - -/datum/supply_pack/materials/plasteel20 - name = "20 Plasteel Sheets" - cost = 7500 - contains = list(/obj/item/stack/sheet/plasteel/twenty) - crate_name = "plasteel sheets crate" - -/datum/supply_pack/materials/plasteel50 - name = "50 Plasteel Sheets" - cost = 16500 - contains = list(/obj/item/stack/sheet/plasteel/fifty) - crate_name = "plasteel sheets crate" - -/datum/supply_pack/materials/glass50 - name = "50 Glass Sheets" - cost = 1000 - contains = list(/obj/item/stack/sheet/glass/fifty) - crate_name = "glass sheets crate" - -/datum/supply_pack/materials/wood50 - name = "50 Wood Planks" - cost = 2000 - contains = list(/obj/item/stack/sheet/mineral/wood/fifty) - crate_name = "wood planks crate" - -/datum/supply_pack/materials/cardboard50 - name = "50 Cardboard Sheets" - cost = 1000 - contains = list(/obj/item/stack/sheet/cardboard/fifty) - crate_name = "cardboard sheets crate" - -/datum/supply_pack/materials/plastic50 - name = "50 Plastic Sheets" - cost = 1000 - contains = list(/obj/item/stack/sheet/plastic/fifty) - crate_name = "plastic sheets crate" - -/datum/supply_pack/materials/sandstone30 - name = "30 Sandstone Blocks" - cost = 1000 - contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty) - crate_name = "sandstone blocks crate" +/datum/supply_pack/organic/vending/cola + name = "Softdrinks Supply Crate" + desc = "Got whacked by a toolbox, but you still have those pesky teeth? Get rid of those pearly whites with these three soda machine refills, today!" + cost = 1500 + contains = list(/obj/item/vending_refill/cola, + /obj/item/vending_refill/cola, + /obj/item/vending_refill/cola) + crate_name = "soft drinks supply crate" ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Miscellaneous /////////////////////////////////// @@ -1345,114 +1578,48 @@ /datum/supply_pack/misc group = "Miscellaneous Supplies" -/datum/supply_pack/misc/minerkit - name = "Shaft Miner Starter Kit" - cost = 2500 - access = ACCESS_QM - contains = list(/obj/item/pickaxe/mini, - /obj/item/clothing/glasses/meson, - /obj/item/device/t_scanner/adv_mining_scanner/lesser, - /obj/item/device/radio/headset/headset_cargo/mining, - /obj/item/storage/bag/ore, - /obj/item/clothing/suit/hooded/explorer, - /obj/item/clothing/mask/gas/explorer) - crate_name = "shaft miner starter kit" - crate_type = /obj/structure/closet/crate/secure +/datum/supply_pack/misc/artsupply + name = "Art Supplies" + desc = "Make some happy little accidents with six canvasses, two easels, and two rainbow crayons!" + cost = 800 + contains = list(/obj/structure/easel, + /obj/structure/easel, + /obj/item/canvas/nineteenXnineteen, + /obj/item/canvas/nineteenXnineteen, + /obj/item/canvas/twentythreeXnineteen, + /obj/item/canvas/twentythreeXnineteen, + /obj/item/canvas/twentythreeXtwentythree, + /obj/item/canvas/twentythreeXtwentythree, + /obj/item/toy/crayon/rainbow, + /obj/item/toy/crayon/rainbow) + crate_name = "art supply crate" -/datum/supply_pack/misc/mule - name = "MULEbot Crate" - cost = 2000 - contains = list(/mob/living/simple_animal/bot/mulebot) - crate_name = "\improper MULEbot Crate" +/datum/supply_pack/misc/bicycle + name = "Bicycle" + desc = "Nanotrasen reminds all employees to never toy with powers outside their control." + cost = 1000000 + contains = list(/obj/vehicle/ridden/bicycle) + crate_name = "Bicycle Crate" crate_type = /obj/structure/closet/crate/large -/datum/supply_pack/misc/conveyor - name = "Conveyor Assembly Crate" - cost = 1500 - contains = list(/obj/item/conveyor_construct, - /obj/item/conveyor_construct, - /obj/item/conveyor_construct, - /obj/item/conveyor_construct, - /obj/item/conveyor_construct, - /obj/item/conveyor_construct, - /obj/item/conveyor_switch_construct, - /obj/item/paper/guides/conveyor) - crate_name = "conveyor assembly crate" - -/datum/supply_pack/misc/watertank - name = "Water Tank Crate" - cost = 600 - contains = list(/obj/structure/reagent_dispensers/watertank) - crate_name = "water tank crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/misc/hightank - name = "High-Capacity Water Tank Crate" - cost = 1200 - contains = list(/obj/structure/reagent_dispensers/watertank/high) - crate_name = "high-capacity water tank crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/misc/water_vapor - name = "Water Vapor Canister" - cost = 2500 - contains = list(/obj/machinery/portable_atmospherics/canister/water_vapor) - crate_name = "water vapor canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/misc/lasertag - name = "Laser Tag Crate" - cost = 1500 - contains = list(/obj/item/gun/energy/laser/redtag, - /obj/item/gun/energy/laser/redtag, - /obj/item/gun/energy/laser/redtag, - /obj/item/gun/energy/laser/bluetag, - /obj/item/gun/energy/laser/bluetag, - /obj/item/gun/energy/laser/bluetag, - /obj/item/clothing/suit/redtag, - /obj/item/clothing/suit/redtag, - /obj/item/clothing/suit/redtag, - /obj/item/clothing/suit/bluetag, - /obj/item/clothing/suit/bluetag, - /obj/item/clothing/suit/bluetag, - /obj/item/clothing/head/helmet/redtaghelm, - /obj/item/clothing/head/helmet/redtaghelm, - /obj/item/clothing/head/helmet/redtaghelm, - /obj/item/clothing/head/helmet/bluetaghelm, - /obj/item/clothing/head/helmet/bluetaghelm, - /obj/item/clothing/head/helmet/bluetaghelm) - crate_name = "laser tag crate" - -/datum/supply_pack/misc/lasertag/pins - name = "Laser Tag Firing Pins Crate" - cost = 3000 - contraband = TRUE - contains = list(/obj/item/storage/box/lasertagpins) - crate_name = "laser tag crate" - -/datum/supply_pack/misc/clownpin - name = "Hilarious Firing Pin Crate" +/datum/supply_pack/misc/bigband + name = "Big Band Instrument Collection" + desc = "Get your sad station movin' and groovin' with this fine collection! Contains nine different instruments!" cost = 5000 - contraband = TRUE - contains = list(/obj/item/device/firing_pin/clown) - // It's /technically/ a toy. For the clown, at least. - crate_name = "toy crate" - -/datum/supply_pack/misc/religious_supplies - name = "Religious Supplies Crate" - cost = 4000 // it costs so much because the Space Church is ran by Space Jews - contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater, - /obj/item/reagent_containers/food/drinks/bottle/holywater, - /obj/item/storage/book/bible/booze, - /obj/item/storage/book/bible/booze, - /obj/item/clothing/suit/hooded/chaplain_hoodie, - /obj/item/clothing/suit/hooded/chaplain_hoodie, - /obj/item/clothing/under/burial, - /obj/item/clothing/under/burial) - crate_name = "religious supplies crate" + crate_name = "Big band musical instruments collection" + contains = list(/obj/item/device/instrument/violin, + /obj/item/device/instrument/guitar, + /obj/item/device/instrument/glockenspiel, + /obj/item/device/instrument/accordion, + /obj/item/device/instrument/saxophone, + /obj/item/device/instrument/trombone, + /obj/item/device/instrument/recorder, + /obj/item/device/instrument/harmonica, + /obj/structure/piano/unanchored) /datum/supply_pack/misc/book_crate name = "Book Crate" + desc = "Surplus from the Nanotrasen Archives, these five books are sure to be good reads." cost = 1500 contains = list(/obj/item/book/codex_gigas, /obj/item/book/manual/random/, @@ -1462,6 +1629,7 @@ /datum/supply_pack/misc/paper name = "Bureaucracy Crate" + desc = "High stacks of papers on your desk Are a big problem - make it Pea-sized with these bureacratic supplies! Contains six pens, some camera film, hand labeler supplies, a paper bin, three folders, two clipboards and two stamps."//that was too forced cost = 1500 contains = list(/obj/structure/filingcabinet/chestdrawer/wheeled, /obj/item/device/camera_film, @@ -1486,23 +1654,82 @@ /datum/supply_pack/misc/fountainpens name = "Calligraphy Crate" + desc = "Sign death warrents in style with these seven executive fountain pens." cost = 700 contains = list(/obj/item/storage/box/fountainpens) crate_type = /obj/structure/closet/crate/wooden -/datum/supply_pack/misc/toner - name = "Toner Crate" +/datum/supply_pack/misc/randomised/contraband + name = "Contraband Crate" + desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, bling, even some ambrosia deus...you know, the good stuff. Just keep it away from the cops, kay?" + contraband = TRUE + cost = 3000 + num_contained = 5 + contains = list(/obj/item/poster/random_contraband, + /obj/item/storage/fancy/cigarettes/cigpack_shadyjims, + /obj/item/storage/fancy/cigarettes/cigpack_midori, + /obj/item/seeds/ambrosia/deus, + /obj/item/clothing/neck/necklace/dope) + crate_name = "crate" + +/datum/supply_pack/misc/conveyor + name = "Conveyor Assembly Crate" + desc = "Keep production moving along with six conveyor belts. Conveyor switch included. If you have any questions, check out the enclosed instruction book." + cost = 1500 + contains = list(/obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_switch_construct, + /obj/item/paper/guides/conveyor) + crate_name = "conveyor assembly crate" + +/datum/supply_pack/misc/foamforce + name = "Foam Force Crate" + desc = "Break out the big guns with eight Foam Force shotguns!" cost = 1000 - contains = list(/obj/item/device/toner, - /obj/item/device/toner, - /obj/item/device/toner, - /obj/item/device/toner, - /obj/item/device/toner, - /obj/item/device/toner) - crate_name = "toner crate" + contains = list(/obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy, + /obj/item/gun/ballistic/shotgun/toy) + crate_name = "foam force crate" + +/datum/supply_pack/misc/foamforce/bonus + name = "Foam Force Pistols Crate" + desc = "Psst.. hey bud... remember those old foam force pistols that got discontinued for being too cool? Well I got two of those right here with your name on em. I'll even throw in a spare mag for each, waddya say?" + contraband = TRUE + cost = 4000 + contains = list(/obj/item/gun/ballistic/automatic/toy/pistol, + /obj/item/gun/ballistic/automatic/toy/pistol, + /obj/item/ammo_box/magazine/toy/pistol, + /obj/item/ammo_box/magazine/toy/pistol) + crate_name = "foam force crate" + +/datum/supply_pack/misc/noslipfloor + name = "High-traction Floor Tiles" + desc = "Make slipping a thing of the past with thirty industrial-grade anti-slip floortiles!" + cost = 2000 + contains = list(/obj/item/stack/tile/noslip/thirty) + crate_name = "high-traction floor tiles crate" + +/datum/supply_pack/misc/clownpin + name = "Hilarious Firing Pin Crate" + desc = "i uh... im not really sure what this does. wanna buy it?" + cost = 5000 + contraband = TRUE + contains = list(/obj/item/device/firing_pin/clown) + // It's /technically/ a toy. For the clown, at least. + crate_name = "toy crate" /datum/supply_pack/misc/janitor name = "Janitorial Supplies Crate" + desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, and trash bag." cost = 1000 contains = list(/obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, @@ -1521,6 +1748,7 @@ /datum/supply_pack/misc/janitor/janicart name = "Janitorial Cart and Galoshes Crate" + desc = "The keystone to any successful janitor. As long as you have feet, this pair of galoshes will keep them firmly planted on the ground. Also contains a janitorial cart." cost = 2000 contains = list(/obj/structure/janitorialcart, /obj/item/clothing/shoes/galoshes) @@ -1529,39 +1757,114 @@ /datum/supply_pack/misc/janitor/janitank name = "Janitor Backpack Crate" + desc = "Call forth divine judgement upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner. Requires janitor access to open." cost = 1000 access = ACCESS_JANITOR contains = list(/obj/item/watertank/janitor) crate_name = "janitor backpack crate" crate_type = /obj/structure/closet/crate/secure +/datum/supply_pack/misc/lasertag + name = "Laser Tag Crate" + desc = "Foam Force is for boys. Laser Tag is for men. Contains three sets of red suits, blue suits, matching helmets, and matching laser tag guns." + cost = 1500 + contains = list(/obj/item/gun/energy/laser/redtag, + /obj/item/gun/energy/laser/redtag, + /obj/item/gun/energy/laser/redtag, + /obj/item/gun/energy/laser/bluetag, + /obj/item/gun/energy/laser/bluetag, + /obj/item/gun/energy/laser/bluetag, + /obj/item/clothing/suit/redtag, + /obj/item/clothing/suit/redtag, + /obj/item/clothing/suit/redtag, + /obj/item/clothing/suit/bluetag, + /obj/item/clothing/suit/bluetag, + /obj/item/clothing/suit/bluetag, + /obj/item/clothing/head/helmet/redtaghelm, + /obj/item/clothing/head/helmet/redtaghelm, + /obj/item/clothing/head/helmet/redtaghelm, + /obj/item/clothing/head/helmet/bluetaghelm, + /obj/item/clothing/head/helmet/bluetaghelm, + /obj/item/clothing/head/helmet/bluetaghelm) + crate_name = "laser tag crate" + +/datum/supply_pack/misc/lasertag/pins + name = "Laser Tag Firing Pins Crate" + desc = "Three laser tag firing pins used in laser-tag units to ensure users are wearing their vests." + cost = 3000 + contraband = TRUE + contains = list(/obj/item/storage/box/lasertagpins) + crate_name = "laser tag crate" + +/datum/supply_pack/misc/mule + name = "MULEbot Crate" + desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!" + cost = 2000 + contains = list(/mob/living/simple_animal/bot/mulebot) + crate_name = "\improper MULEbot Crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/misc/religious_supplies + name = "Religious Supplies Crate" + desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets." + cost = 4000 // it costs so much because the Space Church is ran by Space Jews + contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater, + /obj/item/reagent_containers/food/drinks/bottle/holywater, + /obj/item/storage/book/bible/booze, + /obj/item/storage/book/bible/booze, + /obj/item/clothing/suit/hooded/chaplain_hoodie, + /obj/item/clothing/suit/hooded/chaplain_hoodie, + /obj/item/clothing/under/burial, + /obj/item/clothing/under/burial) + crate_name = "religious supplies crate" + /datum/supply_pack/misc/janitor/lightbulbs name = "Replacement Lights" + desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs." cost = 1000 contains = list(/obj/item/storage/box/lights/mixed, /obj/item/storage/box/lights/mixed, /obj/item/storage/box/lights/mixed) crate_name = "replacement lights" -/datum/supply_pack/misc/noslipfloor - name = "High-traction Floor Tiles" - cost = 2000 - contains = list(/obj/item/stack/tile/noslip/thirty) - crate_name = "high-traction floor tiles crate" +/datum/supply_pack/misc/minerkit + name = "Shaft Miner Starter Kit" + desc = "All the miners died too fast? Assistant wants to get a taste of life off-station? Either way, this kit is the best way to turn a regular crewman into an ore-producing, monster-slaying machine. Contains meson goggles, a pickaxe, advanced mining scanner, cargo headset, ore bag, gasmask, and explorer suit. Requires QM access to open." + cost = 2500 + access = ACCESS_QM + contains = list(/obj/item/pickaxe/mini, + /obj/item/clothing/glasses/meson, + /obj/item/device/t_scanner/adv_mining_scanner/lesser, + /obj/item/device/radio/headset/headset_cargo/mining, + /obj/item/storage/bag/ore, + /obj/item/clothing/suit/hooded/explorer, + /obj/item/clothing/mask/gas/explorer) + crate_name = "shaft miner starter kit" + crate_type = /obj/structure/closet/crate/secure -/datum/supply_pack/misc/plasmaman - name = "Plasmaman Supply Kit" - cost = 2000 - contains = list(/obj/item/clothing/under/plasmaman, - /obj/item/clothing/under/plasmaman, - /obj/item/tank/internals/plasmaman/belt/full, - /obj/item/tank/internals/plasmaman/belt/full, - /obj/item/clothing/head/helmet/space/plasmaman, - /obj/item/clothing/head/helmet/space/plasmaman) - crate_name = "plasmaman supply kit" +/datum/supply_pack/misc/toner + name = "Toner Crate" + desc = "Spent too much ink printing butt pictures? Fret not, with these six toner refills, you'll be printing butts 'till the cows come home!'" + cost = 1000 + contains = list(/obj/item/device/toner, + /obj/item/device/toner, + /obj/item/device/toner, + /obj/item/device/toner, + /obj/item/device/toner, + /obj/item/device/toner) + crate_name = "toner crate" + +/datum/supply_pack/misc/autodrobe + name = "Autodrobe Supply Crate" + desc = "Autodrobe missing your favorite dress? Solve that issue today with these two autodrobe refills." + cost = 1500 + contains = list(/obj/item/vending_refill/autodrobe, + /obj/item/vending_refill/autodrobe) + crate_name = "autodrobe supply crate" /datum/supply_pack/misc/costume name = "Standard Costume Crate" + desc = "Supply the station's entertainers with the equipment of their trade with these Nanotrasen-approved costumes! Contains a full clown and mime outfit, along with a bike horn and a bottle of nothing." cost = 1000 access = ACCESS_THEATRE contains = list(/obj/item/storage/backpack/clown, @@ -1582,6 +1885,7 @@ /datum/supply_pack/misc/costume_original name = "Original Costume Crate" + desc = "Reenact Shakespearean plays with this assortment of outfits. Contains eight different costumes!" cost = 1000 contains = list(/obj/item/clothing/head/snowman, /obj/item/clothing/suit/snowman, @@ -1598,109 +1902,9 @@ /obj/item/clothing/suit/hooded/bee_costume) crate_name = "original costume crate" -/datum/supply_pack/misc/wizard - name = "Wizard Costume Crate" - cost = 2000 - contains = list(/obj/item/staff, - /obj/item/clothing/suit/wizrobe/fake, - /obj/item/clothing/shoes/sandal, - /obj/item/clothing/head/wizard/fake) - crate_name = "wizard costume crate" - -/datum/supply_pack/misc/randomised - name = "Collectable Hats Crate!" - cost = 20000 - var/num_contained = 3 //number of items picked to be contained in a randomised crate - contains = list(/obj/item/clothing/head/collectable/chef, - /obj/item/clothing/head/collectable/paper, - /obj/item/clothing/head/collectable/tophat, - /obj/item/clothing/head/collectable/captain, - /obj/item/clothing/head/collectable/beret, - /obj/item/clothing/head/collectable/welding, - /obj/item/clothing/head/collectable/flatcap, - /obj/item/clothing/head/collectable/pirate, - /obj/item/clothing/head/collectable/kitty, - /obj/item/clothing/head/collectable/rabbitears, - /obj/item/clothing/head/collectable/wizard, - /obj/item/clothing/head/collectable/hardhat, - /obj/item/clothing/head/collectable/HoS, - /obj/item/clothing/head/collectable/HoP, - /obj/item/clothing/head/collectable/thunderdome, - /obj/item/clothing/head/collectable/swat, - /obj/item/clothing/head/collectable/slime, - /obj/item/clothing/head/collectable/police, - /obj/item/clothing/head/collectable/slime, - /obj/item/clothing/head/collectable/xenom, - /obj/item/clothing/head/collectable/petehat) - crate_name = "collectable hats crate" - -/datum/supply_pack/misc/randomised/fill(obj/structure/closet/crate/C) - var/list/L = contains.Copy() - for(var/i in 1 to num_contained) - var/item = pick_n_take(L) - new item(C) - -/datum/supply_pack/misc/bigband - contains = list(/obj/item/device/instrument/violin, - /obj/item/device/instrument/guitar, - /obj/item/device/instrument/glockenspiel, - /obj/item/device/instrument/accordion, - /obj/item/device/instrument/saxophone, - /obj/item/device/instrument/trombone, - /obj/item/device/instrument/recorder, - /obj/item/device/instrument/harmonica, - /obj/structure/piano/unanchored) - name = "Big band instrument collection" - cost = 5000 - crate_name = "Big band musical instruments collection" - -/datum/supply_pack/misc/randomised/contraband - name = "Contraband Crate" - contraband = TRUE - cost = 3000 - num_contained = 5 - contains = list(/obj/item/poster/random_contraband, - /obj/item/storage/fancy/cigarettes/cigpack_shadyjims, - /obj/item/storage/fancy/cigarettes/cigpack_midori, - /obj/item/seeds/ambrosia/deus, - /obj/item/clothing/neck/necklace/dope) - crate_name = "crate" - -/datum/supply_pack/misc/randomised/toys - name = "Toy Crate" - cost = 5000 // or play the arcade machines ya lazy bum - // TODO make this actually just use the arcade machine loot list - num_contained = 5 - contains = list(/obj/item/toy/spinningtoy, - /obj/item/toy/sword, - /obj/item/toy/foamblade, - /obj/item/toy/talking/AI, - /obj/item/toy/talking/owl, - /obj/item/toy/talking/griffin, - /obj/item/toy/nuke, - /obj/item/toy/minimeteor, - /obj/item/toy/plush/carpplushie, - /obj/item/toy/plush/lizardplushie, - /obj/item/toy/plush/snakeplushie, - /obj/item/toy/plush/nukeplushie, - /obj/item/toy/plush/slimeplushie, - /obj/item/coin/antagtoken, - /obj/item/stack/tile/fakespace/loaded, - /obj/item/gun/ballistic/shotgun/toy/crossbow, - /obj/item/toy/redbutton, - /obj/item/toy/eightball, - /obj/item/vending_refill/donksoft) - crate_name = "toy crate" - -/datum/supply_pack/misc/autodrobe - name = "Autodrobe Supply Crate" - cost = 1500 - contains = list(/obj/item/vending_refill/autodrobe, - /obj/item/vending_refill/autodrobe) - crate_name = "autodrobe supply crate" - /datum/supply_pack/misc/formalwear name = "Formalwear Crate" + desc = "You're gonna like the way you look, I guaranteed it. Contains an asston of fancy clothing." cost = 3000 //Lots of very expensive items. You gotta pay up to look good! contains = list(/obj/item/clothing/under/blacktango, /obj/item/clothing/under/assistantformal, @@ -1731,104 +1935,73 @@ /obj/item/lipstick/random) crate_name = "formalwear crate" -/datum/supply_pack/misc/foamforce - name = "Foam Force Crate" - cost = 1000 - contains = list(/obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy, - /obj/item/gun/ballistic/shotgun/toy) - crate_name = "foam force crate" +/datum/supply_pack/misc/wizard + name = "Wizard Costume Crate" + desc = "Pretend to join the Wizard Federation with this full wizard outfit! Nanotrasen would like to remind its employees that actually joining the Wizard Federation is subject to termination of job and life." + cost = 2000 + contains = list(/obj/item/staff, + /obj/item/clothing/suit/wizrobe/fake, + /obj/item/clothing/shoes/sandal, + /obj/item/clothing/head/wizard/fake) + crate_name = "wizard costume crate" -/datum/supply_pack/misc/foamforce/bonus - name = "Foam Force Pistols Crate" - contraband = TRUE - cost = 4000 - contains = list(/obj/item/gun/ballistic/automatic/toy/pistol, - /obj/item/gun/ballistic/automatic/toy/pistol, - /obj/item/ammo_box/magazine/toy/pistol, - /obj/item/ammo_box/magazine/toy/pistol) - crate_name = "foam force crate" +/datum/supply_pack/misc/randomised/fill(obj/structure/closet/crate/C) + var/list/L = contains.Copy() + for(var/i in 1 to num_contained) + var/item = pick_n_take(L) + new item(C) -/datum/supply_pack/misc/artsupply - name = "Art Supplies" - cost = 800 - contains = list(/obj/structure/easel, - /obj/structure/easel, - /obj/item/canvas/nineteenXnineteen, - /obj/item/canvas/nineteenXnineteen, - /obj/item/canvas/twentythreeXnineteen, - /obj/item/canvas/twentythreeXnineteen, - /obj/item/canvas/twentythreeXtwentythree, - /obj/item/canvas/twentythreeXtwentythree, - /obj/item/toy/crayon/rainbow, - /obj/item/toy/crayon/rainbow) - crate_name = "art supply crate" +/datum/supply_pack/misc/randomised + name = "Collectable Hats Crate" + desc = "Flaunt your status with three unique, highly-collectable hats!" + cost = 20000 + var/num_contained = 3 //number of items picked to be contained in a randomised crate + contains = list(/obj/item/clothing/head/collectable/chef, + /obj/item/clothing/head/collectable/paper, + /obj/item/clothing/head/collectable/tophat, + /obj/item/clothing/head/collectable/captain, + /obj/item/clothing/head/collectable/beret, + /obj/item/clothing/head/collectable/welding, + /obj/item/clothing/head/collectable/flatcap, + /obj/item/clothing/head/collectable/pirate, + /obj/item/clothing/head/collectable/kitty, + /obj/item/clothing/head/collectable/rabbitears, + /obj/item/clothing/head/collectable/wizard, + /obj/item/clothing/head/collectable/hardhat, + /obj/item/clothing/head/collectable/HoS, + /obj/item/clothing/head/collectable/HoP, + /obj/item/clothing/head/collectable/thunderdome, + /obj/item/clothing/head/collectable/swat, + /obj/item/clothing/head/collectable/slime, + /obj/item/clothing/head/collectable/police, + /obj/item/clothing/head/collectable/slime, + /obj/item/clothing/head/collectable/xenom, + /obj/item/clothing/head/collectable/petehat) + crate_name = "collectable hats crate" -/datum/supply_pack/misc/bsa - name = "Bluespace Artillery Parts" - cost = 15000 - special = TRUE - contains = list(/obj/item/circuitboard/machine/bsa/front, - /obj/item/circuitboard/machine/bsa/middle, - /obj/item/circuitboard/machine/bsa/back, - /obj/item/circuitboard/computer/bsa_control - ) - crate_name= "bluespace artillery parts crate" - -/datum/supply_pack/misc/dna_vault - name = "DNA Vault Parts" - cost = 12000 - special = TRUE - contains = list( - /obj/item/circuitboard/machine/dna_vault, - /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 - ) - crate_name= "dna vault parts crate" - -/datum/supply_pack/misc/dna_probes - name = "DNA Vault Samplers" - cost = 3000 - 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 - ) - crate_name= "dna samplers crate" - - -/datum/supply_pack/misc/shield_sat - name = "Shield Generator Satellite" - cost = 3000 - special = TRUE - contains = list( - /obj/machinery/satellite/meteor_shield, - /obj/machinery/satellite/meteor_shield, - /obj/machinery/satellite/meteor_shield - ) - crate_name= "shield sat crate" - - -/datum/supply_pack/misc/shield_sat_control - name = "Shield System Control Board" - cost = 5000 - special = TRUE - contains = list(/obj/item/circuitboard/computer/sat_control) - crate_name= "shield control board crate" - -/datum/supply_pack/misc/bicycle - name = "Bicycle" - cost = 1000000 - contains = list(/obj/vehicle/ridden/bicycle) - crate_name = "Bicycle Crate" - crate_type = /obj/structure/closet/crate/large \ No newline at end of file +/datum/supply_pack/misc/randomised/toys + name = "Toy Crate" + desc = "Who cares about pride and accomplishment? Skip the gaming and get straight to the sweet rewards with this product! Contains five random toys. Warranty void if used to prank research directors." + cost = 5000 // or play the arcade machines ya lazy bum + // TODO make this actually just use the arcade machine loot list + num_contained = 5 + contains = list(/obj/item/toy/spinningtoy, + /obj/item/toy/sword, + /obj/item/toy/foamblade, + /obj/item/toy/talking/AI, + /obj/item/toy/talking/owl, + /obj/item/toy/talking/griffin, + /obj/item/toy/nuke, + /obj/item/toy/minimeteor, + /obj/item/toy/plush/carpplushie, + /obj/item/toy/plush/lizardplushie, + /obj/item/toy/plush/snakeplushie, + /obj/item/toy/plush/nukeplushie, + /obj/item/toy/plush/slimeplushie, + /obj/item/coin/antagtoken, + /obj/item/stack/tile/fakespace/loaded, + /obj/item/gun/ballistic/shotgun/toy/crossbow, + /obj/item/toy/redbutton, + /obj/item/toy/eightball, + /obj/item/vending_refill/donksoft) + crate_name = "toy crate" diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index cccdb199bb..c821204993 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -97,7 +97,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the if(!verify) // Can't access the asset cache browser, rip. client.cache += unreceived return 1 - + client.sending |= unreceived var/job = ++client.last_asset_job @@ -135,7 +135,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the else concurrent_tracker++ send_asset(client, file, verify=FALSE) - + stoplag(0) //queuing calls like this too quickly can cause issues in some client versions //This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up. @@ -350,6 +350,11 @@ GLOBAL_LIST_EMPTY(asset_datums) "browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css', ) +/datum/asset/simple/permissions + assets = list( + "padlock.png" = 'html/padlock.png' + ) + //this exists purely to avoid meta by pre-loading all language icons. /datum/asset/language/register() for(var/path in typesof(/datum/language)) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index a38a4c5d40..6ad71221e3 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -6,7 +6,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( "1407" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", "1408" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", - + )) #define LIMITER_SIZE 5 @@ -87,6 +87,14 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(href_list["priv_msg"]) cmd_admin_pm(href_list["priv_msg"],null) return + // Mentor PM + if(href_list["mentor_msg"]) + if(CONFIG_GET(flag.mentors_mobname_only)) + var/mob/M = locate(href_list["mentor_msg"]) + cmd_mentor_pm(M,null) + else + cmd_mentor_pm(href_list["mentor_msg"],null) + return switch(href_list["_src_"]) if("holder") @@ -149,6 +157,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( GLOBAL_LIST_EMPTY(external_rsc_urls) #endif +/client/can_vv_get(var_name) + return var_name != NAMEOF(src, holder) && ..() + +/client/vv_edit_var(var_name, var_value) + return var_name != NAMEOF(src, holder) && ..() /client/New(TopicData) var/tdata = TopicData //save this for later use @@ -164,12 +177,14 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) GLOB.ahelp_tickets.ClientLogin(src) var/connecting_admin = FALSE //because de-admined admins connecting should be treated like admins. //Admin Authorisation - var/localhost_addresses = list("127.0.0.1", "::1") - if(address && (address in localhost_addresses)) - var/datum/admin_rank/localhost_rank = new("!localhost!", 65535) - if(localhost_rank) - var/datum/admins/localhost_holder = new(localhost_rank, ckey) - localhost_holder.associate(src) + holder = GLOB.admin_datums[ckey] + if(holder) + GLOB.admins |= src + holder.owner = src + connecting_admin = TRUE + else if(GLOB.deadmins[ckey]) + verbs += /client/proc/readmin + connecting_admin = TRUE if(CONFIG_GET(flag/autoadmin)) if(!GLOB.admin_datums[ckey]) var/datum/admin_rank/autorank @@ -180,19 +195,12 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if(!autorank) to_chat(world, "Autoadmin rank not found") else - var/datum/admins/D = new(autorank, ckey) - GLOB.admin_datums[ckey] = D - holder = GLOB.admin_datums[ckey] - if(holder) - GLOB.admins |= src - holder.owner = src - connecting_admin = TRUE - - else if(GLOB.deadmins[ckey]) - verbs += /client/proc/readmin - connecting_admin = TRUE - mentor_datum_set()// Citadel mentor_holder setting - + new /datum/admins(autorank, ckey) + if(CONFIG_GET(flag/enable_localhost_rank) && !connecting_admin) + var/localhost_addresses = list("127.0.0.1", "::1") + if(isnull(address) || (address in localhost_addresses)) + var/datum/admin_rank/localhost_rank = new("!localhost!", 65535, 16384, 65535) //+EVERYTHING -DBRANKS *EVERYTHING + new /datum/admins(localhost_rank, ckey, 1, 1) //preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum) prefs = GLOB.preferences_datums[ckey] if(!prefs) @@ -235,16 +243,23 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) . = ..() //calls mob.Login() #if DM_VERSION >= 512 - if (num2text(byond_build) in GLOB.blacklisted_builds) - log_access("Failed login: blacklisted byond version") - to_chat(src, "Your version of byond is blacklisted.") - to_chat(src, "Byond build [byond_build] ([byond_version].[byond_build]) has been blacklisted for the following reason: [GLOB.blacklisted_builds[num2text(byond_build)]].") - to_chat(src, "Please download a new version of byond. if [byond_build] is the latest, you can go to http://www.byond.com/download/build/ to download other versions.") - if(connecting_admin) - to_chat(src, "As an admin, you are being allowed to continue using this version, but please consider changing byond versions") - else + if (byond_version >= 512) + if (!byond_build || byond_build < 1386) + message_admins("[key_name(src)] has been detected as spoofing their byond version. Connection rejected.") + add_system_note("Spoofed-Byond-Version", "Detected as using a spoofed byond version.") + log_access("Failed Login: [key] - Spoofed byond version") qdel(src) - return + + if (num2text(byond_build) in GLOB.blacklisted_builds) + log_access("Failed login: [key] - blacklisted byond version") + to_chat(src, "Your version of byond is blacklisted.") + to_chat(src, "Byond build [byond_build] ([byond_version].[byond_build]) has been blacklisted for the following reason: [GLOB.blacklisted_builds[num2text(byond_build)]].") + to_chat(src, "Please download a new version of byond. if [byond_build] is the latest, you can go to http://www.byond.com/download/build/ to download other versions.") + if(connecting_admin) + to_chat(src, "As an admin, you are being allowed to continue using this version, but please consider changing byond versions") + else + qdel(src) + return #endif if(SSinput.initialized) set_macros() @@ -405,21 +420,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) "Someone come hold me :(",\ "I need someone on me :(",\ "What happened? Where has everyone gone?",\ - "Forever alone :(",\ - "My nipples are so stiff, but Zelda ain't here. :(",\ - "Leon senpai, play more Spessmans. :(",\ - "If only Serdy were here...",\ - "Panic bunker can't keep my love for you out.",\ - "Cebu needs to Awoo herself back into my heart.",\ - "I don't even have a Turry to snuggle viciously here.",\ - "MOM, WHERE ARE YOU??? D:",\ - "It's a beautiful day outside. Birds are singing, flowers are blooming. On days like this...kids like you...SHOULD BE BURNING IN HELL.",\ - "Sometimes when I have sex, I think about putting an entire peanut butter and jelly sandwich in the VCR.",\ - "Oh good, no-one around to watch me lick Goofball's nipples. :D",\ - "I've replaced Beepsky with a fidget spinner, glory be autism abuse.",\ - "i shure hop dere are no PRED arund!!!!",\ - "NO PRED CAN eVER CATCH MI",\ - "help, the clown is honking his horn in front of dorms and its interrupting everyones erp"\ + "Forever alone :("\ ) send2irc("Server", "[cheesy_message] (No admins online)") @@ -619,10 +620,13 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) to_chat(src, {"You will be automatically taken to the game, if not, click here to be taken manually"}) /client/proc/note_randomizer_user() - var/const/adminckey = "CID-Error" + add_system_note("CID-Error", "Detected as using a cid randomizer.") + +/client/proc/add_system_note(system_ckey, message) + var/sql_system_ckey = sanitizeSQL(system_ckey) var/sql_ckey = sanitizeSQL(ckey) //check to see if we noted them in the last day. - var/datum/DBQuery/query_get_notes = SSdbcore.NewQuery("SELECT id FROM [format_table_name("messages")] WHERE type = 'note' AND targetckey = '[sql_ckey]' AND adminckey = '[adminckey]' AND timestamp + INTERVAL 1 DAY < NOW() AND deleted = 0") + var/datum/DBQuery/query_get_notes = SSdbcore.NewQuery("SELECT id FROM [format_table_name("messages")] WHERE type = 'note' AND targetckey = '[sql_ckey]' AND adminckey = '[sql_system_ckey]' AND timestamp + INTERVAL 1 DAY < NOW() AND deleted = 0") if(!query_get_notes.Execute()) return if(query_get_notes.NextRow()) @@ -632,9 +636,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if(!query_get_notes.Execute()) return if(query_get_notes.NextRow()) - if (query_get_notes.item[1] == adminckey) + if (query_get_notes.item[1] == system_ckey) return - create_message("note", sql_ckey, adminckey, "Detected as using a cid randomizer.", null, null, 0, 0) + create_message("note", ckey, system_ckey, message, null, null, 0, 0) /client/proc/check_ip_intel() @@ -731,7 +735,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if(!prefs.widescreenpref && new_size == CONFIG_GET(string/default_view)) new_size = "15x15" //END OF CIT CHANGES - view = new_size apply_clickcatcher() if (isliving(mob)) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 75f8a0c75e..dfc39a9f28 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -149,6 +149,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) //Mob preview var/icon/preview_icon = null + //Trait list + var/list/positive_traits = list() + var/list/negative_traits = list() + var/list/neutral_traits = list() + var/list/all_traits = list() + var/list/character_traits = list() + //Jobs, uses bitflags var/job_civilian_high = 0 var/job_civilian_med = 0 @@ -252,6 +259,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

Occupation Choices

" dat += "Set Occupation Preferences
" + if(CONFIG_GET(flag/roundstart_traits)) + dat += "

Trait Setup

" + dat += "Configure Traits
" + dat += "
Current traits: [all_traits.len ? all_traits.Join(", ") : "None"]
" dat += "

Identity

" dat += "
" if(jobban_isbanned(user, "appearance")) @@ -305,6 +316,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Window Flashing: [(windowflashing) ? "Yes" : "No"]
" dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
" + dat += "Allow MediHound sleeper: [(toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]
" dat += "Ghost ears: [(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" dat += "Ghost sight: [(chat_toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" dat += "Ghost whispers: [(chat_toggles & CHAT_GHOSTWHISPER) ? "All Speech" : "Nearest Creatures"]
" @@ -312,6 +324,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Ghost pda: [(chat_toggles & CHAT_GHOSTPDA) ? "All Messages" : "Nearest Creatures"]
" dat += "Pull requests: [(chat_toggles & CHAT_PULLR) ? "Yes" : "No"]
" dat += "Midround Antagonist: [(toggles & MIDROUND_ANTAG) ? "Yes" : "No"]
" + //VORE SOUNDS + dat += "Hear Vore Sounds: [(toggles & EATING_NOISES) ? "Yes" : "No"]
" + dat += "Hear Vore Digestion Sounds: [(toggles & DIGESTION_NOISES) ? "Yes" : "No"]
" if(CONFIG_GET(flag/allow_metadata)) dat += "OOC Notes: Edit
" @@ -385,6 +400,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Widescreen: [widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]
" + dat += "Auto stand: [autostand ? "Enabled" : "Disabled"]
" + dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
" if (!user.client.prefs.screenshake==0) @@ -868,6 +885,65 @@ GLOBAL_LIST_EMPTY(preferences_datums) return job_engsec_low return 0 +/datum/preferences/proc/SetTraits(mob/user) + if(!SStraits) + to_chat(user, "The trait subsystem is still initializing! Try again in a minute.") + return + + var/list/dat = list() + if(!SStraits.traits.len) + dat += "The trait subsystem hasn't finished initializing, please hold..." + dat += "
Done

" + + else + dat += "
Choose trait setup

" + dat += "
Left-click to add or remove traits. You need one negative trait for every positive trait.
\ + Traits are applied at roundstart and cannot normally be removed.
" + dat += "
Done
" + dat += "
" + dat += "
Current traits: [all_traits.len ? all_traits.Join(", ") : "None"]
" + /*dat += "
[positive_traits.len] / [MAX_POSITIVE_TRAITS] \ + | [neutral_traits.len] / [MAX_NEUTRAL_TRAITS] \ + | [negative_traits.len] / [MAX_NEGATIVE_TRAITS]

"*/ + dat += "
[all_traits.len] / [MAX_TRAITS] max traits
\ + Trait balance remaining: [GetTraitBalance()]

" + for(var/V in SStraits.traits) + var/datum/trait/T = SStraits.traits[V] + var/trait_name = initial(T.name) + var/has_trait + var/trait_cost = initial(T.value) * -1 + for(var/_V in all_traits) + if(_V == trait_name) + has_trait = TRUE + if(has_trait) + trait_cost *= -1 //invert it back, since we'd be regaining this amount + if(trait_cost > 0) + trait_cost = "+[trait_cost]" + var/font_color = "#AAAAFF" + if(initial(T.value) != 0) + font_color = initial(T.value) > 0 ? "#AAFFAA" : "#FFAAAA" + if(has_trait) + dat += "[trait_name] - [initial(T.desc)] \ + [has_trait ? "Lose" : "Take"] ([trait_cost] pts.)
" + else + dat += "[trait_name] - [initial(T.desc)] \ + [has_trait ? "Lose" : "Take"] ([trait_cost] pts.)
" + dat += "
Reset Traits
" + + user << browse(null, "window=preferences") + var/datum/browser/popup = new(user, "mob_occupation", "
Trait Preferences
", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way + popup.set_window_options("can_close=0") + popup.set_content(dat.Join()) + popup.open(0) + return + +/datum/preferences/proc/GetTraitBalance() + var/bal = 0 + for(var/V in all_traits) + var/datum/trait/T = SStraits.traits[V] + bal -= initial(T.value) + return bal + /datum/preferences/proc/process_link(mob/user, list/href_list) if(href_list["jobbancheck"]) var/job = sanitizeSQL(href_list["jobbancheck"]) @@ -915,6 +991,64 @@ GLOBAL_LIST_EMPTY(preferences_datums) SetChoices(user) return 1 + else if(href_list["preference"] == "trait") + if(SSticker.HasRoundStarted() && !isnewplayer(user)) + to_chat(user, "The round has already started. Please wait until next round to set up your traits!") + return + switch(href_list["task"]) + if("close") + user << browse(null, "window=mob_occupation") + ShowChoices(user) + if("update") + var/trait = href_list["trait"] + var/value = SStraits.trait_points[trait] + if(value == 0) + if(trait in neutral_traits) + neutral_traits -= trait + all_traits -= trait + else + if(all_traits.len >= MAX_TRAITS) + to_chat(user, "You can't have more than [MAX_TRAITS] traits!") + return + neutral_traits += trait + all_traits += trait + else + var/balance = GetTraitBalance() + if(trait in positive_traits) + positive_traits -= trait + all_traits -= trait + else if(trait in negative_traits) + if(balance + value < 0) + to_chat(user, "Refunding this would cause you to go below your balance!") + return + negative_traits -= trait + all_traits -= trait + else if(value > 0) + if(all_traits.len >= MAX_TRAITS) + to_chat(user, "You can't have more than [MAX_TRAITS] traits!") + return + if(balance - value < 0) + to_chat(user, "You don't have enough balance to gain this trait!") + return + positive_traits += trait + all_traits += trait + else + if(all_traits.len >= MAX_TRAITS) + to_chat(user, "You can't have more than [MAX_TRAITS] traits!") + return + negative_traits += trait + all_traits += trait + SetTraits(user) + if("reset") + all_traits = list() + positive_traits = list() + negative_traits = list() + neutral_traits = list() + SetTraits(user) + else + SetTraits(user) + return TRUE + switch(href_list["task"]) if("random") switch(href_list["preference"]) @@ -1567,6 +1701,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("widescreenpref") widescreenpref = !widescreenpref user.client.change_view(CONFIG_GET(string/default_view)) + if("autostand") + autostand = !autostand if ("screenshake") var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num if (!isnull(desiredshake)) @@ -1636,6 +1772,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) user.client.playtitlemusic() else user.stop_sound_channel(CHANNEL_LOBBYMUSIC) + // VORE SOUND TOGGLES + if("toggleeatingnoise") + toggles ^= EATING_NOISES + + if("toggledigestionnoise") + toggles ^= DIGESTION_NOISES if("ghost_ears") chat_toggles ^= CHAT_GHOSTEARS @@ -1655,6 +1797,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("pull_requests") chat_toggles ^= CHAT_PULLR + if("hound_sleeper") + toggles ^= MEDIHOUND_SLEEPER + if("allow_midround_antag") toggles ^= MIDROUND_ANTAG @@ -1781,3 +1926,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.update_hair() character.update_body_parts() character.update_genitals() + + if(CONFIG_GET(flag/roundstart_traits)) + SStraits.AssignTraits(character, parent) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index cc8fb9b86d..8bebf460e6 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -1,8 +1,12 @@ //This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped. -#define SAVEFILE_VERSION_MIN 15 +#define SAVEFILE_VERSION_MIN 18 //This is the current version, anything below this will attempt to update (if it's not obsolete) +// You do not need to raise this if you are adding new values that have sane defaults. +// Only raise this value when changing the meaning/format/name/layout of an existing value +// where you would want the updater procs below to run #define SAVEFILE_VERSION_MAX 20 + /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn This proc checks if the current directory of the savefile S needs updating @@ -30,83 +34,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car return savefile_version return -1 - -/datum/preferences/proc/update_antagchoices(current_version, savefile/S) - if((!islist(be_special) || old_be_special ) && current_version < 12) - //Archived values of when antag pref defines were a bitfield+fitflags - var/B_traitor = 1 - var/B_operative = 2 - var/B_changeling = 4 - var/B_wizard = 8 - var/B_malf = 16 - var/B_rev = 32 - var/B_alien = 64 - var/B_pai = 128 - var/B_cultist = 256 - var/B_blob = 512 - var/B_ninja = 1024 - var/B_monkey = 2048 - var/B_gang = 4096 - var/B_abductor = 16384 - var/B_brother = 32768 - - var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_blob,B_ninja,B_monkey,B_gang,B_abductor,B_brother) - - be_special = list() - - for(var/flag in archived) - if(old_be_special & flag) - //this is shitty, but this proc should only be run once per player and then never again for the rest of eternity, - switch(flag) - if(1) //why aren't these the variables above? Good question, it's because byond complains the expression isn't constant, when it is. - be_special += ROLE_TRAITOR - if(2) - be_special += ROLE_OPERATIVE - if(4) - be_special += ROLE_CHANGELING - if(8) - be_special += ROLE_WIZARD - if(16) - be_special += ROLE_MALF - if(32) - be_special += ROLE_REV - if(64) - be_special += ROLE_ALIEN - if(128) - be_special += ROLE_PAI - if(256) - be_special += ROLE_CULTIST - if(512) - be_special += ROLE_BLOB - if(1024) - be_special += ROLE_NINJA - if(2048) - be_special += ROLE_MONKEY - if(16384) - be_special += ROLE_ABDUCTOR - if(32768) - be_special += ROLE_BROTHER - - -/datum/preferences/proc/update_preferences(current_version, savefile/S) - - -//should this proc get fairly long (say 3 versions long), +//should these procs get fairly long //just increase SAVEFILE_VERSION_MIN so it's not as far behind //SAVEFILE_VERSION_MAX and then delete any obsolete if clauses -//from this proc. -//It's only really meant to avoid annoying frequent players +//from these procs. +//This only really meant to avoid annoying frequent players //if your savefile is 3 months out of date, then 'tough shit'. + +/datum/preferences/proc/update_preferences(current_version, savefile/S) + return + /datum/preferences/proc/update_character(current_version, savefile/S) - if(current_version < 16) - var/berandom - S["userandomjob"] >> berandom - if (berandom) - joblessrole = BERANDOMJOB - else - joblessrole = BEASSISTANT - if(current_version < 17) - features["legs"] = "Normal Legs" if(current_version < 20)//Raise this to the max savefile version every time we change something so we don't sanitize this whole list every time you save. features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], GLOB.mam_body_markings_list) features["mam_ears"] = sanitize_inlist(features["mam_ears"], GLOB.mam_ears_list) @@ -139,6 +77,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0) //womb features features["has_womb"] = sanitize_integer(features["has_womb"], 0, 1, 0) + if(current_version < 19) pda_style = "mono" if(current_version < 20) @@ -202,11 +141,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["screenshake"] >> screenshake S["damagescreenshake"] >> damagescreenshake S["widescreenpref"] >> widescreenpref + S["autostand"] >> autostand //try to fix any outdated data if necessary if(needs_update >= 0) update_preferences(needs_update, S) //needs_update = savefile_version if we need an update (positive integer) - update_antagchoices(needs_update, S) //Sanitize ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor))) @@ -233,6 +172,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car screenshake = sanitize_integer(screenshake, 0, 800, initial(screenshake)) damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake)) widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref)) + autostand = sanitize_integer(autostand, 0, 1, initial(autostand)) return 1 @@ -281,6 +221,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["damagescreenshake"], damagescreenshake) WRITE_FILE(S["arousable"], arousable) WRITE_FILE(S["widescreenpref"], widescreenpref) + WRITE_FILE(S["autostand"], autostand) return 1 @@ -369,6 +310,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["job_engsec_med"] >> job_engsec_med S["job_engsec_low"] >> job_engsec_low + //Traits + S["all_traits"] >> all_traits + S["positive_traits"] >> positive_traits + S["negative_traits"] >> negative_traits + S["neutral_traits"] >> neutral_traits + //Citadel code S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"] S["feature_exhibitionist"] >> features["exhibitionist"] @@ -477,6 +424,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) + all_traits = SANITIZE_LIST(all_traits) + positive_traits = SANITIZE_LIST(positive_traits) + negative_traits = SANITIZE_LIST(negative_traits) + neutral_traits = SANITIZE_LIST(neutral_traits) + cit_character_pref_load(S) return 1 @@ -542,6 +494,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["job_engsec_med"] , job_engsec_med) WRITE_FILE(S["job_engsec_low"] , job_engsec_low) + //Traits + WRITE_FILE(S["all_traits"] , all_traits) + WRITE_FILE(S["positive_traits"] , positive_traits) + WRITE_FILE(S["negative_traits"] , negative_traits) + WRITE_FILE(S["neutral_traits"] , neutral_traits) + cit_character_pref_save(S) return 1 diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 255423a4fc..367a11c2cb 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -146,7 +146,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglemidis)() usr.stop_sound_channel(CHANNEL_ADMIN) var/client/C = usr.client if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded) - C.chatOutput.sendMusic(" ") + C.chatOutput.stopMusic() SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Hearing Midis", "[usr.client.prefs.toggles & SOUND_MIDI ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Sound/togglemidis/Get_checked(client/C) return C.prefs.toggles & SOUND_MIDI @@ -235,7 +235,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleprayersounds)() SEND_SOUND(usr, sound(null)) var/client/C = usr.client if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded) - C.chatOutput.sendMusic(" ") + C.chatOutput.stopMusic() SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Stop Self Sounds")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm index 0f9b6935d3..d787e7e9a8 100644 --- a/code/modules/client/preferences_vr.dm +++ b/code/modules/client/preferences_vr.dm @@ -5,4 +5,7 @@ /datum/preferences/proc/set_biological_gender(var/gender) biological_gender = gender - identifying_gender = gender \ No newline at end of file + identifying_gender = gender + + +/obj/item/clothing/var/hides_bulges = FALSE // OwO wats this? diff --git a/code/modules/client/verbs/sethotkeys.dm b/code/modules/client/verbs/sethotkeys.dm deleted file mode 100644 index ee14787011..0000000000 --- a/code/modules/client/verbs/sethotkeys.dm +++ /dev/null @@ -1,25 +0,0 @@ -/client/verb/sethotkeys(from_pref = 0 as num) - set name = "Set Hotkeys" - set hidden = TRUE - set waitfor = FALSE - set desc = "Used to set mob-specific hotkeys or load hoykey mode from preferences" - - var/hotkey_default = "default" - var/hotkey_macro = "hotkeys" - var/current_setting - - var/list/default_macros = list("default", "robot-default") - - if(from_pref) - current_setting = (prefs.hotkeys ? hotkey_macro : hotkey_default) - else - current_setting = winget(src, "mainwindow", "macro") - - if(mob) - hotkey_macro = mob.macro_hotkeys - hotkey_default = mob.macro_default - - if(current_setting in default_macros) - winset(src, null, "mainwindow.macro=[hotkey_default] input.focus=true input.background-color=#d3b5b5") - else - winset(src, null, "mainwindow.macro=[hotkey_macro] mapwindow.map.focus=true input.background-color=#e0e0e0") diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index a6b7156ea8..9471f0ab9e 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -21,6 +21,9 @@ if(damagetype & SHAME) adjustStaminaLoss(200) suiciding = FALSE + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + mood.add_event("shameful_suicide", /datum/mood_event/shameful_suicide) return var/damage_mod = 0 for(var/T in list(BRUTELOSS, FIRELOSS, TOXLOSS, OXYLOSS)) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 0cf375c8dd..2ecf385a1f 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -17,7 +17,7 @@ var/list/icon/current = list() //the current hud icons var/vision_correction = 0 //does wearing these glasses correct some of our vision defects? var/glass_colour_type //colors your vision when worn - + /obj/item/clothing/glasses/suicide_act(mob/living/carbon/user) user.visible_message("[user] is stabbing \the [src] into their eyes! It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS @@ -262,6 +262,15 @@ flash_protect = 2 tint = 3 // to make them blind +/obj/item/clothing/glasses/sunglasses/blindfold/equipped(mob/living/carbon/human/user, slot) + . = ..() + if(slot == slot_glasses) + user.become_blind("blindfold_[REF(src)]") + +/obj/item/clothing/glasses/sunglasses/blindfold/dropped(mob/living/carbon/human/user) + ..() + user.cure_blind("blindfold_[REF(src)]") + /obj/item/clothing/glasses/sunglasses/big desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks flashes." icon_state = "bigsunglasses" @@ -402,4 +411,4 @@ if(client && client.prefs.uses_glasses_colour && glasses_equipped) add_client_colour(G.glass_colour_type) else - remove_client_colour(G.glass_colour_type) \ No newline at end of file + remove_client_colour(G.glass_colour_type) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 1a0404430e..09f5993cb4 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -163,7 +163,7 @@ item_state = "lgloves" siemens_coefficient = 0.3 permeability_coefficient = 0.01 - item_color="white" + item_color="mime" transfer_prints = TRUE resistance_flags = NONE @@ -180,7 +180,7 @@ desc = "These look pretty fancy." icon_state = "white" item_state = "wgloves" - item_color="mime" + item_color="white" /obj/item/clothing/gloves/color/white/redcoat item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way. diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index d220018ccc..2d12b450b7 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -6,6 +6,8 @@ * Pumpkin head * Kitty ears * Cardborg disguise + * Wig + * Bronze hat */ /* @@ -219,15 +221,31 @@ hair_color = "#[random_short_color()]" . = ..() +/obj/item/clothing/head/bronze + name = "bronze hat" + desc = "A crude helmet made out of bronze plates. It offers very little in the way of protection." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "clockwork_helmet_old" + flags_inv = HIDEEARS|HIDEHAIR + armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) + /obj/item/clothing/head/foilhat name = "tinfoil hat" desc = "Thought control rays, psychotronic scanning. Don't mind that, I'm protected cause I made this hat." icon_state = "foilhat" item_state = "foilhat" armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0) + equip_delay_other = 140 /obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot) if(slot == slot_head) user.gain_trauma(/datum/brain_trauma/mild/phobia, FALSE, "conspiracies") to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ") - flags_1 |= NODROP_1 + +/obj/item/clothing/head/foilhat/attack_hand(mob/user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(src == C.head) + to_chat(user, "Why would you want to take this off? Do you want them to get into your mind?!") + return + ..() diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 403b81211d..422d4735b2 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -191,3 +191,73 @@ W.assignment = "CentCom Official" W.registered_name = H.real_name W.update_label() + +/datum/outfit/ert/commander/inquisitor + name = "Inquisition Commander" + r_hand = /obj/item/nullrod/scythe/talking/chainsword + suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/clothing/mask/gas/sechailer=1, + /obj/item/gun/energy/e_gun=1) + +/datum/outfit/ert/security/inquisitor + name = "Inquisition Security" + + suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor + + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/storage/box/handcuffs=1, + /obj/item/clothing/mask/gas/sechailer=1, + /obj/item/gun/energy/e_gun/stun=1, + /obj/item/melee/baton/loaded=1, + /obj/item/construction/rcd/loaded=1) + +/datum/outfit/ert/medic/inquisitor + name = "Inquisition Medic" + + suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor + + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/melee/baton/loaded=1, + /obj/item/clothing/mask/gas/sechailer=1, + /obj/item/gun/energy/e_gun=1, + /obj/item/reagent_containers/hypospray/combat=1, + /obj/item/reagent_containers/hypospray/combat/heresypurge=1, + /obj/item/gun/medbeam=1) + +/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + + if(visualsOnly) + return + + var/obj/item/device/radio/R = H.ears + R.keyslot = new /obj/item/device/encryptionkey/heads/hop + R.recalculateChannels() + +/datum/outfit/ert/chaplain + name = "ERT Chaplain" + + suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor // Chap role always gets this suit + id = /obj/item/card/id/ert/chaplain + glasses = /obj/item/clothing/glasses/hud/health + back = /obj/item/storage/backpack/cultpack + belt = /obj/item/storage/belt/soulstone + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/nullrod=1, + /obj/item/clothing/mask/gas/sechailer=1, + /obj/item/gun/energy/e_gun=1, + ) + +/datum/outfit/ert/chaplain/inquisitor + name = "Inquisition Chaplain" + + suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor + + belt = /obj/item/storage/belt/soulstone/full + backpack_contents = list(/obj/item/storage/box/engineer=1, + /obj/item/storage/box/holy_grenades=1, + /obj/item/nullrod=1, + /obj/item/clothing/mask/gas/sechailer=1, + /obj/item/gun/energy/e_gun=1, + ) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index f4c37b281d..e5bc99fabf 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -81,6 +81,20 @@ . = ..() AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50) +/obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot) + . = ..() + if(user.mind && user.mind.assigned_role == "Clown") + GET_COMPONENT_FROM(mood, /datum/component/mood, user) + if(mood) + mood.clear_event("noshoes") + +/obj/item/clothing/shoes/clown_shoes/dropped(mob/user) + . = ..() + if(user.mind && user.mind.assigned_role == "Clown") + GET_COMPONENT_FROM(mood, /datum/component/mood, user) + if(mood) + mood.add_event("noshoes", /datum/mood_event/noshoes) + /obj/item/clothing/shoes/clown_shoes/jester name = "jester shoes" desc = "A court jesters shoes, updated with modern squeaking technology." @@ -229,3 +243,13 @@ desc = "These boots were made for dancing." icon_state = "bsing" equip_delay_other = 50 + +/obj/item/clothing/shoes/bronze + name = "bronze boots" + desc = "A giant, clunky pair of shoes crudely made out of bronze. Why would anyone wear these?" + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "clockwork_treads" + +/obj/item/clothing/shoes/bronze/Initialize() + . = ..() + AddComponent(/datum/component/squeak, list('sound/machines/clockcult/integration_cog_install.ogg' = 1, 'sound/magic/clockwork/fellowship_armory.ogg' = 1), 50) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 154f1bffdd..90ae827957 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -587,3 +587,10 @@ icon_state = "bedsheet" user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150) alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire + +/obj/item/clothing/suit/bronze + name = "bronze suit" + desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "clockwork_cuirass_old" + armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index 91b004e0e0..304ddce7eb 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -2,6 +2,9 @@ GLOBAL_VAR_INIT(total_runtimes, GLOB.total_runtimes || 0) GLOBAL_VAR_INIT(total_runtimes_skipped, 0) #ifdef DEBUG + +#define ERROR_USEFUL_LEN 2 + /world/Error(exception/E, datum/e_src) GLOB.total_runtimes++ diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm new file mode 100644 index 0000000000..be3108b0ec --- /dev/null +++ b/code/modules/events/aurora_caelus.dm @@ -0,0 +1,62 @@ +/datum/round_event_control/aurora_caelus + name = "Aurora Caelus" + typepath = /datum/round_event/aurora_caelus + max_occurrences = 1 + weight = 15 + earliest_start = 5 MINUTES + +/datum/round_event_control/aurora_caelus/canSpawnEvent(players, gamemode) + if(!CONFIG_GET(flag/starlight)) + return FALSE + return ..() + +/datum/round_event/aurora_caelus + announceWhen = 1 + startWhen = 9 + endWhen = 50 + var/list/aurora_colors = list("#A2FF80", "#A2FF8B", "#A2FF96", "#A2FFA5", "#A2FFB6", "#A2FFC7", "#A2FFDE") + var/aurora_progress = 0 //this cycles from 1 to 7, slowly changing colors from gentle green to gentle blue + +/datum/round_event/aurora_caelus/announce() + priority_announce("[station_name()]: A harmless cloud of ions is approaching your station, and will exhaust their energy battering the hull. Nanotrasen has approved a short break for all employees to relax and observe this very rare event. During this time, starlight will be bright but gentle, shifting between quiet green and blue colors. Any staff who would like to view these lights for themselves may proceed to the area nearest to them with viewing ports to open space. We hope you enjoy the lights.", + sound = 'sound/misc/notice2.ogg', + sender_override = "Nanotrasen Meteorology Division") + for(var/V in GLOB.player_list) + var/mob/M = V + if((M.client.prefs.toggles & SOUND_MIDI) && is_station_level(M.z)) + M.playsound_local(M, 'sound/ambience/aurora_caelus.ogg', 20, FALSE, pressure_affected = FALSE) + +/datum/round_event/aurora_caelus/start() + for(var/area in GLOB.sortedAreas) + var/area/A = area + if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) + for(var/turf/open/space/S in A) + S.set_light(S.light_range * 3, S.light_power * 0.5) + +/datum/round_event/aurora_caelus/tick() + if(activeFor % 5 == 0) + aurora_progress++ + var/aurora_color = aurora_colors[aurora_progress] + for(var/area in GLOB.sortedAreas) + var/area/A = area + if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) + for(var/turf/open/space/S in A) + S.set_light(l_color = aurora_color) + +/datum/round_event/aurora_caelus/end() + for(var/area in GLOB.sortedAreas) + var/area/A = area + if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) + for(var/turf/open/space/S in A) + fade_to_black(S) + priority_announce("The aurora caelus event is now ending. Starlight conditions will slowly return to normal. When this has concluded, please return to your workplace and continue work as normal. Have a pleasant shift, [station_name()], and thank you for watching with us.", + sound = 'sound/misc/notice2.ogg', + sender_override = "Nanotrasen Meteorology Division") + +/datum/round_event/aurora_caelus/proc/fade_to_black(turf/open/space/S) + set waitfor = FALSE + var/new_light = initial(S.light_range) + while(S.light_range > new_light) + S.set_light(S.light_range - 0.2) + sleep(30) + S.set_light(new_light, initial(S.light_power), initial(S.light_color)) diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 68ec168a1e..c777fea85b 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -75,4 +75,4 @@ rebel.shoot_inventory = 1 if(ISMULTIPLE(activeFor, 8)) - originMachine.speak(pick(rampant_speeches)) \ No newline at end of file + originMachine.speak(pick(rampant_speeches)) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index c8b8db0681..b19c8358c2 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -39,10 +39,10 @@ continue if(H.stat == DEAD) continue - if(VIRUSIMMUNE in H.dna.species.species_traits) //Don't pick someone who's virus immune, only for it to not do anything. + if(H.has_trait(TRAIT_VIRUSIMMUNE)) //Don't pick someone who's virus immune, only for it to not do anything. continue var/foundAlready = FALSE // don't infect someone that already has a disease - for(var/thing in H.viruses) + for(var/thing in H.diseases) foundAlready = TRUE break if(foundAlready) @@ -63,7 +63,7 @@ else D = make_virus(max_severity, max_severity) D.carrier = TRUE - H.AddDisease(D) + H.ForceContractDisease(D, FALSE, TRUE) if(advanced_virus) var/datum/disease/advance/A = D @@ -75,10 +75,9 @@ break /datum/round_event/disease_outbreak/proc/make_virus(max_symptoms, max_level) - if(max_symptoms > SYMPTOM_LIMIT) - max_symptoms = SYMPTOM_LIMIT - var/datum/disease/advance/A = new(FALSE, null) - A.symptoms = list() + if(max_symptoms > VIRUS_SYMPTOM_LIMIT) + max_symptoms = VIRUS_SYMPTOM_LIMIT + var/datum/disease/advance/A = new /datum/disease/advance() var/list/datum/symptom/possible_symptoms = list() for(var/symptom in subtypesof(/datum/symptom)) var/datum/symptom/S = symptom diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index ebe7dd5bfd..7f9c09dfd9 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -8,7 +8,7 @@ /datum/round_event/heart_attack/start() var/list/heart_attack_contestants = list() for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list)) - if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.viruses) || H.undergoing_cardiac_arrest()) + if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest()) continue if(H.satiety <= -60) //Multiple junk food items recently heart_attack_contestants[H] = 3 @@ -17,6 +17,6 @@ if(LAZYLEN(heart_attack_contestants)) var/mob/living/carbon/human/winner = pickweight(heart_attack_contestants) - var/datum/disease/D = new /datum/disease/heart_failure - winner.ForceContractDisease(D) - notify_ghosts("[winner] is beginning to have a heart attack!", enter_link="(Click to orbit)", source=winner, action=NOTIFY_ORBIT) \ No newline at end of file + var/datum/disease/D = new /datum/disease/heart_failure() + winner.ForceContractDisease(D, FALSE, TRUE) + notify_ghosts("[winner] is beginning to have a heart attack!", enter_link="(Click to orbit)", source=winner, action=NOTIFY_ORBIT) diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index b43b5892ea..693e194d1c 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -9,6 +9,12 @@ earliest_start = 30 MINUTES gamemode_blacklist = list("nuclear") +/datum/round_event_control/pirates/preRunEvent() + if (!SSmapping.empty_space) + return EVENT_CANT_RUN + + return ..() + /datum/round_event/pirates startWhen = 60 //2 minutes to answer var/datum/comm_message/threat diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm index 486065140e..74d9bb273e 100644 --- a/code/modules/events/processor_overload.dm +++ b/code/modules/events/processor_overload.dm @@ -27,14 +27,12 @@ /datum/round_event/processor_overload/start() - for(var/obj/machinery/telecomms/T in GLOB.telecomms_list) - if(istype(T, /obj/machinery/telecomms/processor)) - var/obj/machinery/telecomms/processor/P = T - if(prob(10)) - // Damage the surrounding area to indicate that it popped - explosion(get_turf(P), 0, 0, 2) - // Only a level 1 explosion actually damages the machine - // at all - P.ex_act(EXPLODE_DEVASTATE) - else - P.emp_act(EMP_HEAVY) + for(var/obj/machinery/telecomms/processor/P in GLOB.telecomms_list) + if(prob(10)) + // Damage the surrounding area to indicate that it popped + explosion(get_turf(P), 0, 0, 2) + // Only a level 1 explosion actually damages the machine + // at all + P.ex_act(EXPLODE_DEVASTATE) + else + P.emp_act(EMP_HEAVY) diff --git a/code/modules/events/solar_flare.dm b/code/modules/events/solar_flare.dm deleted file mode 100644 index 5f64570c7d..0000000000 --- a/code/modules/events/solar_flare.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/round_event_control/solar_flare - name = "Solar Flare" - typepath = /datum/round_event/solar_flare - max_occurrences = 1 - -/datum/round_event/solar_flare - -/datum/round_event/solar_flare/setup() - startWhen = 3 - endWhen = startWhen + 1 - announceWhen = 1 - -/datum/round_event/solar_flare/announce() - priority_announce("Incoming solar flare detected near the station. Expect power outages in all exposed areas for a short duration.", "Anomaly Alert", 'sound/effects/alert.ogg') - -/datum/round_event/solar_flare/start() - SSweather.run_weather("solar flare",1) diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index dfceb682cd..1407a98518 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -18,12 +18,12 @@ if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured continue var/foundAlready = FALSE //don't infect someone that already has appendicitis - for(var/datum/disease/appendicitis/A in H.viruses) + for(var/datum/disease/appendicitis/A in H.diseases) foundAlready = TRUE break if(foundAlready) continue - var/datum/disease/D = new /datum/disease/appendicitis - H.ForceContractDisease(D) + var/datum/disease/D = new /datum/disease/appendicitis() + H.ForceContractDisease(D, FALSE, TRUE) break \ No newline at end of file diff --git a/code/modules/fields/timestop.dm b/code/modules/fields/timestop.dm index 232e3c5dce..11a5d416e7 100644 --- a/code/modules/fields/timestop.dm +++ b/code/modules/fields/timestop.dm @@ -29,6 +29,9 @@ for(var/mob/living/L in GLOB.player_list) if(locate(/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop) in L.mind.spell_list) //People who can stop time are immune to its effects immune[L] = TRUE + for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.parasites) + if(G.summoner && locate(/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop) in G.summoner.mind.spell_list) //It would only make sense that a person's stand would also be immune. + immune[G] = TRUE if(start) timestop() diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm index edb1a6ce6b..7d7454f46a 100644 --- a/code/modules/fields/turf_objects.dm +++ b/code/modules/fields/turf_objects.dm @@ -74,4 +74,4 @@ return FIELD_EDGE if(O.parent == F) return FIELD_TURF - return NO_FIELD + return FALSE diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index f334368a7a..c912a9b4e8 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -1197,3 +1197,28 @@ GLOBAL_LIST_INIT(hallucinations_major, list( H.preparePixelProjectile(target, start) H.fire() qdel(src) + +//Reality Dissociation Syndrome hallucinations only trigger in special cases and have no cost +/datum/hallucination/rds + cost = 0 + +/datum/hallucination/rds/fourth_wall/New(mob/living/carbon/C, forced = TRUE) + ..() + to_chat(C, "[pick("Leave the server" , "Close the game window")] [pick("immediately", "right now")].") + +/datum/hallucination/rds/supermatter/New(mob/living/carbon/C, forced = TRUE) + ..() + SEND_SOUND(C, 'sound/magic/charge.ogg') + to_chat(C, "You feel reality distort for a moment...") + +/datum/hallucination/rds/narsie/New(mob/living/carbon/C, forced = TRUE) + C.playsound_local(C, 'sound/creatures/narsie_rises.ogg', 50, FALSE, pressure_affected = FALSE) + to_chat(C, "NAR-SIE HAS RISEN") + +/datum/hallucination/rds/ark/New(mob/living/carbon/C, forced = TRUE) + set waitfor = FALSE + ..() + C.playsound_local(C, 'sound/machines/clockcult/ark_deathrattle.ogg', 50, FALSE, pressure_affected = FALSE) + C.playsound_local(C, 'sound/effects/clockcult_gateway_disrupted.ogg', 50, FALSE, pressure_affected = FALSE) + sleep(27) + C.playsound_local(C, 'sound/effects/explosion_distant.ogg', 50, FALSE, pressure_affected = FALSE) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 637c6c279d..bbc56f9fe4 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -21,7 +21,7 @@ else gulp_size = max(round(reagents.total_volume / 5), 5) -/obj/item/reagent_containers/food/drinks/attack(mob/M, mob/user, def_zone) +/obj/item/reagent_containers/food/drinks/attack(mob/living/M, mob/user, def_zone) if(!reagents || !reagents.total_volume) to_chat(user, "[src] is empty!") @@ -36,6 +36,8 @@ if(M == user) to_chat(M, "You swallow a gulp of [src].") + if(M.has_trait(TRAIT_VORACIOUS)) + M.changeNext_move(CLICK_CD_MELEE * 0.5) //chug! chug! chug! else M.visible_message("[user] attempts to feed the contents of [src] to [M].", "[user] attempts to feed the contents of [src] to [M].") diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 5e05e85a28..4e38cb81d9 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -19,13 +19,27 @@ if(last_check_time + 50 < world.time) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(foodtype & H.dna.species.toxic_food) - to_chat(H,"What the hell was that thing?!") - H.adjust_disgust(25 + 30 * fraction) - else if(foodtype & H.dna.species.disliked_food) - to_chat(H,"That didn't taste very good...") - H.adjust_disgust(11 + 15 * fraction) - else if(foodtype & H.dna.species.liked_food) - to_chat(H,"I love this taste!") - H.adjust_disgust(-5 + -2.5 * fraction) + if(!H.has_trait(TRAIT_AGEUSIA)) + if(foodtype & H.dna.species.toxic_food) + to_chat(H,"What the hell was that thing?!") + H.adjust_disgust(25 + 30 * fraction) + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(mood) + mood.add_event("toxic_food", /datum/mood_event/disgusting_food) + else if(foodtype & H.dna.species.disliked_food) + to_chat(H,"That didn't taste very good...") + H.adjust_disgust(11 + 15 * fraction) + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(mood) + mood.add_event("gross_food", /datum/mood_event/gross_food) + else if(foodtype & H.dna.species.liked_food) + to_chat(H,"I love this taste!") + H.adjust_disgust(-5 + -2.5 * fraction) + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(mood) + mood.add_event("fav_food", /datum/mood_event/favorite_food) + else + if(foodtype & H.dna.species.toxic_food) + to_chat(H, "You don't feel so good...") + H.adjust_disgust(25 + 30 * fraction) last_check_time = world.time diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index b46165cb80..c8b9a2bd17 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -50,7 +50,7 @@ return -/obj/item/reagent_containers/food/snacks/attack(mob/M, mob/user, def_zone) +/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/user, def_zone) if(user.a_intent == INTENT_HARM) return ..() if(!eatverb) @@ -82,6 +82,8 @@ else if(fullness > (600 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat to_chat(M, "You cannot force any more of \the [src] to go down your throat!") return 0 + if(M.has_trait(TRAIT_VORACIOUS)) + M.changeNext_move(CLICK_CD_MELEE * 0.5) //nom nom nom else if(!isbrain(M)) //If you're feeding it to someone else. if(fullness <= (600 * (1 + M.overeatduration / 1000))) diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index bb74b36053..cbe93f7003 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -113,6 +113,7 @@ list_reagents = list("nutriment" = 6, "vitamin" = 1) tastes = list("meat" = 1) foodtype = MEAT + var/roasted = FALSE /obj/item/reagent_containers/food/snacks/sausage/Initialize() . = ..() @@ -187,7 +188,7 @@ visible_message("[src] expands!") var/mob/spammer = get_mob_by_key(fingerprintslast) var/mob/living/carbon/monkey/bananas = new(drop_location()) - bananas.log_message("Spawned via [src] at [COORD(src)], Last attached mob: [key_name(spammer)].", INDIVIDUAL_ATTACK_LOG) + bananas.log_message("Spawned via [src] at [COORD(src)], Last attached mob: [key_name(spammer)].", INDIVIDUAL_ATTACK_LOG) qdel(src) /obj/item/reagent_containers/food/snacks/enchiladas diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 0139ab116c..6bc5edf096 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -459,4 +459,4 @@ . = O.attack(M, user, def_zone, FALSE) update_icon() -#undef PANCAKE_MAX_STACK \ No newline at end of file +#undef PANCAKE_MAX_STACK diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index faffdf5383..1f755e24b2 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -56,6 +56,9 @@ if(!H.creamed) // one layer at a time H.add_overlay(creamoverlay) H.creamed = TRUE + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(mood) + mood.add_event("creampie", /datum/mood_event/creampie) qdel(src) /obj/item/reagent_containers/food/snacks/pie/cream/nostun @@ -244,4 +247,4 @@ icon_state = "frostypie" bonus_reagents = list("nutriment" = 4, "vitamin" = 6) tastes = list("mint" = 1, "pie" = 1) - foodtype = GRAIN | FRUIT | SUGAR \ No newline at end of file + foodtype = GRAIN | FRUIT | SUGAR diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index cfbc95d7c0..d816504bc5 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -381,7 +381,7 @@ return TRUE if(!O.reagents || !O.reagents.reagent_list.len) // other empty containers not accepted return FALSE - if(istype(O, /obj/item/reagent_containers/syringe) || istype(O, /obj/item/reagent_containers/glass/bottle) || istype(O, /obj/item/reagent_containers/glass/beaker) || istype(O, /obj/item/reagent_containers/spray)) + if(istype(O, /obj/item/reagent_containers/syringe) || istype(O, /obj/item/reagent_containers/glass/bottle) || istype(O, /obj/item/reagent_containers/glass/beaker) || istype(O, /obj/item/reagent_containers/spray) || istype(O, /obj/item/reagent_containers/medspray)) return TRUE return FALSE diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 3ac4ec1cab..65a08d8074 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -78,11 +78,17 @@ results = list("gintonic" = 3) required_reagents = list("gin" = 2, "tonic" = 1) +/datum/chemical_reaction/rum_coke + name = "Rum and Coke" + id = "rumcoke" + results = list("rumcoke" = 3) + required_reagents = list("rum" = 2, "cola" = 1) + /datum/chemical_reaction/cuba_libre name = "Cuba Libre" id = "cubalibre" - results = list("cubalibre" = 3) - required_reagents = list("rum" = 2, "cola" = 1) + results = list("cubalibre" = 4) + required_reagents = list("rumcoke" = 3, "limejuice" = 1) /datum/chemical_reaction/martini name = "Classic Martini" diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 10b1fcd80d..401e55c9e5 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -125,11 +125,16 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic C << output("[data]", "[window]:ehjaxCallback") /datum/chatOutput/proc/sendMusic(music, pitch) + if(!findtext(music, GLOB.is_http_protocol)) + return var/list/music_data = list("adminMusic" = url_encode(url_encode(music))) if(pitch) music_data["musicRate"] = pitch ehjax_send(data = music_data) +/datum/chatOutput/proc/stopMusic() + ehjax_send(data = "stopMusic") + /datum/chatOutput/proc/setMusicVolume(volume = "") if(volume) adminMusicVolume = CLAMP(text2num(volume), 0, 100) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index d2f81e497e..778e16a831 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -316,6 +316,7 @@ h1.alert, h2.alert {color: #000000;} .unconscious {color: #0000ff; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} .green {color: #03ff39;} +.nicegreen {color: #14a833;} .shadowling {color: #3b2769;} .cult {color: #960000;} diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 77aae1148a..478ddcccdd 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -442,6 +442,8 @@ function ehjaxCallback(data) { } else if (data == 'roundrestart') { opts.restarting = true; internalOutput('
The connection has been closed because the server is restarting. Please wait while you automatically reconnect.
', 'internal'); + } else if (data == 'stopMusic') { + $('#adminMusic').prop('src', ''); } else { //Oh we're actually being sent data instead of an instruction var dataJ; diff --git a/code/modules/holodeck/computer_funcs.dm b/code/modules/holodeck/computer_funcs.dm deleted file mode 100644 index 65741eafea..0000000000 --- a/code/modules/holodeck/computer_funcs.dm +++ /dev/null @@ -1,111 +0,0 @@ -/obj/machinery/computer/holodeck/attack_hand(var/mob/user as mob) - user.set_machine(src) - - var/dat = "

Current Loaded Programs

" - dat += "Power Off
" - for(var/area/A in program_cache) - dat += "[A.name]
" - if(emagged && emag_programs.len) - dat += "SUPERVISOR ACCESS - SAFETY PROTOCOLS DISABLED - CAUTION: EMITTER ANOMALY
" - for(var/area/A in emag_programs) - dat += "[A.name]
" - - var/datum/browser/popup = new(user, "computer", name, 400, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/holodeck/attack_ai(var/mob/user as mob) - var/dat = "

Current Loaded Programs

" - - dat += "Power Off
" - for(var/area/A in program_cache) - dat += "[A.name]
" - - if(emag_programs.len) - dat += "
" - if(emagged) - dat += "Safety protocol: Offline Engage
" - for(var/area/A in emag_programs) - dat += "[A.name]
" - else - dat += "Safety protocol: Online Disengage
" - - var/datum/browser/popup = new(user, "computer", name, 400, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - - -/obj/machinery/computer/holodeck/proc/load_program(var/area/A, var/force = 0, var/delay = 0) - if(stat) - A = offline_program - force = 1 - delay = 0 - if(program == A) - return - if(world.time < (last_change + 25 + (damaged?500:0)) && !force) - if(delay) - sleep(25) - else - if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve - return - if(get_dist(usr,src) <= 3) - to_chat(usr, "ERROR. Recalibrating projection apparatus.") - return - - last_change = world.time - active = (A != offline_program) - use_power = active ? ACTIVE_POWER_USE : IDLE_POWER_USE - - for(var/obj/effect/holodeck_effect/HE in effects) - HE.deactivate(src) - - for(var/item in spawned) - derez(item, forced=force) - - program = A - // note nerfing does not yet work on guns, should - // should also remove/limit/filter reagents? - // this is an exercise left to others I'm afraid. -Sayu - spawned = A.copy_contents_to(linked, 1, nerf_weapons = !emagged) - for(var/obj/machinery/M in spawned) - M.flags_1 |= NODECONSTRUCT_1 - for(var/obj/structure/S in spawned) - S.flags_1 |= NODECONSTRUCT_1 - effects = list() - - spawn(30) - var/list/added = list() - for(var/obj/effect/holodeck_effect/HE in spawned) - effects += HE - spawned -= HE - var/atom/x = HE.activate(src) - if(istype(x) || islist(x)) - spawned += x // holocarp are not forever - added += x - for(var/obj/machinery/M in added) - M.flags_1 |= NODECONSTRUCT_1 - for(var/obj/structure/S in added) - S.flags_1 |= NODECONSTRUCT_1 - -/obj/machinery/computer/holodeck/proc/derez(var/obj/obj, var/silent = 1, var/forced = 0) - // Emagging a machine creates an anomaly in the derez systems. - if(obj && src.emagged && !src.stat && !forced) - if((ismob(obj) || istype(obj.loc,/mob)) && prob(50)) - spawn(50) .(obj,silent) // may last a disturbingly long time - return - spawned.Remove(obj) - - if(!obj) - return - var/turf/T = get_turf(obj) - for(var/atom/movable/AM in obj.contents) // these should be derezed if they were generated - AM.loc = T - if(ismob(AM)) - silent = FALSE // otherwise make sure they are dropped - - if(!silent) - visible_message("The [obj.name] fades away!") - qdel(obj) diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index b1ac5604b4..352d4eff7b 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -23,9 +23,6 @@ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' reagents_add = list("morphine" = 0.35, "charcoal" = 0.35, "nutriment" = 0) - - - /obj/item/reagent_containers/food/snacks/grown/mushroom/reishi seed = /obj/item/seeds/reishi name = "reishi" diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index 9ec936c1f2..bb1a0d2f23 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -56,11 +56,8 @@ var/mob/living/carbon/C = user if(C.gloves) return FALSE - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(H.dna && H.dna.species) - if(PIERCEIMMUNE in H.dna.species.species_traits) - return FALSE + if(C.has_trait(TRAIT_PIERCEIMMUNE)) + return FALSE var/hit_zone = (C.held_index_to_dir(C.active_hand_index) == "l" ? "l_":"r_") + "arm" var/obj/item/bodypart/affecting = C.get_bodypart(hit_zone) if(affecting) diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index bb928c6fa5..3c49b113e9 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -20,6 +20,7 @@ var/blood_type = null var/list/features = null var/factions = null + var/list/traits = null var/contains_sample = 0 /obj/item/seeds/replicapod/attackby(obj/item/W, mob/user, params) @@ -34,6 +35,7 @@ blood_type = bloodSample.data["blood_type"] features = bloodSample.data["features"] factions = bloodSample.data["factions"] + traits = bloodSample.data["traits"] W.reagents.clear_reagents() to_chat(user, "You inject the contents of the syringe into the seeds.") contains_sample = 1 @@ -99,6 +101,8 @@ podman.faction |= factions if(!features["mcolor"]) features["mcolor"] = "#59CE00" + for(var/V in traits) + new V(podman) podman.hardset_dna(null,null,podman.real_name,blood_type, new /datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman podman.set_cloned_appearance() diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 399debfe95..71605fc0dc 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -3,6 +3,7 @@ /obj/item/device/electronic_assembly name = "electronic assembly" + obj_flags = CAN_BE_HIT desc = "It's a case, for building small electronics with." w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/assemblies/electronic_setups.dmi' @@ -20,6 +21,8 @@ var/charge_tick = FALSE var/charge_delay = 4 var/use_cyborg_cell = TRUE + var/ext_next_use = 0 + var/atom/movable/collw var/allowed_circuit_action_flags = IC_ACTION_COMBAT | IC_ACTION_LONG_RANGE //which circuit flags are allowed var/combat_circuits = 0 //number of combat cicuits in the assembly, used for diagnostic hud var/long_range_circuits = 0 //number of long range cicuits in the assembly, used for diagnostic hud @@ -31,6 +34,9 @@ /obj/item/device/electronic_assembly/proc/check_interactivity(mob/user) return user.canUseTopic(src, BE_CLOSE) +/obj/item/device/electronic_assembly/CollidedWith(atom/movable/AM) + collw = AM + ..() /obj/item/device/electronic_assembly/Initialize() .=..() diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index ce55a50151..1b99b00765 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -15,7 +15,8 @@ var/next_use = 0 // Uses world.time var/complexity = 1 // This acts as a limitation on building machines, more resource-intensive components cost more 'space'. var/size = 1 // This acts as a limitation on building machines, bigger components cost more 'space'. -1 for size 0 - var/cooldown_per_use = 9 // Circuits are limited in how many times they can be work()'d by this variable. + var/cooldown_per_use = 1 // Circuits are limited in how many times they can be work()'d by this variable. + var/ext_cooldown = 0 // Circuits are limited in how many times they can be work()'d with external world by this variable. var/power_draw_per_use = 0 // How much power is drawn when work()'d. var/power_draw_idle = 0 // How much power is drawn when doing nothing. var/spawn_flags // Used for world initializing, see the #defines above. @@ -212,6 +213,9 @@ a creative player the means to solve many problems. Circuits are held inside an HTML += "" HTML += "
Complexity: [complexity]" + HTML += "
Cooldown per use: [cooldown_per_use/10] sec" + if(ext_cooldown) + HTML += "
External manipulation cooldown: [ext_cooldown/10] sec" if(power_draw_idle) HTML += "
Power Draw: [power_draw_idle] W (Idle)" if(power_draw_per_use) @@ -301,11 +305,15 @@ a creative player the means to solve many problems. Circuits are held inside an /obj/item/integrated_circuit/proc/check_then_do_work(ord,var/ignore_power = FALSE) if(world.time < next_use) // All intergrated circuits have an internal cooldown, to protect from spam. return FALSE + if(assembly && ext_cooldown && (world.time < assembly.ext_next_use)) // Some circuits have external cooldown, to protect from spam. + return FALSE if(power_draw_per_use && !ignore_power) if(!check_power()) power_fail() return FALSE next_use = world.time + cooldown_per_use + if(assembly) + assembly.ext_next_use = world.time + ext_cooldown do_work(ord) return TRUE diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index e1ec172710..5576b42afc 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -12,7 +12,7 @@ var/debug = FALSE // If it's upgraded and can clone, even without config settings. var/current_category = null var/cloning = FALSE // If the printer is currently creating a circuit - var/clone_countdown = 0 // This counts down when cloning is in progress, and clones the circuit when it's ready + var/clone_countdown = 0 // Timestamp for when to print the circuit var/recycling = FALSE // If an assembly is being emptied into this printer var/list/program // Currently loaded save, in form of list @@ -27,6 +27,8 @@ /obj/item/device/integrated_circuit_printer/debug //translation: "integrated_circuit_printer/local_server" name = "debug circuit printer" debug = TRUE + upgraded = TRUE + can_clone = TRUE w_class = WEIGHT_CLASS_TINY /obj/item/device/integrated_circuit_printer/Initialize() @@ -40,8 +42,7 @@ /obj/item/device/integrated_circuit_printer/process() if(!cloning) STOP_PROCESSING(SSprocessing, src) - clone_countdown-- - if(!clone_countdown || fast_clone) + if(world.time >= clone_countdown || fast_clone) var/turf/T = get_turf(src) T.visible_message("[src] has finished printing its assembly!") playsound(get_turf(T), 'sound/items/poster_being_created.ogg', 50, TRUE) @@ -56,7 +57,6 @@ return TRUE to_chat(user, "You install [O] into [src]. ") upgraded = TRUE - qdel(O) interact(user) return TRUE @@ -66,7 +66,6 @@ return TRUE to_chat(user, "You install [O] into [src]. Circuit cloning will now be instant. ") fast_clone = TRUE - qdel(O) interact(user) return TRUE @@ -142,7 +141,7 @@ if(!program) HTML += " {[fast_clone ? "Print" : "Begin Printing"] Assembly}" else if(cloning) - HTML += " {Cancel Print} - [clone_countdown] second(s) remaining until completion" + HTML += " {Cancel Print} - [DisplayTimeText(max(0, clone_countdown - world.time))] remaining until completion" else HTML += " {[fast_clone ? "Print" : "Begin Printing"] Assembly}" @@ -273,11 +272,11 @@ if(!materials.use_amount_type(program["metal_cost"], MAT_METAL)) to_chat(usr, "You need [program["metal_cost"]] metal to build that!") return - var/cloning_time = program["metal_cost"] / 150 + var/cloning_time = round(program["metal_cost"] / 15) cloning_time = min(cloning_time, MAX_CIRCUIT_CLONE_TIME) cloning = TRUE - clone_countdown = cloning_time - to_chat(usr, "You begin printing a custom assembly. This will take approximately [round(cloning_time / 60, 0.1)] minute(s). You can still print \ + clone_countdown = world.time + cloning_time + to_chat(usr, "You begin printing a custom assembly. This will take approximately [DisplayTimeText(cloning_time)]. You can still print \ off normal parts during this time.") playsound(src, 'sound/items/poster_being_created.ogg', 50, TRUE) START_PROCESSING(SSprocessing, src) diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index f7df21fc9a..186a2df257 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -97,11 +97,15 @@ activators = list() spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH var/volume = 60 - var/list/fuel = list("plasma" = 10000, "welding_fuel" = 3000, "carbon" = 2000, "ethanol" = 2000, "nutriment" = 1600, "blood" = 1000) + var/list/fuel = list("plasma" = 50000, "welding_fuel" = 15000, "carbon" = 10000, "ethanol" = 10000, "nutriment" = 8000) + var/multi = 1 + var/lfwb =TRUE /obj/item/integrated_circuit/passive/power/chemical_cell/New() ..() create_reagents(volume) + extended_desc +="But no fuel can be compared with blood of living human." + /obj/item/integrated_circuit/passive/power/chemical_cell/interact(mob/user) set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) @@ -115,7 +119,18 @@ /obj/item/integrated_circuit/passive/power/chemical_cell/make_energy() if(assembly) if(assembly.battery) + var/bp = 5000 + if(reagents.get_reagent_amount("blood")) //only blood is powerful enough to power the station(c) + var/datum/reagent/blood/B = locate() in reagents.reagent_list + if(lfwb) + if(B && B.data["cloneable"]) + var/mob/M = B.data["donor"] + if(M && M.stat != DEAD && M.client) + bp = 500000 + if((assembly.battery.maxcharge-assembly.battery.charge) / GLOB.CELLRATE > bp) + if(reagents.remove_reagent("blood", 1)) + assembly.give_power(bp) for(var/I in fuel) if((assembly.battery.maxcharge-assembly.battery.charge) / GLOB.CELLRATE > fuel[I]) if(reagents.remove_reagent(I, 1)) - assembly.give_power(fuel[I]) + assembly.give_power(fuel[I]*multi) diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm new file mode 100644 index 0000000000..0f0626057a --- /dev/null +++ b/code/modules/integrated_electronics/subtypes/access.dm @@ -0,0 +1,37 @@ +/obj/item/integrated_circuit/input/card_reader + name = "card reader" + desc = "A circuit that can read registred name, assignment and a PassKey string from an ID card." + icon_state = "card_reader" + + complexity = 4 + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + outputs = list( + "registered name" = IC_PINTYPE_STRING, + "assignment" = IC_PINTYPE_STRING, + "passkey" = IC_PINTYPE_STRING + ) + activators = list( + "on read" = IC_PINTYPE_PULSE_OUT + ) + +/obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/living/user, intent) + var/obj/item/card/id/card = I.GetID() + var/list/access = I.GetAccess() + var/passkey = strtohex(XorEncrypt(json_encode(access), SScircuit.cipherkey)) + + if(card) // An ID card. + set_pin_data(IC_OUTPUT, 1, card.registered_name) + set_pin_data(IC_OUTPUT, 2, card.assignment) + + else if(length(access)) // A non-card object that has access levels. + set_pin_data(IC_OUTPUT, 1, null) + set_pin_data(IC_OUTPUT, 2, null) + + else + return FALSE + + set_pin_data(IC_OUTPUT, 3, passkey) + + push_data() + activate_pin(1) + return TRUE diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 6eb0dd0a1e..c666f05d88 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -416,6 +416,7 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 30 var/radius = 1 + cooldown_per_use = 10 /obj/item/integrated_circuit/input/advanced_locator_list/on_data_written() var/rad = get_pin_data(IC_INPUT, 2) @@ -526,7 +527,7 @@ action_flags = IC_ACTION_LONG_RANGE power_draw_idle = 5 power_draw_per_use = 40 - + cooldown_per_use = 5 var/frequency = FREQ_SIGNALER var/code = DEFAULT_SIGNALER_CODE var/datum/radio_frequency/radio_connection @@ -583,9 +584,7 @@ return 0 activate_pin(3) - - for(var/mob/O in hearers(1, get_turf(src))) - audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 1) + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 1) /obj/item/integrated_circuit/input/ntnet_packet name = "NTNet networking circuit" @@ -596,6 +595,7 @@ can be send to multiple recepients. Addresses must be separated with ; symbol." icon_state = "signal" complexity = 4 + cooldown_per_use = 5 inputs = list( "target NTNet addresses"= IC_PINTYPE_STRING, "data to send" = IC_PINTYPE_STRING, @@ -629,17 +629,16 @@ var/datum/netdata/data = new data.recipient_ids = splittext(target_address, ";") - data.sender_id = address data.plaintext_data = message data.plaintext_data_secondary = text - data.plaintext_passkey = key + data.encrypted_passkey = key ntnet_send(data) /obj/item/integrated_circuit/input/ntnet_recieve(datum/netdata/data) set_pin_data(IC_OUTPUT, 1, data.sender_id) set_pin_data(IC_OUTPUT, 2, data.plaintext_data) set_pin_data(IC_OUTPUT, 3, data.plaintext_data_secondary) - set_pin_data(IC_OUTPUT, 4, data.plaintext_passkey) + set_pin_data(IC_OUTPUT, 4, data.encrypted_passkey) push_data() activate_pin(2) @@ -886,9 +885,9 @@ if(net) set_pin_data(IC_OUTPUT, 1, net.hardware_id) + push_data() activate_pin(2) else set_pin_data(IC_OUTPUT, 1, null) + push_data() activate_pin(3) - push_data() - return diff --git a/code/modules/integrated_electronics/subtypes/lists.dm b/code/modules/integrated_electronics/subtypes/lists.dm index aa373c9940..9f7dbe078b 100644 --- a/code/modules/integrated_electronics/subtypes/lists.dm +++ b/code/modules/integrated_electronics/subtypes/lists.dm @@ -13,6 +13,7 @@ ) category_text = "Lists" power_draw_per_use = 20 + cooldown_per_use = 10 /obj/item/integrated_circuit/lists/pick name = "pick circuit" @@ -28,6 +29,7 @@ "on failure" = IC_PINTYPE_PULSE_OUT, ) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + cooldown_per_use = 1 /obj/item/integrated_circuit/lists/pick/do_work() var/list/input_list = get_pin_data(IC_INPUT, 1) // List pins guarantee that there is a list inside, even if just an empty one. @@ -83,6 +85,7 @@ ) icon_state = "addition" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + cooldown_per_use = 1 /obj/item/integrated_circuit/lists/search/do_work() var/list/input_list = get_pin_data(IC_INPUT, 1) @@ -115,6 +118,7 @@ ) icon_state = "addition" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + cooldown_per_use = 1 /obj/item/integrated_circuit/lists/at/do_work() var/list/input_list = get_pin_data(IC_INPUT, 1) @@ -218,6 +222,7 @@ set_pin_data(IC_OUTPUT, 1, input_list.len) push_data() activate_pin(2) + cooldown_per_use = 1 /obj/item/integrated_circuit/lists/jointext @@ -240,6 +245,7 @@ ) icon_state = "addition" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + cooldown_per_use = 1 /obj/item/integrated_circuit/lists/jointext/do_work() var/list/input_list = get_pin_data(IC_INPUT, 1) @@ -312,7 +318,7 @@ ) outputs = list() spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/number_of_pins = 4 + var/number_of_pins = 16 /obj/item/integrated_circuit/lists/deconstructor/Initialize() for(var/i = 1 to number_of_pins) diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index ddac72a76a..b30500fad4 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -25,6 +25,7 @@ spawn_flags = IC_SPAWN_RESEARCH action_flags = IC_ACTION_COMBAT power_draw_per_use = 0 + ext_cooldown = 1 var/mode = FALSE var/stun_projectile = null //stun mode projectile type @@ -57,7 +58,7 @@ if(gun_properties["shot_delay"]) cooldown_per_use = gun_properties["shot_delay"]*10 if(cooldown_per_use<30) - cooldown_per_use = 40 + cooldown_per_use = 30 if(gun_properties["reqpower"]) power_draw_per_use = gun_properties["reqpower"] set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun)) @@ -139,8 +140,10 @@ being held, or anchored in some way. It should be noted that the ability to move is dependant on the type of assembly that this circuit inhabits." w_class = WEIGHT_CLASS_SMALL complexity = 20 + cooldown_per_use = 8 + ext_cooldown = 1 inputs = list("direction" = IC_PINTYPE_DIR) - outputs = list() + outputs = list("obstacle" = IC_PINTYPE_REF) activators = list("step towards dir" = IC_PINTYPE_PULSE_IN,"on step"=IC_PINTYPE_PULSE_OUT,"blocked"=IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_RESEARCH action_flags = IC_ACTION_MOVEMENT @@ -159,6 +162,7 @@ activate_pin(2) return else + set_pin_data(IC_OUTPUT, 1, WEAKREF(assembly.collw)) activate_pin(3) return FALSE return FALSE @@ -171,6 +175,7 @@ Beware: Once primed there is no aborting the process!" icon_state = "grenade" complexity = 30 + cooldown_per_use = 10 inputs = list("detonation time" = IC_PINTYPE_NUMBER) outputs = list() activators = list("prime grenade" = IC_PINTYPE_PULSE_IN) @@ -241,6 +246,7 @@ icon_state = "plant_m" extended_desc = "The circuit accepts a reference to a hydroponic tray in an adjacent tile. \ Mode(0- harvest, 1-uproot weeds, 2-uproot plant) determinies action." + cooldown_per_use = 10 w_class = WEIGHT_CLASS_TINY complexity = 10 inputs = list("target" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_NUMBER) @@ -300,7 +306,7 @@ extended_desc = "The circuit accepts a reference to an object to be grabbed and can store up to 10 objects. Modes: 1 to grab, 0 to eject the first object, and -1 to eject all objects." w_class = WEIGHT_CLASS_SMALL size = 3 - + cooldown_per_use = 5 complexity = 10 inputs = list("target" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_NUMBER) outputs = list("first" = IC_PINTYPE_REF, "last" = IC_PINTYPE_REF, "amount" = IC_PINTYPE_NUMBER,"contents" = IC_PINTYPE_LIST) @@ -362,13 +368,14 @@ extended_desc = "The circuit accepts a reference to thing to be pulled. Modes: 0 for release. 1 for pull." w_class = WEIGHT_CLASS_SMALL size = 3 - + cooldown_per_use = 5 complexity = 10 inputs = list("target" = IC_PINTYPE_REF,"mode" = IC_PINTYPE_INDEX) outputs = list("is pulling" = IC_PINTYPE_BOOLEAN) activators = list("pulse in" = IC_PINTYPE_PULSE_IN,"pulse out" = IC_PINTYPE_PULSE_OUT,"released" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_RESEARCH power_draw_per_use = 50 + ext_cooldown = 1 var/max_grab = GRAB_PASSIVE /obj/item/integrated_circuit/manipulation/claw/do_work() @@ -403,6 +410,8 @@ complexity = 15 w_class = WEIGHT_CLASS_SMALL size = 2 + cooldown_per_use = 10 + ext_cooldown = 1 inputs = list( "target X rel" = IC_PINTYPE_NUMBER, "target Y rel" = IC_PINTYPE_NUMBER, diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 649c66ae3d..88c6530ccb 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -3,6 +3,7 @@ /obj/item/integrated_circuit/output/screen name = "small screen" + extended_desc = " use <br> to start a new line" desc = "Takes any data type as an input, and displays it to the user upon examining." icon_state = "screen" inputs = list("displayed data" = IC_PINTYPE_ANY) @@ -10,6 +11,8 @@ activators = list("load data" = IC_PINTYPE_PULSE_IN) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 10 + cooldown_per_use = 10 + var/eol = "<br>" var/stuff_to_display = null /obj/item/integrated_circuit/output/screen/disconnect_all() @@ -30,7 +33,7 @@ if(d) stuff_to_display = "[d]" else - stuff_to_display = I.data + stuff_to_display = replacetext("[I.data]", eol , "
") /obj/item/integrated_circuit/output/screen/medium name = "screen" @@ -219,6 +222,7 @@ desc = "Takes any string as an input and will make the device say the string when pulsed." extended_desc = "This unit is more advanced than the plain speaker circuit, able to transpose any valid text to speech." icon_state = "speaker" + ext_cooldown = 2 complexity = 12 inputs = list("text" = IC_PINTYPE_STRING) outputs = list() diff --git a/code/modules/integrated_electronics/subtypes/power.dm b/code/modules/integrated_electronics/subtypes/power.dm index 872f70a20f..7db6ecfcc8 100644 --- a/code/modules/integrated_electronics/subtypes/power.dm +++ b/code/modules/integrated_electronics/subtypes/power.dm @@ -28,7 +28,8 @@ extended_desc = "This circuit transmits 20 kJ of electricity every time the activator pin is pulsed. The input pin must be \ a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \ inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \ - some power is lost due to ineffiency." + some power is lost due to ineffiency.Warning!Don't stack more than 1 power transmittors.it becomes less efficient for every other \ + transmission circuit in its own assembly and other nearby ones. " w_class = WEIGHT_CLASS_BULKY complexity = 32 power_draw_per_use = 2000 @@ -49,6 +50,8 @@ if(A.Adjacent(B)) if(AM.loc != assembly) transfer_amount *= 0.8 // Losses due to distance. + var/list/U=A.GetAllContents(/obj/item/integrated_circuit/power/transmitter) + transfer_amount *= 1 / U.len set_pin_data(IC_OUTPUT, 1, cell.charge) set_pin_data(IC_OUTPUT, 2, cell.maxcharge) set_pin_data(IC_OUTPUT, 3, cell.percent()) @@ -61,7 +64,6 @@ if(istype(AM, /obj/item)) var/obj/item/I = AM I.update_icon() - return TRUE else set_pin_data(IC_OUTPUT, 1, null) diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 9e267b120c..2cd3ccb8cf 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -3,6 +3,7 @@ /obj/item/integrated_circuit/reagent category_text = "Reagent" resistance_flags = UNACIDABLE | FIRE_PROOF + cooldown_per_use = 10 var/volume = 0 /obj/item/integrated_circuit/reagent/Initialize() @@ -21,7 +22,7 @@ icon_state = "smoke" extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \ into the smoke clouds when activated. The reagents are consumed when smoke is made." - + ext_cooldown = 1 container_type = OPENCONTAINER volume = 100 @@ -281,6 +282,7 @@ activate_pin(2) /obj/item/integrated_circuit/reagent/storage + cooldown_per_use = 1 name = "reagent storage" desc = "Stores liquid inside the device away from electrical components. It can store up to 60u." icon_state = "reagent_storage" diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm index d93aafef58..86e5e99059 100644 --- a/code/modules/integrated_electronics/subtypes/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -1,7 +1,7 @@ /obj/item/integrated_circuit/time name = "time circuit" desc = "Now you can build your own clock!" - complexity = 2 + complexity = 1 inputs = list() outputs = list() category_text = "Time" @@ -71,7 +71,7 @@ name = "ticker circuit" desc = "This circuit sends an automatic pulse every four seconds." icon_state = "tick-m" - complexity = 8 + complexity = 4 var/delay = 4 SECONDS var/next_fire = 0 var/is_running = FALSE @@ -102,11 +102,28 @@ activate_pin(1) +/obj/item/integrated_circuit/time/ticker/custom + name = "custom ticker" + desc = "This advanced circuit sends an automatic pulse every given interval." + icon_state = "tick-f" + complexity = 8 + delay = 2 SECONDS + inputs = list("enable ticking" = IC_PINTYPE_BOOLEAN,"delay time" = IC_PINTYPE_NUMBER) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 8 + +/obj/item/integrated_circuit/time/ticker/custom/on_data_written() + var/delay_input = get_pin_data(IC_INPUT, 2) + if(delay_input && isnum(delay_input) ) + var/new_delay = CLAMP(delay_input ,1 ,1 HOURS) + delay = new_delay + ..() + /obj/item/integrated_circuit/time/ticker/fast name = "fast ticker" desc = "This advanced circuit sends an automatic pulse every two seconds." icon_state = "tick-f" - complexity = 12 + complexity = 6 delay = 2 SECONDS spawn_flags = IC_SPAWN_RESEARCH power_draw_per_use = 8 @@ -115,7 +132,7 @@ name = "slow ticker" desc = "This simple circuit sends an automatic pulse every six seconds." icon_state = "tick-s" - complexity = 4 + complexity = 2 delay = 6 SECONDS spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 2 @@ -142,4 +159,4 @@ set_pin_data(IC_OUTPUT, 3, text2num(time2text(wtime, "mm") ) ) set_pin_data(IC_OUTPUT, 4, text2num(time2text(wtime, "ss") ) ) push_data() - activate_pin(2) \ No newline at end of file + activate_pin(2) diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 67bbd2fad9..f08bf5908e 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -1,9 +1,4 @@ -/obj/var/list/req_access = null -/obj/var/req_access_txt = "0" as text -/obj/var/list/req_one_access = null -/obj/var/req_one_access_txt = "0" as text - //returns TRUE if this mob has sufficient access to use this object /obj/proc/allowed(mob/M) //check if it doesn't require any access at all @@ -60,48 +55,36 @@ for(var/b in text2access(req_one_access_txt)) req_one_access += b +// Check if an item has access to this object /obj/proc/check_access(obj/item/I) + return check_access_list(I ? I.GetAccess() : null) + + +/obj/proc/check_access_list(list/access_list) gen_access() - if(!istype(src.req_access, /list)) //something's very wrong + if(!islist(req_access)) //something's very wrong return TRUE - var/list/L = src.req_access - if(!L.len && (!src.req_one_access || !src.req_one_access.len)) //no requirements + if(!req_access.len && !length(req_one_access)) return TRUE - if(!I) + + if(!length(access_list) || !islist(access_list)) return FALSE - for(var/req in src.req_access) - if(!(req in I.GetAccess())) //doesn't have this access + + for(var/req in req_access) + if(!(req in access_list)) //doesn't have this access return FALSE - if(src.req_one_access && src.req_one_access.len) - for(var/req in src.req_one_access) - if(req in I.GetAccess()) //has an access from the single access list + + if(length(req_one_access)) + for(var/req in req_one_access) + if(req in access_list) //has an access from the single access list return TRUE return FALSE return TRUE - -/obj/proc/check_access_list(list/L) - if(!src.req_access && !src.req_one_access) - return TRUE - if(!istype(src.req_access, /list)) - return TRUE - if(!src.req_access.len && (!src.req_one_access || !src.req_one_access.len)) - return TRUE - if(!L) - return FALSE - if(!istype(L, /list)) - return FALSE - for(var/req in src.req_access) - if(!(req in L)) //doesn't have this access - return FALSE - if(src.req_one_access && src.req_one_access.len) - for(var/req in src.req_one_access) - if(req in L) //has an access from the single access list - return TRUE - return FALSE - return TRUE +/obj/proc/check_access_ntnet(datum/netdata/data) + return check_access_list(data.passkey) /proc/get_centcom_access(job) switch(job) diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index e90c29cfd6..906bd570b4 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -15,6 +15,7 @@ Captain minimal_player_age = 14 exp_requirements = 180 exp_type = EXP_TYPE_CREW + antag_rep = 20 outfit = /datum/outfit/job/captain @@ -69,6 +70,7 @@ Head of Personnel exp_requirements = 180 exp_type = EXP_TYPE_CREW // exp_type_department = EXP_TYPE_SUPPLY - CITADEL CHANGE + antag_rep = 16 outfit = /datum/outfit/job/hop diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index c74fbd3b1b..9c6c6f566d 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -11,6 +11,7 @@ Quartermaster spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#d7b088" + antag_rep = 12 outfit = /datum/outfit/job/quartermaster @@ -41,6 +42,7 @@ Cargo Technician spawn_positions = 2 supervisors = "the quartermaster and the head of personnel" selection_color = "#dcba97" + antag_rep = 4 outfit = /datum/outfit/job/cargo_tech @@ -69,6 +71,7 @@ Shaft Miner spawn_positions = 3 supervisors = "the quartermaster and the head of personnel" selection_color = "#dcba97" + antag_rep = 8 outfit = /datum/outfit/job/miner @@ -147,6 +150,7 @@ Bartender spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#bbe291" + antag_rep = 4 outfit = /datum/outfit/job/bartender @@ -180,6 +184,7 @@ Cook supervisors = "the head of personnel" selection_color = "#bbe291" var/cooks = 0 //Counts cooks amount + antag_rep = 8 outfit = /datum/outfit/job/cook @@ -232,6 +237,7 @@ Botanist spawn_positions = 2 supervisors = "the head of personnel" selection_color = "#bbe291" + antag_rep = 8 outfit = /datum/outfit/job/botanist @@ -271,6 +277,7 @@ Janitor supervisors = "the head of personnel" selection_color = "#bbe291" var/global/janitors = 0 + antag_rep = 8 outfit = /datum/outfit/job/janitor diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index 9a2030d7ed..a10c15e53f 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -11,6 +11,7 @@ Clown spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#dddddd" + antag_rep = 4 outfit = /datum/outfit/job/clown @@ -72,6 +73,7 @@ Mime spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#dddddd" + antag_rep = 4 outfit = /datum/outfit/job/mime @@ -122,6 +124,7 @@ Curator spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#dddddd" + antag_rep = 4 outfit = /datum/outfit/job/curator @@ -167,6 +170,7 @@ Lawyer supervisors = "the head of personnel" selection_color = "#dddddd" var/lawyers = 0 //Counts lawyer amount + antag_rep = 8 outfit = /datum/outfit/job/lawyer diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm index 6b119c19d7..00685454b0 100644 --- a/code/modules/jobs/job_types/civilian_chaplain.dm +++ b/code/modules/jobs/job_types/civilian_chaplain.dm @@ -12,6 +12,7 @@ Chaplain spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#dddddd" + antag_rep = 4 outfit = /datum/outfit/job/chaplain diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm index 1b1619cc24..064422bfba 100644 --- a/code/modules/jobs/job_types/engineering.dm +++ b/code/modules/jobs/job_types/engineering.dm @@ -17,6 +17,7 @@ Chief Engineer exp_requirements = 180 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_ENGINEERING + antag_rep = 16 outfit = /datum/outfit/job/ce @@ -76,6 +77,7 @@ Station Engineer selection_color = "#fff5cc" exp_requirements = 60 exp_type = EXP_TYPE_CREW + antag_rep = 8 outfit = /datum/outfit/job/engineer @@ -132,6 +134,7 @@ Atmospheric Technician selection_color = "#fff5cc" exp_requirements = 60 exp_type = EXP_TYPE_CREW + antag_rep = 8 outfit = /datum/outfit/job/atmos diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/job.dm index 70854d020b..704722dc13 100644 --- a/code/modules/jobs/job_types/job.dm +++ b/code/modules/jobs/job_types/job.dm @@ -48,6 +48,9 @@ var/exp_type = "" var/exp_type_department = "" + //The amount of good boy points playing this role will earn you towards a higher chance to roll antagonist next round + var/antag_rep = 0 + //Only override this proc //H is usually a human unless an /equip override transformed it /datum/job/proc/after_spawn(mob/living/H, mob/M) @@ -179,6 +182,7 @@ var/obj/item/card/id/C = H.wear_id if(istype(C)) C.access = J.get_access() + shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable C.registered_name = H.real_name C.assignment = J.title C.update_label() diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 1f2df19f64..4da6568683 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -17,6 +17,7 @@ Chief Medical Officer exp_requirements = 180 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_MEDICAL + antag_rep = 16 outfit = /datum/outfit/job/cmo @@ -59,6 +60,7 @@ Medical Doctor spawn_positions = 3 supervisors = "the chief medical officer" selection_color = "#ffeef0" + antag_rep = 8 outfit = /datum/outfit/job/doctor @@ -96,6 +98,7 @@ Chemist selection_color = "#ffeef0" exp_type = EXP_TYPE_CREW exp_requirements = 60 + antag_rep = 8 outfit = /datum/outfit/job/chemist @@ -131,6 +134,7 @@ Geneticist selection_color = "#ffeef0" exp_type = EXP_TYPE_CREW exp_requirements = 60 + antag_rep = 8 outfit = /datum/outfit/job/geneticist @@ -167,6 +171,7 @@ Virologist selection_color = "#ffeef0" exp_type = EXP_TYPE_CREW exp_requirements = 60 + antag_rep = 8 outfit = /datum/outfit/job/virologist diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm index d8579a37b0..4fb1347208 100644 --- a/code/modules/jobs/job_types/science.dm +++ b/code/modules/jobs/job_types/science.dm @@ -17,6 +17,7 @@ Research Director exp_type_department = EXP_TYPE_SCIENCE exp_requirements = 180 exp_type = EXP_TYPE_CREW + antag_rep = 16 outfit = /datum/outfit/job/rd @@ -72,6 +73,7 @@ Scientist selection_color = "#ffeeff" exp_requirements = 60 exp_type = EXP_TYPE_CREW + antag_rep = 8 outfit = /datum/outfit/job/scientist @@ -106,6 +108,7 @@ Roboticist selection_color = "#ffeeff" exp_requirements = 60 exp_type = EXP_TYPE_CREW + antag_rep = 8 outfit = /datum/outfit/job/roboticist diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index 442b75c972..322922a779 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -23,6 +23,7 @@ Head of Security exp_requirements = 300 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_SECURITY + antag_rep = 20 outfit = /datum/outfit/job/hos @@ -76,6 +77,7 @@ Warden minimal_player_age = 7 exp_requirements = 300 exp_type = EXP_TYPE_CREW + antag_rep = 16 outfit = /datum/outfit/job/warden @@ -128,6 +130,7 @@ Detective minimal_player_age = 7 exp_requirements = 300 exp_type = EXP_TYPE_CREW + antag_rep = 12 outfit = /datum/outfit/job/detective @@ -178,6 +181,7 @@ Security Officer minimal_player_age = 7 exp_requirements = 300 exp_type = EXP_TYPE_CREW + antag_rep = 12 outfit = /datum/outfit/job/security diff --git a/code/modules/jobs/job_types/silicon.dm b/code/modules/jobs/job_types/silicon.dm index 4a4893e93d..0860c08113 100644 --- a/code/modules/jobs/job_types/silicon.dm +++ b/code/modules/jobs/job_types/silicon.dm @@ -14,6 +14,7 @@ AI minimal_player_age = 30 exp_requirements = 180 exp_type = EXP_TYPE_CREW + antag_rep = 12 /datum/job/ai/equip(mob/living/carbon/human/H) return H.AIize(FALSE) @@ -52,4 +53,4 @@ Cyborg /datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, mob/M) if(CONFIG_GET(flag/rename_cyborg)) //name can't be set in robot/New without the client - R.rename_self("cyborg", M.client) \ No newline at end of file + R.rename_self("cyborg", M.client) diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index d15bc4c117..c1a336eb69 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -136,6 +136,10 @@ languages = list(/datum/language/common) shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic) +/datum/language_holder/empty + languages = list() + shadow_languages = list() + /datum/language_holder/universal/New() ..() grant_all_languages(omnitongue=TRUE) diff --git a/code/modules/language/mushroom.dm b/code/modules/language/mushroom.dm new file mode 100644 index 0000000000..b896d11449 --- /dev/null +++ b/code/modules/language/mushroom.dm @@ -0,0 +1,11 @@ +/datum/language/mushroom + name = "Mushroom" + desc = "A language that consists of the sound of periodic gusts of spore-filled air being released." + speech_verb = "puffs" + ask_verb = "puffs inquisitively" + exclaim_verb = "poofs loudly" + whisper_verb = "puffs quietly" + key = "y" + sentence_chance = 0 + default_priority = 80 + syllables = list("poof", "pff", "pFfF", "piff", "puff", "pooof", "pfffff", "piffpiff", "puffpuff", "poofpoof", "pifpafpofpuf") diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 92122411e4..b302701b24 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -206,6 +206,9 @@ if(dat) user << browse("Penned by [author].
" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]") user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.") + GET_COMPONENT_FROM(mood, /datum/component/mood, user) + if(mood) + mood.add_event("book_nerd", /datum/mood_event/book_nerd) onclose(user, "book") else to_chat(user, "This book is completely blank!") diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 054d97c9f1..1fd5e30424 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -160,3 +160,4 @@ GLOBAL_LIST_EMPTY(z_is_planet) . = ..() var/turf/T = get_turf(src) GLOB.z_is_planet["[T.z]"] = TRUE + diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index 3aa963ef5e..02c54ffbd3 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -173,18 +173,13 @@ if(!check_spot()) return - - var/atom/movable/rcd_target var/turf/target_turf = get_turf(remote_eye) + var/atom/rcd_target = target_turf - //Find airlocks - rcd_target = locate(/obj/machinery/door/airlock) in target_turf - - if(!rcd_target) - rcd_target = locate (/obj/structure) in target_turf - - if(!rcd_target || !rcd_target.anchored) - rcd_target = target_turf + //Find airlocks and other shite + for(var/obj/S in target_turf) + if(LAZYLEN(S.rcd_vals(owner,B.RCD))) + rcd_target = S //If we don't break out of this loop we'll get the last placed thing owner.changeNext_move(CLICK_CD_RANGE) B.RCD.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely! @@ -276,4 +271,4 @@ datum/action/innate/aux_base/install_turret/Activate() B.turret_stock-- to_chat(owner, "Turret installation complete!") - playsound(turret_turf, 'sound/items/drill_use.ogg', 65, 1) \ No newline at end of file + playsound(turret_turf, 'sound/items/drill_use.ogg', 65, 1) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 2843c22038..5b86a2d340 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -115,6 +115,9 @@ C.total_damage += detonation_damage L.apply_damage(detonation_damage, BRUTE, blocked = def_check) + if(user && lavaland_equipment_pressure_check(get_turf(user))) //CIT CHANGE - makes sure below only happens in low pressure environments + user.adjustStaminaLoss(-13)//CIT CHANGE - makes crushers heal stamina + /obj/item/twohanded/required/kinetic_crusher/proc/Recharge() if(!charged) charged = TRUE diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 3e241fbc72..e73349198b 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -125,4 +125,4 @@ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' force = 5 throwforce = 7 - w_class = WEIGHT_CLASS_SMALL \ No newline at end of file + w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 66faa7cb2c..632c9e1cba 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -203,7 +203,6 @@ desc = "A large machine releasing a constant gust of air." anchored = TRUE density = TRUE - var/arbitraryatmosblockingvar = TRUE var/buildstacktype = /obj/item/stack/sheet/metal var/buildstackamount = 5 CanAtmosPass = ATMOS_PASS_NO diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 3ff5a5f3e9..42e69f8fb2 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -28,7 +28,7 @@ /obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user) var/list/destinations = list() - for(var/obj/item/device/radio/beacon/B in GLOB.teleportbeacons) + for(var/obj/item/device/beacon/B in GLOB.teleportbeacons) var/turf/T = get_turf(B) if(is_station_level(T.z)) destinations += B diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 56d59dfd09..7f3870e418 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -33,7 +33,7 @@ else new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) if(9) - new /obj/item/organ/brain/alien(src) + new /obj/item/rod_of_asclepius(src) if(10) new /obj/item/organ/heart/cursed/wizard(src) if(11) @@ -76,7 +76,6 @@ new /obj/item/borg/upgrade/modkit/lifesteal(src) new /obj/item/bedsheet/cult(src) - //KA modkit design discs /obj/item/disk/design_disk/modkit_disc name = "KA Mod Disk" @@ -140,6 +139,54 @@ //Spooky special loot +//Rod of Asclepius +/obj/item/rod_of_asclepius + name = "Rod of Asclepius" + desc = "A wooden rod about the size of your forearm with a snake carved around it, winding it's way up the sides of the rod. Something about it seems to inspire in you the responsibilty and duty to help others." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "asclepius_dormant" + var/activated = FALSE + +/obj/item/rod_of_asclepius/attack_self(mob/user) + if(activated) + return + if(!iscarbon(user)) + to_chat(user, "The snake carving seems to come alive, if only for a moment, before returning to it's dormant state, almost as if it finds you incapable of holding it's oath.") + return + var/mob/living/carbon/itemUser = user + var/failText = "The snake seems unsatisfied with your incomplete oath and returns to it's previous place on the rod, returning to its dormant, wooden state. You must stand still while completing your oath!" + to_chat(itemUser, "The wooden snake that was carved into the rod seems to suddenly come alive and begins to slither down your arm! The compulsion to help others grows abnormally strong...") + if(do_after(itemUser, 40, target = itemUser)) + itemUser.say("I swear to fulfill, to the best of my ability and judgment, this covenant:") + else + to_chat(itemUser, failText) + return + if(do_after(itemUser, 20, target = itemUser)) + itemUser.say("I will apply, for the benefit of the sick, all measures that are required, avoiding those twin traps of overtreatment and therapeutic nihilism.") + else + to_chat(itemUser, failText) + return + if(do_after(itemUser, 30, target = itemUser)) + itemUser.say("I will remember that I remain a member of society, with special obligations to all my fellow human beings, those sound of mind and body as well as the infirm.") + else + to_chat(itemUser, failText) + return + if(do_after(itemUser, 30, target = itemUser)) + itemUser.say("If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help.") + else + to_chat(itemUser, failText) + return + to_chat(itemUser, "The snake, satisfied with your oath, attaches itself and the rod to your forearm with an inseparable grip. Your thoughts seem to only revolve around the core idea of helping others, and harm is nothing more than a distant, wicked memory...") + var/datum/status_effect/hippocraticOath/effect = itemUser.apply_status_effect(STATUS_EFFECT_HIPPOCRATIC_OATH) + effect.hand = itemUser.get_held_index_of_item(src) + activated() + +/obj/item/rod_of_asclepius/proc/activated() + flags_1 = NODROP_1 | DROPDEL_1 + desc = "A short wooden rod with a mystical snake inseparably gripping itself and the rod to your forearm. It flows with a healing energy that disperses amongst yourself and those around you. " + icon_state = "asclepius_active" + activated = TRUE + //Wisp Lantern /obj/item/device/wisp_lantern name = "spooky lantern" @@ -789,7 +836,7 @@ agent = "dragon's blood" desc = "What do dragons have to do with Space Station 13?" stage_prob = 20 - severity = VIRUS_SEVERITY_BIOHAZARD + severity = DISEASE_SEVERITY_BIOHAZARD visibility_flags = 0 stage1 = list("Your bones ache.") stage2 = list("Your skin feels scaly.") @@ -945,7 +992,7 @@ survive.owner = L.mind L.mind.objectives += survive add_logs(user, L, "took out a blood contract on", src) - to_chat(L, "You've been marked for death! Don't let the demons get you!") + to_chat(L, "You've been marked for death! Don't let the demons get you! KILL THEM ALL!") L.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) var/obj/effect/mine/pickup/bloodbath/B = new(L) INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, L) @@ -953,7 +1000,7 @@ for(var/mob/living/carbon/human/H in GLOB.player_list) if(H == L) continue - to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Go kill [L.p_them()]!") + to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Whoever they were, friend or foe, go kill [L.p_them()]!") H.put_in_hands(new /obj/item/kitchen/knife/butcher(H), TRUE) qdel(src) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 16929f9b09..a9cec0a01b 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -257,26 +257,23 @@ if("Release") if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user - if(params["id"] == "all") - materials.retrieve_all(get_step(src, output_dir)) + var/mat_id = params["id"] + if(!materials.materials[mat_id]) + return + var/datum/material/mat = materials.materials[mat_id] + var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT + + if(!stored_amount) + return + + var/desired = 0 + if (params["sheets"]) + desired = text2num(params["sheets"]) else - var/mat_id = params["id"] - if(!materials.materials[mat_id]) - return - var/datum/material/mat = materials.materials[mat_id] - var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT + desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num - if(!stored_amount) - return - - var/desired = 0 - if (params["sheets"]) - desired = text2num(params["sheets"]) - else - desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num - - var/sheets_to_remove = round(min(desired,50,stored_amount)) - materials.retrieve_sheets(sheets_to_remove, mat_id, get_step(src, output_dir)) + var/sheets_to_remove = round(min(desired,50,stored_amount)) + materials.retrieve_sheets(sheets_to_remove, mat_id, get_step(src, output_dir)) else to_chat(usr, "Required access not found.") diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index 9a95bc9a4a..5f99cd8aa2 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -9,10 +9,24 @@ see_in_dark = 7 invisibility = INVISIBILITY_ABSTRACT // No one can see us sight = SEE_SELF - move_on_shuttle = 0 + move_on_shuttle = FALSE + var/call_life = FALSE //TRUE if Life() should be called on this camera every tick of the mobs subystem, as if it were a living mob + +/mob/camera/Initialize() + . = ..() + if(call_life) + GLOB.living_cameras += src + +/mob/camera/Destroy() + . = ..() + if(call_life) + GLOB.living_cameras -= src /mob/camera/experience_pressure_difference() return /mob/camera/forceMove(atom/destination) loc = destination + +/mob/camera/emote(act, m_type=1, message = null) + return diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 743ba705dc..358867e6ad 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -379,6 +379,9 @@ if(SSshuttle.emergency.timeLeft(1) > initial(SSshuttle.emergencyCallTime)*0.5) SSticker.mode.make_antag_chance(humanc) + if(CONFIG_GET(flag/roundstart_traits)) + SStraits.AssignTraits(humanc, humanc.client, TRUE) + log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) /mob/dead/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee) diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index 57d912067e..8699e02b29 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -1402,6 +1402,14 @@ /datum/sprite_accessory/legs/digitigrade_lizard name = "Digitigrade Legs" +/datum/sprite_accessory/caps + icon = 'icons/mob/mutant_bodyparts.dmi' + color_src = HAIR + +/datum/sprite_accessory/caps/round + name = "Round" + icon_state = "round" + /datum/sprite_accessory/moth_wings icon = 'icons/mob/wings.dmi' color_src = null diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 07e7fe826c..f03ca135d1 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -288,8 +288,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(response != "Ghost") return //didn't want to ghost after-all ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - return +/mob/camera/verb/ghost() + set category = "OOC" + set name = "Ghost" + set desc = "Relinquish your life and enter the land of the dead." + + var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") + if(response != "Ghost") + return + ghostize(0) /mob/dead/observer/Move(NewLoc, direct) if(updatedir) @@ -634,7 +642,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/MouseDrop(atom/over) if(!usr || !over) return - if (isobserver(usr) && usr.client.holder && isliving(over)) + if (isobserver(usr) && usr.client.holder && (isliving(over) || iscameramob(over)) ) if (usr.client.holder.cmd_ghost_drag(src,over)) return diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index acef80b8ba..1e7f2210cf 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -197,7 +197,7 @@ /mob/proc/put_in_hand_check(obj/item/I) - if(lying && !(I.flags_1&ABSTRACT_1)) + if(incapacitated() && !(I.flags_1&ABSTRACT_1)) //Cit change - Changes lying to incapacitated so that it's plausible to pick things up while on the ground return FALSE if(!istype(I)) return FALSE diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index dd8c84c969..41715d650d 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -31,7 +31,7 @@ if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space - if(blood_volume < BLOOD_VOLUME_NORMAL && !(NOHUNGER in dna.species.species_traits)) + if(blood_volume < BLOOD_VOLUME_NORMAL && !has_trait(TRAIT_NOHUNGER)) var/nutrition_ratio = 0 switch(nutrition) if(0 to NUTRITION_LEVEL_STARVING) @@ -140,7 +140,7 @@ if(blood_data["viruses"]) for(var/thing in blood_data["viruses"]) var/datum/disease/D = thing - if((D.spread_flags & VIRUS_SPREAD_SPECIAL) || (D.spread_flags & VIRUS_SPREAD_NON_CONTAGIOUS)) + if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue C.ForceContractDisease(D) if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type))) @@ -164,13 +164,13 @@ blood_data["donor"] = src blood_data["viruses"] = list() - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing blood_data["viruses"] += D.Copy() blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0) - if(resistances && resistances.len) - blood_data["resistances"] = resistances.Copy() + if(disease_resistances && disease_resistances.len) + blood_data["resistances"] = disease_resistances.Copy() var/list/temp_chem = list() for(var/datum/reagent/R in reagents.reagent_list) temp_chem[R.id] = R.volume @@ -191,6 +191,10 @@ blood_data["real_name"] = real_name blood_data["features"] = dna.features blood_data["factions"] = faction + blood_data["traits"] = list() + for(var/V in roundstart_traits) + var/datum/trait/T = V + blood_data["traits"] += T.type return blood_data //get the id of the substance this mob use as blood. diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 8b8b8d5761..fe4454caeb 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -202,7 +202,6 @@ return if(!sterile) - //target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance target.visible_message("[src] falls limp after violating [target]'s face!", \ "[src] falls limp after violating [target]'s face!") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index e5feb5c6c1..ac905ff827 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -148,6 +148,12 @@ if(istype(target, /obj/screen)) return +//CIT CHANGES - makes it impossible to throw while in stamina softcrit + if(staminaloss >= STAMINA_SOFTCRIT) + to_chat(src, "You're too exhausted.") + return +//END OF CIT CHANGES + var/atom/movable/thrown_thing var/obj/item/I = src.get_active_held_item() @@ -159,6 +165,7 @@ stop_pulling() if(has_trait(TRAIT_PACIFISM)) to_chat(src, "You gently let go of [throwable_mob].") + adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors var/turf/end_T = get_turf(target) if(start_T && end_T) @@ -174,6 +181,8 @@ to_chat(src, "You set [I] down gently on the ground.") return + adjustStaminaLossBuffered(I.getweight()*2)//CIT CHANGE - throwing items shall be more tiring than swinging em. Doubly so. + if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") add_logs(src, thrown_thing, "has thrown") @@ -399,12 +408,20 @@ if(!I || (I.flags_1 & (NODROP_1|ABSTRACT_1))) return - dropItemToGround(I) + //dropItemToGround(I) CIT CHANGE - makes it so the item doesn't drop if the modifier rolls above 100 var/modifier = 0 if(has_trait(TRAIT_CLUMSY)) modifier -= 40 //Clumsy people are more likely to hit themselves -Honk! + //CIT CHANGES START HERE + else if(combatmode) + modifier += 50 + + if(modifier < 100) + dropItemToGround(I) + //END OF CIT CHANGES + switch(rand(1,100)+modifier) //91-100=Nothing special happens if(-INFINITY to 0) //attack yourself I.attack(src,src) @@ -440,7 +457,7 @@ return ..() /mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE) - if(dna && dna.species && NOHUNGER in dna.species.species_traits) + if(has_trait(TRAIT_NOHUNGER)) return 1 if(nutrition < 100 && !blood) @@ -568,10 +585,12 @@ return tinttotal = get_total_tint() if(tinttotal >= TINT_BLIND) - overlay_fullscreen("tint", /obj/screen/fullscreen/blind) + become_blind(EYES_COVERED) else if(tinttotal >= TINT_DARKENED) + cure_blind(EYES_COVERED) overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2) else + cure_blind(EYES_COVERED) clear_fullscreen("tint", 0) /mob/living/carbon/proc/get_total_tint() @@ -736,12 +755,17 @@ //called when we get cuffed/uncuffed /mob/living/carbon/proc/update_handcuffed() + GET_COMPONENT_FROM(mood, /datum/component/mood, src) if(handcuffed) drop_all_held_items() stop_pulling() throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) + if(mood) + mood.add_event("handcuffed", /datum/mood_event/handcuffed) else clear_alert("handcuffed") + if(mood) + mood.clear_event("handcuffed") update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed. update_inv_handcuffed() update_hud_handcuffed() @@ -752,9 +776,9 @@ var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain) if(B) B.damaged_brain = FALSE - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing - if(D.severity != VIRUS_SEVERITY_POSITIVE) + if(D.severity != DISEASE_SEVERITY_POSITIVE) D.cure(FALSE) if(admin_revive) regenerate_limbs() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 56420df35a..9b23204d98 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -77,7 +77,18 @@ affecting = bodyparts[1] send_item_attack_message(I, user, affecting.name) if(I.force) - apply_damage(I.force, I.damtype, affecting) + //CIT CHANGES START HERE - combatmode and resting checks + var/totitemdamage = I.force + if(iscarbon(user)) + var/mob/living/carbon/tempcarb = user + if(!tempcarb.combatmode) + totitemdamage *= 0.5 + if(user.resting) + totitemdamage *= 0.5 + if(!combatmode) + totitemdamage *= 1.5 + //CIT CHANGES END HERE + apply_damage(totitemdamage, I.damtype, affecting) //CIT CHANGE - replaces I.force with totitemdamage if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) if(prob(33)) I.add_mob_blood(src) @@ -110,14 +121,14 @@ /mob/living/carbon/attack_hand(mob/living/carbon/human/user) - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) user.ContactContractDisease(D) - for(var/thing in user.viruses) + for(var/thing in user.diseases) var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) if(lying && surgeries.len) @@ -131,14 +142,14 @@ /mob/living/carbon/attack_paw(mob/living/carbon/monkey/M) if(can_inject(M, TRUE)) - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing - if((D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) && prob(85)) + if((D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) && prob(85)) M.ContactContractDisease(D) - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) if(M.a_intent == INTENT_HELP) @@ -146,7 +157,7 @@ return 0 if(..()) //successful monkey bite. - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing ForceContractDisease(D) return 1 @@ -266,6 +277,9 @@ else M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ "You hug [src] to make [p_them()] feel better!") + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + mood.add_event("hug", /datum/mood_event/hug) AdjustStun(-60) AdjustKnockdown(-60) AdjustUnconscious(-60) diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 27c64625a8..662a42eea4 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -50,7 +50,7 @@ /mob/living/carbon/Move(NewLoc, direct) . = ..() if(. && mob_has_gravity()) //floating is easy - if(dna && dna.species && (NOHUNGER in dna.species.species_traits)) + if(has_trait(TRAIT_NOHUNGER)) nutrition = NUTRITION_LEVEL_FED - 1 //just less than feeling vigorous else if(nutrition && stat != DEAD) nutrition -= HUNGER_FACTOR/10 diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index a626266f01..715b4a2ed9 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -80,7 +80,7 @@ /mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) - if(!forced && has_dna() && TOXINLOVER in dna.species.species_traits) //damage becomes healing and healing becomes damage + if(!forced && has_trait(TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage amount = -amount if(amount > 0) blood_volume -= 5*amount @@ -186,16 +186,16 @@ if(status_flags & GODMODE) return 0 staminaloss = CLAMP(staminaloss + amount, 0, maxHealth*2) - if(updating_stamina) - update_stamina() + //if(updating_stamina) CIT CHANGE - makes staminaloss changes always call update_stamina + update_stamina() /mob/living/carbon/setStaminaLoss(amount, updating_stamina = 1) if(status_flags & GODMODE) return 0 staminaloss = amount - if(updating_stamina) - update_stamina() + //if(updating_stamina) CIT CHANGE - makes staminaloss changes always call update_stamina + update_stamina() /mob/living/carbon/getBrainLoss() . = 0 @@ -237,4 +237,3 @@ if(B) var/adjusted_amount = amount - B.get_brain_damage() B.adjust_brain_damage(adjusted_amount, null) - diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 26fc9ce245..48df33345c 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -89,7 +89,21 @@ if(digitalcamo) msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner.\n" - + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + switch(mood.shown_mood) + if(-INFINITY to MOOD_LEVEL_SAD4) + msg += "[t_He] look[p_s()] depressed.\n" + if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3) + msg += "[t_He] look[p_s()] very sad.\n" + if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2) + msg += "[t_He] look[p_s()] a bit down.\n" + if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3) + msg += "[t_He] look[p_s()] quite happy.\n" + if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4) + msg += "[t_He] look[p_s()] very happy.\n" + if(MOOD_LEVEL_HAPPY4 to INFINITY) + msg += "[t_He] look[p_s()] ecstatic.\n" msg += "*---------*
" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index f1706e7c52..d090b9f0f7 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -6,8 +6,14 @@ var/t_him = p_them() var/t_has = p_have() var/t_is = p_are() + var/obscure_name - var/msg = "*---------*\nThis is [name]!\n" + if(isliving(user)) + var/mob/living/L = user + if(L.has_trait(TRAIT_PROSOPAGNOSIA)) + obscure_name = TRUE + + var/msg = "*---------*\nThis is [!obscure_name ? name : "Unknown"]!\n" var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) @@ -246,10 +252,6 @@ if(91.01 to INFINITY) msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n" - for (var/I in src.vore_organs) - var/datum/belly/B = vore_organs[I] - msg += B.get_examine_msg() - msg += "" if(!appears_dead) @@ -269,6 +271,7 @@ if(digitalcamo) msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n" + var/traitstring = get_trait_string() if(ishuman(user)) var/mob/living/carbon/human/H = user var/obj/item/organ/cyberimp/eyes/hud/CIH = H.getorgan(/obj/item/organ/cyberimp/eyes/hud) @@ -296,6 +299,10 @@ R = find_record("name", perpname, GLOB.data_core.medical) if(R) msg += "\[Medical evaluation\]
" + if(traitstring) + msg += "Detected physiological traits:
" + msg += "[traitstring]
" + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/security)) @@ -312,9 +319,13 @@ msg += "\[Add crime\] " msg += "\[View comment log\] " msg += "\[Add comment\]\n" + + else if(isobserver(user) && traitstring) + msg += "Traits: [traitstring]
" + if(print_flavor_text() && get_visible_name() != "Unknown")//Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation. msg += "[print_flavor_text()]\n" - + msg += "*---------*
" to_chat(user, msg) diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm index 8578db809e..6ef1b687c2 100644 --- a/code/modules/mob/living/carbon/human/examine_vr.dm +++ b/code/modules/mob/living/carbon/human/examine_vr.dm @@ -42,13 +42,4 @@ message = "[t_His] stomach is firmly packed with digesting slop. [t_He] must have eaten at least a few times worth their body weight! It looks hard for them to stand, and [t_his] gut jiggles when they move.\n" if(4075 to 10000) // Four or more people. message = "[t_He] [t_is] so absolutely stuffed that you aren't sure how it's possible to move. [t_He] can't seem to swell any bigger. The surface of [t_his] belly looks sorely strained!\n" - return message - -/mob/living/carbon/human/proc/examine_bellies() - var/message = "" - - for (var/I in src.vore_organs) - var/datum/belly/B = vore_organs[I] - message += B.get_examine_msg() - return message \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 64ffc91ae7..2bcb1d5189 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -30,10 +30,17 @@ AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT), CALLBACK(src, .proc/clean_blood)) + +/mob/living/carbon/human/ComponentInitialize() + if(!CONFIG_GET(flag/disable_human_mood)) + AddComponent(/datum/component/mood) + /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) + QDEL_NULL_LIST(vore_organs) // CITADEL EDIT belly stuff return ..() + /mob/living/carbon/human/OpenCraftingMenu() handcrafting.ui_interact(src) @@ -90,10 +97,10 @@ stat("Radiation Levels:","[radiation] rad") stat("Body Temperature:","[bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)") - //Virsuses - if(viruses.len) + //Diseases + if(diseases.len) stat("Viruses:", null) - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]") @@ -222,6 +229,9 @@ usr.visible_message("[usr] successfully rips [I] out of their [L.name]!","You successfully remove [I] from your [L.name].") if(!has_embedded_objects()) clear_alert("embeddedobject") + GET_COMPONENT_FROM(mood, /datum/component/mood, usr) + if(mood) + mood.clear_event("embeddedobject") return if(href_list["item"]) @@ -482,7 +492,7 @@ . = 1 // Default to returning true. if(user && !target_zone) target_zone = user.zone_selected - if(dna && (PIERCEIMMUNE in dna.species.species_traits)) + if(has_trait(TRAIT_PIERCEIMMUNE)) . = 0 // If targeting the head, see if the head item is thin enough. // If targeting anything else, see if the wear suit is thin enough. @@ -643,13 +653,16 @@ to_chat(src, "You fail to perform CPR on [C]!") return 0 - var/they_breathe = (!(NOBREATH in C.dna.species.species_traits)) + var/they_breathe = !C.has_trait(TRAIT_NOBREATH) var/they_lung = C.getorganslot(ORGAN_SLOT_LUNGS) if(C.health > HEALTH_THRESHOLD_CRIT) return src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name].") + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + mood.add_event("perform_cpr", /datum/mood_event/perform_cpr) C.cpr_time = world.time add_logs(src, C, "CPRed") @@ -765,7 +778,7 @@ return else if(hud_used.healths) - var/health_amount = health - staminaloss + var/health_amount = health - CLAMP(staminaloss-50, 0, 80)//CIT CHANGE - makes staminaloss have less of an impact on the health hud if(..(health_amount)) //not dead switch(hal_screwyhud) if(SCREWYHUD_CRIT) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index e6fbfe7be9..06cf675427 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -136,7 +136,7 @@ else if(I) if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD) if(can_embed(I)) - if(prob(I.embedding.embed_chance) && !(dna && (PIERCEIMMUNE in dna.species.species_traits))) + if(prob(I.embedding.embed_chance) && !has_trait(TRAIT_PIERCEIMMUNE)) throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) var/obj/item/bodypart/L = pick(bodyparts) L.embedded_objects |= I @@ -144,6 +144,9 @@ I.forceMove(src) L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier) visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + mood.add_event("embedded", /datum/mood_event/embedded) hitpush = FALSE skipcatch = TRUE //can't catch the now embedded item @@ -655,24 +658,33 @@ if(prob(30)) burndamage += rand(30,40) - if(brutedamage > 0) - status = "bruised" - if(brutedamage > 20) - status = "battered" - if(brutedamage > 40) - status = "mangled" - if(brutedamage > 0 && burndamage > 0) - status += " and " - if(burndamage > 40) - status += "peeling away" + if(has_trait(TRAIT_SELF_AWARE)) + status = "[brutedamage] brute damage and [burndamage] burn damage" + if(!brutedamage && !burndamage) + status = "no damage" - else if(burndamage > 10) - status += "blistered" - else if(burndamage > 0) - status += "numb" - if(status == "") - status = "OK" - to_chat(src, "\t Your [LB.name] is [status].") + else + if(brutedamage > 0) + status = "bruised" + if(brutedamage > 20) + status = "battered" + if(brutedamage > 40) + status = "mangled" + if(brutedamage > 0 && burndamage > 0) + status += " and " + if(burndamage > 40) + status += "peeling away" + + else if(burndamage > 10) + status += "blistered" + else if(burndamage > 0) + status += "numb" + if(status == "") + status = "OK" + var/no_damage + if(status == "OK" || status == "no damage") + no_damage = TRUE + to_chat(src, "\t Your [LB.name] [has_trait(TRAIT_SELF_AWARE) ? "has" : "is"] [status].") for(var/obj/item/I in LB.embedded_objects) to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") @@ -687,6 +699,23 @@ to_chat(src, "You're completely exhausted.") else to_chat(src, "You feel fatigued.") + if(has_trait(TRAIT_SELF_AWARE)) + if(toxloss) + if(toxloss > 10) + to_chat(src, "You feel sick.") + else if(toxloss > 20) + to_chat(src, "You feel nauseous.") + else if(toxloss > 40) + to_chat(src, "You feel very unwell!") + if(oxyloss) + if(oxyloss > 10) + to_chat(src, "You feel lightheaded.") + else if(oxyloss > 20) + to_chat(src, "Your thinking is clouded and distant.") + else if(oxyloss > 30) + to_chat(src, "You're choking!") + if(roundstart_traits.len) + to_chat(src, "You have these traits: [get_trait_string()].") else if(wear_suit) wear_suit.add_fingerprint(M) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 2bc4de894e..60bb0fe497 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,5 +1,5 @@ /mob/living/carbon/human - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD) possible_a_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM) pressure_resistance = 25 can_buckle = TRUE diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index c5e4581253..f3f0fe0215 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -138,7 +138,7 @@ if(src.dna.check_mutation(HULK)) to_chat(src, "Your meaty finger is much too large for the trigger guard!") return FALSE - if(NOGUNS in src.dna.species.species_traits) + if(has_trait(TRAIT_NOGUNS)) to_chat(src, "Your fingers don't fit in the trigger guard!") return FALSE if(mind) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 6f187d0351..246e615199 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -20,6 +20,22 @@ #define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point #define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point +// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. +// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection() +// The values here should add up to 1. +// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30% +#define THERMAL_PROTECTION_HEAD 0.3 +#define THERMAL_PROTECTION_CHEST 0.15 +#define THERMAL_PROTECTION_GROIN 0.15 +#define THERMAL_PROTECTION_LEG_LEFT 0.075 +#define THERMAL_PROTECTION_LEG_RIGHT 0.075 +#define THERMAL_PROTECTION_FOOT_LEFT 0.025 +#define THERMAL_PROTECTION_FOOT_RIGHT 0.025 +#define THERMAL_PROTECTION_ARM_LEFT 0.075 +#define THERMAL_PROTECTION_ARM_RIGHT 0.075 +#define THERMAL_PROTECTION_HAND_LEFT 0.025 +#define THERMAL_PROTECTION_HAND_RIGHT 0.025 + /mob/living/carbon/human/Life() set invisibility = 0 if (notransform) @@ -48,13 +64,17 @@ /mob/living/carbon/human/calculate_affecting_pressure(pressure) if((wear_suit && (wear_suit.flags_1 & STOPSPRESSUREDMAGE_1)) && (head && (head.flags_1 & STOPSPRESSUREDMAGE_1))) return ONE_ATMOSPHERE + if(istype(loc, /obj/belly)) + return ONE_ATMOSPHERE + if(istype(loc, /obj/item/device/dogborg/sleeper)) + return ONE_ATMOSPHERE else return pressure /mob/living/carbon/human/handle_traits() if(eye_blind) //blindness, heals slowly over time - if(tinttotal >= TINT_BLIND) //covering your eyes heals blurry eyes faster + if(has_trait(TRAIT_BLIND, EYES_COVERED)) //covering your eyes heals blurry eyes faster adjust_blindness(-3) else adjust_blindness(-1) @@ -65,6 +85,19 @@ to_chat(src, "You don't feel like harming anybody.") a_intent_change(INTENT_HELP) + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if (getBrainLoss() >= 60 && stat == CONSCIOUS) + if(mood) + mood.add_event("brain_damage", /datum/mood_event/brain_damage) + if(prob(3)) + if(prob(25)) + emote("drool") + else + say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")) + else + if(mood) + mood.clear_event("brain_damage") + /mob/living/carbon/human/handle_mutations_and_radiation() if(!dna || !dna.species.handle_mutations_and_radiation(src)) ..() @@ -81,7 +114,7 @@ if(!L) if(health >= HEALTH_THRESHOLD_CRIT) adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1) - else if(!(NOCRITDAMAGE in dna.species.species_traits)) + else if(!has_trait(TRAIT_NOCRITDAMAGE)) adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) failed_last_breath = 1 @@ -122,6 +155,8 @@ return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT if(ismob(loc)) return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + if(istype(loc, /obj/belly)) + return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT //END EDIT if(wear_suit) if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT) @@ -228,16 +263,14 @@ return thermal_protection_flags /mob/living/carbon/human/proc/get_cold_protection(temperature) - - if(dna.check_mutation(COLDRES)) - return TRUE //Fully protected from the cold. - - if(RESISTCOLD in dna.species.species_traits) + if(has_trait(TRAIT_RESISTCOLD)) return TRUE - + //CITADEL EDIT Mandatory for vore code. if(istype(loc, /obj/item/device/dogborg/sleeper)) return 1 //freezing to death in sleepers ruins fun. + if(istype(loc, /obj/belly)) + return 1 if(ismob(loc)) return 1 //because lazy and being inside somemone insulates you from space //END EDIT @@ -285,16 +318,14 @@ /mob/living/carbon/human/has_smoke_protection() if(wear_mask) if(wear_mask.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1) - . = 1 + return TRUE if(glasses) if(glasses.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1) - . = 1 + return TRUE if(head) if(head.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1) - . = 1 - if(NOBREATH in dna.species.species_traits) - . = 1 - return . + return TRUE + return ..() /mob/living/carbon/human/proc/handle_embedded_objects() @@ -312,6 +343,9 @@ visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!") if(!has_embedded_objects()) clear_alert("embeddedobject") + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + mood.clear_event("embedded") /mob/living/carbon/human/proc/handle_active_genes() for(var/datum/mutation/human/HM in dna.mutations) @@ -321,14 +355,14 @@ if(!can_heartattack()) return - var/we_breath = (!(NOBREATH in dna.species.species_traits)) + var/we_breath = !has_trait(TRAIT_NOBREATH, SPECIES_TRAIT) if(!undergoing_cardiac_arrest()) return - // Cardiac arrest, unless corazone - if(reagents.get_reagent_amount("corazone")) + // Cardiac arrest, unless heart is stabilized + if(has_trait(TRAIT_STABLEHEART)) return if(we_breath) @@ -430,3 +464,14 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put adjustToxLoss(4) //Let's be honest you shouldn't be alive by now #undef HUMAN_MAX_OXYLOSS +#undef THERMAL_PROTECTION_HEAD +#undef THERMAL_PROTECTION_CHEST +#undef THERMAL_PROTECTION_GROIN +#undef THERMAL_PROTECTION_LEG_LEFT +#undef THERMAL_PROTECTION_LEG_RIGHT +#undef THERMAL_PROTECTION_FOOT_LEFT +#undef THERMAL_PROTECTION_FOOT_RIGHT +#undef THERMAL_PROTECTION_ARM_LEFT +#undef THERMAL_PROTECTION_ARM_RIGHT +#undef THERMAL_PROTECTION_HAND_LEFT +#undef THERMAL_PROTECTION_HAND_RIGHT \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index c601f1445c..c008be1093 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -7,8 +7,8 @@ /mob/living/carbon/human/treat_message(message) message = dna.species.handle_speech(message,src) - if(viruses.len) - for(var/datum/disease/pierrot_throat/D in viruses) + if(diseases.len) + for(var/datum/disease/pierrot_throat/D in diseases) var/list/temp_message = splittext(message, " ") //List each word in the message var/list/pick_list = list() for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line @@ -48,14 +48,12 @@ return real_name /mob/living/carbon/human/IsVocal() - CHECK_DNA_AND_SPECIES(src) - // how do species that don't breathe talk? magic, that's what. - if(!(NOBREATH in dna.species.species_traits) && !getorganslot(ORGAN_SLOT_LUNGS)) - return 0 + if(!has_trait(TRAIT_NOBREATH, SPECIES_TRAIT) && !getorganslot(ORGAN_SLOT_LUNGS)) + return FALSE if(mind) return !mind.miming - return 1 + return TRUE /mob/living/carbon/human/proc/SetSpecialVoice(new_voice) if(new_voice) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 3978811236..c60eafbad2 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -53,8 +53,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded? var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"] - // species flags. these can be found in flags.dm + // species-only traits. Can be found in DNA.dm var/list/species_traits = list() + // generic traits tied to having the species + var/list/inherent_traits = list() var/attack_verb = "punch" // punch-specific attack verb var/sound/attack_sound = 'sound/weapons/punch1.ogg' @@ -151,8 +153,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/should_have_brain = TRUE var/should_have_heart = !(NOBLOOD in species_traits) - var/should_have_lungs = !(NOBREATH in species_traits) - var/should_have_appendix = !(NOHUNGER in species_traits) + var/should_have_lungs = !(TRAIT_NOBREATH in inherent_traits) + var/should_have_appendix = !(TRAIT_NOHUNGER in inherent_traits) var/should_have_eyes = TRUE var/should_have_ears = TRUE var/should_have_tongue = TRUE @@ -287,8 +289,11 @@ GLOBAL_LIST_EMPTY(roundstart_races) else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand C.put_in_hands(new mutanthands()) - if(VIRUSIMMUNE in species_traits) - for(var/datum/disease/A in C.viruses) + for(var/X in inherent_traits) + C.add_trait(X, SPECIES_TRAIT) + + if(TRAIT_VIRUSIMMUNE in inherent_traits) + for(var/datum/disease/A in C.diseases) A.cure(FALSE) //CITADEL EDIT @@ -304,6 +309,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) C.dna.blood_type = random_blood_type() if(DIGITIGRADE in species_traits) C.Digitigrade_Leg_Swap(TRUE) + for(var/X in inherent_traits) + C.remove_trait(X, SPECIES_TRAIT) /datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour) H.remove_overlay(HAIR_LAYER) @@ -676,6 +683,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) S = GLOB.legs_list[H.dna.features["legs"]] if("moth_wings") S = GLOB.moth_wings_list[H.dna.features["moth_wings"]] + if("caps") + S = GLOB.caps_list[H.dna.features["caps"]] //Mammal Bodyparts if("mam_tail") @@ -855,11 +864,11 @@ GLOBAL_LIST_EMPTY(roundstart_races) //END EDIT /datum/species/proc/spec_life(mob/living/carbon/human/H) - if(NOBREATH in species_traits) + if(H.has_trait(TRAIT_NOBREATH)) H.setOxyLoss(0) H.losebreath = 0 - var/takes_crit_damage = (!(NOCRITDAMAGE in species_traits)) + var/takes_crit_damage = (!H.has_trait(TRAIT_NOCRITDAMAGE)) if((H.health < HEALTH_THRESHOLD_CRIT) && takes_crit_damage) H.adjustBruteLoss(1) @@ -1111,10 +1120,19 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.update_inv_wear_suit() // nutrition decrease and satiety - if (H.nutrition > 0 && H.stat != DEAD && \ - H.dna && H.dna.species && (!(NOHUNGER in H.dna.species.species_traits))) + if (H.nutrition > 0 && H.stat != DEAD && !H.has_trait(TRAIT_NOHUNGER)) // THEY HUNGER var/hunger_rate = HUNGER_FACTOR + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(mood) + switch(mood.mood) //Alerts do_after delay based on how happy you are + if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3) + hunger_rate *= 0.9 + if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4) + hunger_rate *= 0.8 + if(MOOD_LEVEL_HAPPY4 to INFINITY) + hunger_rate *= 0.7 + if(H.satiety > 0) H.satiety-- if(H.satiety < 0) @@ -1136,7 +1154,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(H.nutrition > NUTRITION_LEVEL_FAT) H.metabolism_efficiency = 1 else if(H.nutrition > NUTRITION_LEVEL_FED && H.satiety > 80) - if(H.metabolism_efficiency != 1.25 && (H.dna && H.dna.species && !(NOHUNGER in H.dna.species.species_traits))) + if(H.metabolism_efficiency != 1.25 && !H.has_trait(TRAIT_NOHUNGER)) to_chat(H, "You feel vigorous.") H.metabolism_efficiency = 1.25 else if(H.nutrition < NUTRITION_LEVEL_STARVING + 50) @@ -1148,14 +1166,31 @@ GLOBAL_LIST_EMPTY(roundstart_races) to_chat(H, "You no longer feel vigorous.") H.metabolism_efficiency = 1 + GET_COMPONENT_FROM(mood, /datum/component/mood, H) switch(H.nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) + if(mood) + mood.add_event("nutrition", /datum/mood_event/nutrition/fat) H.throw_alert("nutrition", /obj/screen/alert/fat) - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL) + if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) + if(mood) + mood.add_event("nutrition", /datum/mood_event/nutrition/wellfed) + H.clear_alert("nutrition") + if( NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) + if(mood) + mood.add_event("nutrition", /datum/mood_event/nutrition/fed) + H.clear_alert("nutrition") + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) + if(mood) + mood.clear_event("nutrition") H.clear_alert("nutrition") if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + if(mood) + mood.add_event("nutrition", /datum/mood_event/nutrition/hungry) H.throw_alert("nutrition", /obj/screen/alert/hungry) - else + if(0 to NUTRITION_LEVEL_STARVING) + if(mood) + mood.add_event("nutrition", /datum/mood_event/nutrition/starving) H.throw_alert("nutrition", /obj/screen/alert/starving) /datum/species/proc/update_health_hud(mob/living/carbon/human/H) @@ -1165,7 +1200,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) . = FALSE var/radiation = H.radiation - if(RADIMMUNE in species_traits) + if(H.has_trait(TRAIT_RADIMMUNE)) radiation = 0 return TRUE @@ -1255,15 +1290,24 @@ GLOBAL_LIST_EMPTY(roundstart_races) for(var/obj/item/I in H.held_items) if(I.flags_2 & SLOWS_WHILE_IN_HAND_2) . += I.slowdown - var/health_deficiency = (100 - H.health + H.staminaloss) - var/hungry = (500 - H.nutrition) / 5 // So overeat would be 100 and default level would be 80 + var/stambufferinfluence = (H.bufferedstam*(100/H.stambuffer))*0.2 //CIT CHANGE - makes stamina buffer influence movedelay + var/health_deficiency = ((100 + stambufferinfluence) - H.health + (H.staminaloss*0.75))//CIT CHANGE - reduces the impact of staminaloss on movement speed and makes stamina buffer influence movedelay if(health_deficiency >= 40) if(flight) - . += (health_deficiency / 75) + . += ((health_deficiency-39) / 75) // CIT CHANGE - adds -39 to health deficiency penalty to make the transition to low health movement a little less jarring else - . += (health_deficiency / 25) - if((hungry >= 70) && !flight) //Being hungry won't stop you from using flightpack controls/flapping your wings although it probably will in the wing case but who cares. - . += hungry / 50 + . += ((health_deficiency-39) / 25) // CIT CHANGE - ditto + + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(mood && !flight) //How can depression slow you down if you can just fly away from your problems? + switch(mood.mood) + if(-INFINITY to MOOD_LEVEL_SAD4) + . += 1.5 + if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3) + . += 1 + if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2) + . += 0.5 + if(H.has_trait(TRAIT_FAT)) . += (1.5 - flight) if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) @@ -1285,7 +1329,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) add_logs(user, target, "shaked") return 1 else - var/we_breathe = (!(NOBREATH in user.dna.species.species_traits)) + var/we_breathe = !user.has_trait(TRAIT_NOBREATH) var/we_lung = user.getorganslot(ORGAN_SLOT_LUNGS) if(we_breathe && we_lung) @@ -1313,6 +1357,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(user.has_trait(TRAIT_PACIFISM)) to_chat(user, "You don't want to harm [target]!") return FALSE + if(user.staminaloss >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit + to_chat(user, "You're too exhausted.") //CITADEL CHANGE - ditto + return FALSE //CITADEL CHANGE - ditto if(target.check_block()) target.visible_message("[target] blocks [user]'s attack!") return FALSE @@ -1334,8 +1381,19 @@ GLOBAL_LIST_EMPTY(roundstart_races) else user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) + user.adjustStaminaLossBuffered(5) //CITADEL CHANGE - makes punching cause staminaloss + var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh) + //CITADEL CHANGES - makes resting and disabled combat mode reduce punch damage, makes being out of combat mode result in you taking more damage + if(!target.combatmode && damage < user.dna.species.punchstunthreshold) + damage = user.dna.species.punchstunthreshold - 1 + if(user.resting) + damage *= 0.5 + if(!user.combatmode) + damage *= 0.25 + //END OF CITADEL CHANGES + var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected)) if(!damage || !affecting) @@ -1377,6 +1435,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) "You hear a slap.") target.endTailWag() return FALSE + else if(user.staminaloss >= STAMINA_SOFTCRIT) + to_chat(user, "You're too exhausted.") + return FALSE else if(target.check_block()) //END EDIT target.visible_message("[target] blocks [user]'s disarm attempt!") return 0 @@ -1385,22 +1446,31 @@ GLOBAL_LIST_EMPTY(roundstart_races) else user.do_attack_animation(target, ATTACK_EFFECT_DISARM) + user.adjustStaminaLossBuffered(3) //CITADEL CHANGE - makes disarmspam cause staminaloss + if(target.w_uniform) target.w_uniform.add_fingerprint(user) - var/randomized_zone = ran_zone(user.zone_selected) + //var/randomized_zone = ran_zone(user.zone_selected) CIT CHANGE - comments out to prevent compiling errors target.SendSignal(COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected) - var/obj/item/bodypart/affecting = target.get_bodypart(randomized_zone) + //var/obj/item/bodypart/affecting = target.get_bodypart(randomized_zone) CIT CHANGE - comments this out to prevent compile errors due to the below commented out bit var/randn = rand(1, 100) - if(randn <= 25) + /*if(randn <= 25) CITADEL CHANGE - moves disarm push attempts to right click playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) target.visible_message("[user] has pushed [target]!", "[user] has pushed [target]!", null, COMBAT_MESSAGE_RANGE) target.apply_effect(40, KNOCKDOWN, target.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!")) target.forcesay(GLOB.hit_appends) add_logs(user, target, "disarmed", " pushing them to the ground") - return + return*/ - if(randn <= 60) + if(!target.combatmode) // CITADEL CHANGE + randn += -10 //CITADEL CHANGE - being out of combat mode makes it easier for you to get disarmed + if(user.resting) //CITADEL CHANGE + randn += 60 //CITADEL CHANGE - No kosher disarming if you're resting + if(!user.combatmode) //CITADEL CHANGE + randn += 25 //CITADEL CHANGE - Makes it harder to disarm outside of combat mode + + if(randn <= 35)//CIT CHANGE - changes this back to a 35% chance to accomodate for the above being commented out in favor of right-click pushing var/obj/item/I = null if(target.pulling) target.visible_message("[user] has broken [target]'s grip on [target.pulling]!") @@ -1473,8 +1543,21 @@ GLOBAL_LIST_EMPTY(roundstart_races) armor_block = min(90,armor_block) //cap damage reduction at 90% var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) + //CIT CHANGES START HERE - combatmode and resting checks + var/totitemdamage = I.force + if(iscarbon(user)) + var/mob/living/carbon/tempcarb = user + if(!tempcarb.combatmode) + totitemdamage *= 0.5 + if(user.resting) + totitemdamage *= 0.5 + if(istype(H)) + if(!H.combatmode) + totitemdamage *= 1.5 + //CIT CHANGES END HERE + var/weakness = H.check_weakness(I, user) - apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H) + apply_damage(totitemdamage * weakness, I.damtype, def_zone, armor_block, H) //CIT CHANGE - replaces I.force with totitemdamage H.send_item_attack_message(I, user, hit_area) @@ -1483,7 +1566,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) //dismemberment var/probability = I.get_dismemberment_chance(affecting) - if(prob(probability) || ((EASYDISMEMBER in species_traits) && prob(2*probability))) + if(prob(probability) || (H.has_trait(TRAIT_EASYDISMEMBER) && prob(2*probability))) if(affecting.dismember(I.damtype)) I.add_mob_blood(H) playsound(get_turf(H), I.get_dismember_sound(), 80, 1) @@ -1612,9 +1695,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) ///////////// /datum/species/proc/breathe(mob/living/carbon/human/H) - if(NOBREATH in species_traits) + if(H.has_trait(TRAIT_NOBREATH)) return TRUE + /datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H) if(!environment) return @@ -1644,9 +1728,13 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.adjust_bodytemperature(natural*(1/(thermal_protection+1)) + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX)) // +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt. - if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(RESISTHOT in species_traits)) + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTHEAT)) //Body temperature is too hot. var/burn_damage + if(mood) + mood.clear_event("cold") + mood.add_event("hot", /datum/mood_event/hot) switch(H.bodytemperature) if(BODYTEMP_HEAT_DAMAGE_LIMIT to 400) H.throw_alert("temp", /obj/screen/alert/hot, 1) @@ -1664,7 +1752,11 @@ GLOBAL_LIST_EMPTY(roundstart_races) if (H.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) //40% for level 3 damage on humans H.emote("scream") H.apply_damage(burn_damage, BURN) + else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !(GLOB.mutations_list[COLDRES] in H.dna.mutations)) + if(mood) + mood.clear_event("hot") + mood.add_event("cold", /datum/mood_event/cold) switch(H.bodytemperature) if(200 to BODYTEMP_COLD_DAMAGE_LIMIT) H.throw_alert("temp", /obj/screen/alert/cold, 1) @@ -1678,12 +1770,15 @@ GLOBAL_LIST_EMPTY(roundstart_races) else H.clear_alert("temp") + if(mood) + mood.clear_event("cold") + mood.clear_event("hot") var/pressure = environment.return_pressure() var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. switch(adjusted_pressure) if(HAZARD_HIGH_PRESSURE to INFINITY) - if(!(RESISTPRESSURE in species_traits)) + if(!H.has_trait(TRAIT_RESISTHIGHPRESSURE)) H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 ) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod) H.throw_alert("pressure", /obj/screen/alert/highpressure, 2) else @@ -1695,7 +1790,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) H.throw_alert("pressure", /obj/screen/alert/lowpressure, 1) else - if(H.dna.check_mutation(COLDRES) || (RESISTPRESSURE in species_traits)) + if(H.has_trait(TRAIT_RESISTLOWPRESSURE)) H.clear_alert("pressure") else H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod) @@ -1706,7 +1801,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) ////////// /datum/species/proc/handle_fire(mob/living/carbon/human/H, no_protection = FALSE) - if(NOFIRE in species_traits) + if(H.has_trait(TRAIT_NOFIRE)) return if(H.on_fire) //the fire tries to damage the exposed clothes and items @@ -1772,8 +1867,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) else H.adjust_bodytemperature(BODYTEMP_HEATING_MAX + (H.fire_stacks * 12)) + /datum/species/proc/CanIgniteMob(mob/living/carbon/human/H) - if(NOFIRE in species_traits) + if(H.has_trait(TRAIT_NOFIRE)) return FALSE return TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 447245cad0..54549b15b9 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -3,7 +3,8 @@ id = "abductor" say_mod = "gibbers" sexes = FALSE - species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER,NOEYES) + species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOEYES) + inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NOGUNS,TRAIT_NOHUNGER,TRAIT_NOBREATH) mutanttongue = /obj/item/organ/tongue/abductor var/scientist = FALSE // vars to not pollute spieces list with castes diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 4badfa8405..0178a99dad 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -2,7 +2,8 @@ name = "Android" id = "android" say_mod = "states" - species_traits = list(SPECIES_ROBOTIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOBLOOD,PIERCEIMMUNE,NOHUNGER,EASYLIMBATTACHMENT) + species_traits = list(SPECIES_ROBOTIC,NOBLOOD) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT) meat = null damage_overlay_type = "synth" mutanttongue = /obj/item/organ/tongue/robot diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm index bc1fcc9b1e..aa310723dd 100644 --- a/code/modules/mob/living/carbon/human/species_types/corporate.dm +++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm @@ -15,5 +15,6 @@ attack_sound = 'sound/weapons/resonator_blast.ogg' blacklisted = 1 use_skintones = 0 - species_traits = list(SPECIES_ORGANIC,RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER,NOHUNGER) + species_traits = list(SPECIES_ORGANIC,NOBLOOD,EYECOLOR) + inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) sexes = 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 78cf1a3b7a..3a0e5a8415 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -2,7 +2,8 @@ name = "dullahan" id = "dullahan" default_color = "FFFFFF" - species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS,NOBREATH,NOHUNGER) + species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS) + inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) mutant_bodyparts = list("tail_human", "ears", "wings") default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") use_skintones = TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 1630b7a194..2208c5a597 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -53,7 +53,8 @@ miss_sound = 'sound/weapons/slashmiss.ogg' liked_food = MEAT disliked_food = TOXIC - + meat = /obj/item/reagent_containers/food/snacks/carpmeat/aquatic + /datum/species/aquatic/spec_death(gibbed, mob/living/carbon/human/H) if(H) H.endTailWag() @@ -247,7 +248,8 @@ name = "Slimeperson" id = "slimeperson" default_color = "00FFFF" - species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD,TOXINLOVER) + species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) + inherent_traits = list(TRAIT_TOXINLOVER) mutant_bodyparts = list("mam_tail", "mam_ears", "taur") default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None") say_mod = "says" @@ -350,3 +352,10 @@ H.update_body() else return + +//misc +/mob/living/carbon/human/dummy + no_vore = TRUE + +/mob/living/carbon/human/vore + devourable = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 3619e04584..d274261a2b 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -2,7 +2,8 @@ // Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck. name = "Golem" id = "iron golem" - species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR) + species_traits = list(SPECIES_INORGANIC,NOBLOOD,MUTCOLORS,NO_UNDERWEAR) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) mutant_organs = list(/obj/item/organ/adamantine_resonator) speedmod = 2 armor = 55 @@ -84,7 +85,7 @@ fixed_mut_color = "a3d" meat = /obj/item/stack/ore/plasma //Can burn and takes damage from heat - species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) info_text = "As a Plasma Golem, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!" heatmod = 0 //fine until they blow up prefix = "Plasma" @@ -258,7 +259,7 @@ fixed_mut_color = "49311c" meat = /obj/item/stack/sheet/mineral/wood //Can burn and take damage from heat - species_traits = list(SPECIES_ORGANIC,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) armor = 30 burnmod = 1.25 heatmod = 1.5 @@ -565,7 +566,7 @@ limbs_id = "cultgolem" sexes = FALSE info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder God Nar'Sie." - species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOEYES) //no mutcolors + species_traits = list(SPECIES_INORGANIC,NOBLOOD,NO_UNDERWEAR,NOEYES) //no mutcolors prefix = "Runic" var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift @@ -619,7 +620,7 @@ limbs_id = "clockgolem" info_text = "As a clockwork golem, you are faster than \ other types of golem (being a machine), and are immune to electric shocks." - species_traits = list(SPECIES_INORGANIC,NO_UNDERWEAR, NOTRANSSTING, NOBREATH, NOZOMBIE, RADIMMUNE, NOBLOOD, RESISTCOLD, RESISTPRESSURE, PIERCEIMMUNE, NOEYES) + species_traits = list(SPECIES_ROBOTIC,NOBLOOD,NO_UNDERWEAR,NOEYES) armor = 20 //Reinforced, but much less so to allow for fast movement attack_verb = "smash" attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg' @@ -671,7 +672,8 @@ limbs_id = "clothgolem" sexes = FALSE info_text = "As a Cloth Golem, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable." - species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR) //no mutcolors, and can burn + species_traits = list(SPECIES_UNDEAD,NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS) armor = 15 //feels no pain, but not too resistant burnmod = 2 // don't get burned speedmod = 1 // not as heavy as stone diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index f32588d6b3..809c657f23 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -4,7 +4,8 @@ id = "jelly" default_color = "00FF90" say_mod = "chirps" - species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE,HAIR,FACEHAIR,TOXINLOVER) //CIT CHANGE - adds HAIR and FACEHAIR to species traits + species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,,HAIR,FACEHAIR,NOBLOOD) + inherent_traits = list(TRAIT_TOXINLOVER) mutant_bodyparts = list("mam_tail", "mam_ears", "taur") //CIT CHANGE default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None") //CIT CHANGE meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime @@ -118,6 +119,7 @@ name = "Slimeperson" id = "slime" default_color = "00FFFF" + species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) say_mod = "says" hair_color = "mutcolor" hair_alpha = 150 @@ -382,6 +384,7 @@ around.", "...and move this one instead.") + ///////////////////////////////////LUMINESCENTS////////////////////////////////////////// //Luminescents are able to consume and use slime extracts, without them decaying. @@ -540,7 +543,6 @@ if(species.current_extract) species.extract_cooldown = world.time + 100 - var/cooldown = species.current_extract.activate(H, species, activation_type) species.extract_cooldown = world.time + cooldown @@ -553,8 +555,6 @@ ///////////////////////////////////STARGAZERS////////////////////////////////////////// //Stargazers are the telepathic branch of jellypeople, able to project psychic messages and to link minds with willing participants. -//Admin spawn only - /datum/species/jelly/stargazer name = "Stargazer" @@ -723,5 +723,4 @@ to_chat(H, "You connect [target]'s mind to your slime link!") else to_chat(H, "You can't seem to link [target]'s mind...") - to_chat(target, "The foreign presence leaves your mind.") - + to_chat(target, "The foreign presence leaves your mind.") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 0d006196aa..15c8f70dc8 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -54,4 +54,5 @@ name = "Ash Walker" id = "ashlizard" limbs_id = "lizard" - species_traits = list(MUTCOLORS,EYECOLOR,LIPS,NOBREATH,NOGUNS,DIGITIGRADE) + species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE) + inherent_traits = list(TRAIT_NOGUNS,TRAIT_NOBREATH) diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index 7f0d8afe26..8735d6ceb6 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -54,7 +54,7 @@ /datum/species/moth/space_move(mob/living/carbon/human/H) . = ..() - if(H.loc && !isspaceturf(H.loc) && H.dna.features["moth_wings"] != "Burnt Off" || "None") + if(H.loc && !isspaceturf(H.loc) && H.dna.features["moth_wings"] != "Burnt Off") var/datum/gas_mixture/current = H.loc.return_air() if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible return TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm new file mode 100644 index 0000000000..18cb2d248d --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -0,0 +1,60 @@ +/datum/species/mush //mush mush codecuck + name = "Mushroomperson" + id = "mush" + mutant_bodyparts = list("caps") + default_features = list("caps" = "Round") + + fixed_mut_color = "DBBF92" + hair_color = "FF4B19" //cap color, spot color uses eye color + nojumpsuit = TRUE + + say_mod = "poofs" //what does a mushroom sound like + species_traits = list(MUTCOLORS, NOEYES, NO_UNDERWEAR) + inherent_traits = list(TRAIT_NOBREATH) + speedmod = 1.5 //faster than golems but not by much + + punchdamagelow = 6 + punchdamagehigh = 14 + punchstunthreshold = 14 //about 44% chance to stun + + no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform) + + burnmod = 1.25 + heatmod = 1.5 + + mutanteyes = /obj/item/organ/eyes/night_vision/mushroom + use_skintones = FALSE + var/datum/martial_art/mushpunch/mush + +/datum/species/mush/check_roundstart_eligible() + return FALSE //hard locked out of roundstart on the order of design lead kor, this can be removed in the future when planetstation is here OR SOMETHING but right now we have a problem with races. + +/datum/species/mush/after_equip_job(datum/job/J, mob/living/carbon/human/H) + H.grant_language(/datum/language/mushroom) //pomf pomf + +/datum/species/mush/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(!H.dna.features["caps"]) + H.dna.features["caps"] = "Round" + handle_mutant_bodyparts(H) + H.faction |= "mushroom" + mush = new(null) + mush.teach(H) + +/datum/species/mush/on_species_loss(mob/living/carbon/C) + . = ..() + C.faction -= "mushroom" + mush.remove(C) + QDEL_NULL(mush) + +/datum/species/mush/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + if(chem.id == "weedkiller") + H.adjustToxLoss(3) + H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + return TRUE + +/datum/species/mush/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) + forced_colour = FALSE + ..() diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index a5c6720db5..5209fe8310 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -4,7 +4,8 @@ say_mod = "rattles" sexes = 0 meat = /obj/item/stack/sheet/mineral/plasma - species_traits = list(SPECIES_INORGANIC,NOBLOOD,RESISTCOLD,RADIMMUNE,NOTRANSSTING,NOHUNGER) + species_traits = list(SPECIES_INORGANIC,NOBLOOD,NOTRANSSTING) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER) mutantlungs = /obj/item/organ/lungs/plasmaman mutanttongue = /obj/item/organ/tongue/bone/plasmaman mutantliver = /obj/item/organ/liver/plasmaman diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 9357855191..17e7649cb6 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -9,7 +9,8 @@ blacklisted = 1 ignored_by = list(/mob/living/simple_animal/hostile/faithless) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow - species_traits = list(SPECIES_ORGANIC,NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,NOEYES) + species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOEYES) + inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH) dangerous_existence = 1 mutanteyes = /obj/item/organ/eyes/night_vision @@ -37,7 +38,8 @@ burnmod = 1.5 blacklisted = TRUE no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store) - species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOHUNGER,NO_DNA_COPY,NOTRANSSTING,NOEYES) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) mutanteyes = /obj/item/organ/eyes/night_vision/nightmare mutant_organs = list(/obj/item/organ/heart/nightmare) mutant_brain = /obj/item/organ/brain/nightmare diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index d47f3d71d5..c6a7e7a127 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -6,7 +6,8 @@ blacklisted = 1 sexes = 0 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton - species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT) + species_traits = list(SPECIES_UNDEAD,NOBLOOD) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT) mutanttongue = /obj/item/organ/tongue/bone damage_overlay_type = ""//let's not show bloody wounds or burns over bones. disliked_food = NONE diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index 856a472a73..786872544e 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -3,13 +3,15 @@ id = "synth" say_mod = "beep boops" //inherited from a user's real species sexes = 0 - species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //all of these + whatever we inherit from the real species + species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING) //all of these + whatever we inherit from the real species + inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH) dangerous_existence = 1 blacklisted = 1 meat = null damage_overlay_type = "synth" limbs_id = "synth" - var/list/initial_species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER,NO_DNA_COPY) //for getting these values back for assume_disguise() + var/list/initial_species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING) //for getting these values back for assume_disguise() + var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH) var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged @@ -41,7 +43,9 @@ say_mod = S.say_mod sexes = S.sexes species_traits = initial_species_traits.Copy() + inherent_traits = initial_inherent_traits.Copy() species_traits |= S.species_traits + inherent_traits |= S.inherent_traits species_traits -= list(SPECIES_ORGANIC, SPECIES_INORGANIC, SPECIES_UNDEAD) attack_verb = S.attack_verb attack_sound = S.attack_sound @@ -61,6 +65,7 @@ name = initial(name) say_mod = initial(say_mod) species_traits = initial_species_traits.Copy() + inherent_traits = initial_inherent_traits.Copy() attack_verb = initial(attack_verb) attack_sound = initial(attack_sound) miss_sound = initial(miss_sound) diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 5186811331..2267be85f2 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -2,7 +2,8 @@ name = "vampire" id = "vampire" default_color = "FFFFFF" - species_traits = list(SPECIES_UNDEAD,EYECOLOR,HAIR,FACEHAIR,LIPS,NOHUNGER,NOBREATH,DRINKSBLOOD) + species_traits = list(SPECIES_UNDEAD,EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD) + inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) mutant_bodyparts = list("tail_human", "ears", "wings") default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") exotic_bloodtype = "U" diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 14502aa931..7fcc470661 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -8,7 +8,8 @@ sexes = 0 blacklisted = 1 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie - species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT,NOTRANSSTING) + species_traits = list(SPECIES_UNDEAD,NOBLOOD,NOZOMBIE,NOTRANSSTING) + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH) mutanttongue = /obj/item/organ/tongue/zombie var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg') disliked_food = NONE diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index cf3d676e90..844545a748 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -9,6 +9,13 @@ /mob/living/carbon/human/Unconscious(amount, updating = 1, ignore_canunconscious = 0) amount = dna.species.spec_stun(src,amount) + if(has_trait(TRAIT_HEAVY_SLEEPER)) + amount *= rand(1.25, 1.3) + return ..() + +/mob/living/carbon/human/Sleeping(amount, updating = 1, ignore_sleepimmune = 0) + if(has_trait(TRAIT_HEAVY_SLEEPER)) + amount *= rand(1.25, 1.3) return ..() /mob/living/carbon/human/cure_husk(list/sources) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 8cbbc2b90f..dc939f8fc1 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -52,6 +52,8 @@ return if(ismob(loc)) return + if(istype(loc, /obj/belly)) + return var/datum/gas_mixture/environment if(loc) @@ -102,7 +104,9 @@ air_update_turf() /mob/living/carbon/proc/has_smoke_protection() - return 0 + if(has_trait(TRAIT_NOBREATH)) + return TRUE + return FALSE //Third link in a breath chain, calls handle_breath_temperature() @@ -140,6 +144,7 @@ //OXYGEN + GET_COMPONENT_FROM(mood, /datum/component/mood, src) if(O2_partialpressure < safe_oxy_min) //Not enough oxygen if(prob(20)) emote("gasp") @@ -152,6 +157,8 @@ adjustOxyLoss(3) failed_last_breath = 1 throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + if(mood) + mood.add_event("suffocation", /datum/mood_event/suffocation) else //Enough oxygen failed_last_breath = 0 @@ -159,6 +166,8 @@ adjustOxyLoss(-5) oxygen_used = breath_gases[/datum/gas/oxygen][MOLES] clear_alert("not_enough_oxy") + if(mood) + mood.clear_event("suffocation") breath_gases[/datum/gas/oxygen][MOLES] -= oxygen_used breath_gases[/datum/gas/carbon_dioxide][MOLES] += oxygen_used @@ -249,7 +258,7 @@ O.on_life() /mob/living/carbon/handle_diseases() - for(var/thing in viruses) + for(var/thing in diseases) var/datum/disease/D = thing if(prob(D.infectivity)) D.spread() @@ -322,8 +331,17 @@ //this updates all special effects: stun, sleeping, knockdown, druggy, stuttering, etc.. /mob/living/carbon/handle_status_effects() ..() - if(staminaloss) - adjustStaminaLoss(-3) + if(staminaloss && !combatmode && !aimingdownsights)//CIT CHANGE - prevents stamina regen while combat mode is active + adjustStaminaLoss(resting ? (recoveringstam ? -7.5 : -3) : -1.5)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke + else if(aimingdownsights)//CIT CHANGE - makes aiming down sights drain stamina + adjustStaminaLoss(resting ? 0.2 : 0.5)//CIT CHANGE - ditto. Raw spaghetti + + //CIT CHANGES START HERE. STAMINA BUFFER STUFF + if(bufferedstam && world.time > stambufferregentime) + var/drainrate = max((bufferedstam*(bufferedstam/(5)))*0.1,1) + bufferedstam = max(bufferedstam - drainrate, 0) + adjustStaminaLoss(drainrate*0.5) + //END OF CIT CHANGES var/restingpwr = 1 + 4 * resting @@ -434,10 +452,10 @@ L.damage += d /mob/living/carbon/proc/liver_failure() - if(reagents.get_reagent_amount("corazone"))//corazone is processed here an not in the liver because a failing liver can't metabolize reagents - reagents.remove_reagent("corazone", 0.4) //corazone slowly deletes itself. + reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE) + if(has_trait(TRAIT_STABLEHEART)) return - adjustToxLoss(8, TRUE, TRUE) + adjustToxLoss(8, TRUE, TRUE) if(prob(30)) to_chat(src, "You feel confused and nauseous...")//actual symptoms of liver failure diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 32b368db4f..ec419ef94c 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -1,3 +1,4 @@ +#define MAX_RANGE_FIND 32 /mob/living/carbon/monkey var/aggressive=0 // set to 1 using VV for an angry monkey @@ -140,7 +141,7 @@ // Really no idea what needs to be returned but everything else is TRUE return TRUE - if(on_fire || buckled || restrained()) + if(on_fire || buckled || restrained() || (resting && canmove)) //CIT CHANGE - adds (resting && canmove) to make monkey ai attempt to resist out of resting if(!resisting && prob(MONKEY_RESIST_PROB)) resisting = TRUE walk_to(src,0) @@ -475,3 +476,5 @@ if(A) dropItemToGround(A, TRUE) update_icons() + +#undef MAX_RANGE_FIND diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index eccdd5d2cf..1db31d5a2d 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -42,12 +42,17 @@ /mob/living/carbon/adjust_drugginess(amount) druggy = max(druggy+amount, 0) + GET_COMPONENT_FROM(mood, /datum/component/mood, src) if(druggy) overlay_fullscreen("high", /obj/screen/fullscreen/high) throw_alert("high", /obj/screen/alert/high) + if(mood) + mood.add_event("high", /datum/mood_event/drugs/high) else clear_fullscreen("high") clear_alert("high") + if(mood) + mood.clear_event("high") /mob/living/carbon/set_drugginess(amount) druggy = max(amount, 0) @@ -97,4 +102,3 @@ var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) if(B) . = B.cure_all_traumas(resilience) - diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 8043f055bb..0c63ad2ab4 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -54,9 +54,6 @@ handle_fire() - // Citadel Vore code for belly processes - handle_internal_contents() - //stuff in the stomach handle_stomach() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c78d8b19d7..ad9d76b6f4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -48,7 +48,7 @@ staticOverlays.len = 0 remove_from_all_data_huds() GLOB.mob_living_list -= src - + QDEL_LIST(diseases) return ..() /mob/living/ghostize(can_reenter_corpse = 1) @@ -108,24 +108,24 @@ /mob/living/proc/MobCollide(mob/M) //Even if we don't push/swap places, we "touched" them, so spread fire spreadFire(M) - //Also diseases - for(var/thing in viruses) - var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) - M.ContactContractDisease(D) - - for(var/thing in M.viruses) - var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) - ContactContractDisease(D) if(now_pushing) return TRUE - - //Should stop you pushing a restrained person out of the way if(isliving(M)) var/mob/living/L = M + //Also spread diseases + for(var/thing in diseases) + var/datum/disease/D = thing + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + L.ContactContractDisease(D) + + for(var/thing in L.diseases) + var/datum/disease/D = thing + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + ContactContractDisease(D) + + //Should stop you pushing a restrained person out of the way if(L.pulledby && L.pulledby != src && L.restrained()) if(!(world.time % 5)) to_chat(src, "[L] is restrained, you cannot push past.") @@ -224,6 +224,60 @@ AM.setDir(current_dir) now_pushing = 0 +/mob/living/start_pulling(atom/movable/AM, supress_message = 0) + if(!AM || !src) + return FALSE + if(!(AM.can_be_pulled(src))) + return FALSE + if(throwing || incapacitated()) + return FALSE + + AM.add_fingerprint(src) + + // If we're pulling something then drop what we're currently pulling and pull this instead. + if(pulling) + // Are we trying to pull something we are already pulling? Then just stop here, no need to continue. + if(AM == pulling) + return + stop_pulling() + + changeNext_move(CLICK_CD_GRABBING) + + if(AM.pulledby) + if(!supress_message) + visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") + add_logs(AM, AM.pulledby, "pulled from", src) + AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. + + pulling = AM + AM.pulledby = src + if(!supress_message) + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + update_pull_hud_icon() + + if(ismob(AM)) + var/mob/M = AM + + add_logs(src, M, "grabbed", addition="passive grab") + if(!supress_message) + visible_message("[src] has grabbed [M] passively!") + if(!iscarbon(src)) + M.LAssailant = null + else + M.LAssailant = usr + if(isliving(M)) + var/mob/living/L = M + //Share diseases that are spread by touch + for(var/thing in diseases) + var/datum/disease/D = thing + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + L.ContactContractDisease(D) + + for(var/thing in L.diseases) + var/datum/disease/D = thing + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + ContactContractDisease(D) + //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm /mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1)) @@ -235,6 +289,15 @@ else stop_pulling() +/mob/living/stop_pulling() + ..() + update_pull_hud_icon() + +/mob/living/verb/stop_pulling1() + set name = "Stop Pulling" + set category = "IC" + stop_pulling() + //same as above /mob/living/pointed(atom/A as mob|obj|turf in view()) if(incapacitated()) @@ -257,7 +320,7 @@ death() /mob/living/incapacitated(ignore_restraints, ignore_grab) - if(stat || IsUnconscious() || IsStun() || IsKnockdown() || (!ignore_restraints && restrained(ignore_grab))) + if(stat || IsUnconscious() || IsStun() || IsKnockdown() || recoveringstam || (!ignore_restraints && restrained(ignore_grab))) // CIT CHANGE - adds recoveringstam check here return 1 /mob/living/proc/InCritical() @@ -314,6 +377,7 @@ /mob/proc/get_contents() +/*CIT CHANGE - comments out lay_down proc to be modified in modular_citadel /mob/living/proc/lay_down() set name = "Rest" set category = "IC" @@ -321,6 +385,7 @@ resting = !resting to_chat(src, "You are now [resting ? "resting" : "getting up"].") update_canmove() +*/ //Recursive function to find everything a mob is holding. /mob/living/get_contents(obj/item/storage/Storage = null) @@ -580,9 +645,9 @@ if(buckled && last_special <= world.time) resist_buckle() - // climbing out of a gut + // CIT CHANGE - climbing out of a gut if(attempt_vr(src,"vore_process_resist",args)) return TRUE - + //Breaking out of a container (Locker, sleeper, cryo...) else if(isobj(loc)) var/obj/C = loc @@ -599,6 +664,8 @@ else if(canmove) if(on_fire) resist_fire() //stop, drop, and roll + else if(resting) //cit change - allows resisting out of resting + resist_a_rest() // ditto else if(last_special <= world.time) resist_restraints() //trying to remove cuffs. @@ -788,15 +855,21 @@ return FALSE return TRUE -/mob/living/proc/can_use_guns(obj/item/G) +/mob/living/proc/can_use_guns(obj/item/G)//actually used for more than guns! if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser()) to_chat(src, "You don't have the dexterity to do this!") return FALSE + var/obj/item/gun/shooty + if(istype(G, /obj/item/gun)) + shooty = G if(has_trait(TRAIT_PACIFISM)) + if(shooty && !shooty.harmful) + return TRUE to_chat(src, "You don't want to risk harming anyone!") return FALSE return TRUE +/*CIT CHANGE - comments out update_stamina to be modified in modular_citadel /mob/living/carbon/proc/update_stamina() if(staminaloss) var/total_health = (health - staminaloss) @@ -805,6 +878,7 @@ Knockdown(100) setStaminaLoss(health - 2) update_health_hud() +*/ /mob/living/carbon/alien/update_stamina() return @@ -889,6 +963,9 @@ "You're set on fire!") new/obj/effect/dummy/fire(src) throw_alert("fire", /obj/screen/alert/fire) + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + mood.add_event("on_fire", /datum/mood_event/on_fire) update_fire() return TRUE return FALSE @@ -900,6 +977,9 @@ for(var/obj/effect/dummy/fire/F in src) qdel(F) clear_alert("fire") + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + mood.clear_event("on_fire") update_fire() /mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person @@ -953,25 +1033,32 @@ var/ko = IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (has_trait(TRAIT_FAKEDEATH)) var/move_and_fall = stat == SOFT_CRIT && !pulledby var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK + var/pinned = resting && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE // Cit change - adds pinning for aggressive-grabbing people on the ground var/buckle_lying = !(buckled && !buckled.buckle_lying) var/has_legs = get_num_legs() var/has_arms = get_num_arms() var/ignore_legs = get_leg_ignore() - if(ko || resting || move_and_fall || IsStun() || chokehold) + if(ko || move_and_fall || IsStun() || chokehold) // Cit change - makes resting not force you to drop everything drop_all_held_items() unset_machine() if(pulling) stop_pulling() + else if(resting) //CIT CHANGE - makes resting make you stop pulling and interacting with machines + unset_machine() //CIT CHANGE - Ditto! + if(pulling) //CIT CHANGE - Ditto. + stop_pulling() //CIT CHANGE - Ditto... else if(has_legs || ignore_legs) lying = 0 if(buckled) lying = 90*buckle_lying else if(!lying) if(resting) - fall() + lying = pick(90, 270) // Cit change - makes resting not force you to drop your held items + if(has_gravity()) // Cit change - Ditto + playsound(src, "bodyfall", 50, 1) // Cit change - Ditto! else if(ko || move_and_fall || (!has_legs && !ignore_legs) || chokehold) fall(forced = 1) - canmove = !(ko || resting || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms)) + canmove = !(ko || recoveringstam || pinned || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms)) //Cit change - makes it plausible to move while resting, adds pinning and stamina crit density = !lying if(lying) if(layer == initial(layer)) //to avoid special cases like hiding larvas. @@ -984,6 +1071,8 @@ if(client) client.move_delay = world.time + movement_delay() lying_prev = lying + if(canmove && !intentionalresting && iscarbon(src) && client && client.prefs && client.prefs.autostand)//CIT CHANGE - adds autostanding as a preference + resist_a_rest(TRUE)//CIT CHANGE - ditto return canmove /mob/living/proc/AddAbility(obj/effect/proc_holder/A) @@ -1074,3 +1163,54 @@ return FALSE mob_pickup(user) return TRUE + +/mob/living/proc/get_static_viruses() //used when creating blood and other infective objects + if(!LAZYLEN(diseases)) + return + var/list/datum/disease/result = list() + for(var/datum/disease/D in diseases) + var/static_virus = D.Copy() + result += static_virus + return result + +/mob/living/reset_perspective(atom/A) + if(..()) + update_sight() + if(client.eye && client.eye != src) + var/atom/AT = client.eye + AT.get_remote_view_fullscreens(src) + else + clear_fullscreen("remote_view", 0) + update_pipe_vision() + +/mob/living/vv_edit_var(var_name, var_value) + switch(var_name) + if("stat") + if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life + GLOB.dead_mob_list -= src + GLOB.alive_mob_list += src + if((stat < DEAD) && (var_value == DEAD))//Kill he + GLOB.alive_mob_list -= src + GLOB.dead_mob_list += src + . = ..() + switch(var_name) + if("knockdown") + SetKnockdown(var_value) + if("stun") + SetStun(var_value) + if("unconscious") + SetUnconscious(var_value) + if("sleeping") + SetSleeping(var_value) + if("eye_blind") + set_blindness(var_value) + if("eye_damage") + set_eye_damage(var_value) + if("eye_blurry") + set_blurriness(var_value) + if("maxHealth") + updatehealth() + if("resize") + update_transform() + if("lighting_alpha") + sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 8ba5449b8e..f31d95a9d7 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -34,6 +34,8 @@ var/list/status_traits = list() + var/list/roundstart_traits = list() + var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them. var/now_pushing = null //used by living/Collide() and living/PushAM() to prevent potential infinite loop. @@ -105,3 +107,7 @@ var/radiation = 0 //If the mob is irradiated. var/ventcrawl_layer = PIPING_LAYER_DEFAULT var/losebreath = 0 + + //List of active diseases + var/list/diseases = list() // list of all diseases in a mob + var/list/disease_resistances = list() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 737069a44d..11c57c9bbc 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -59,6 +59,29 @@ GLOBAL_LIST_INIT(department_radio_keys, list( "÷" = "cords" )) +/mob/living/proc/Ellipsis(original_msg, chance = 50, keep_words) + if(chance <= 0) + return "..." + if(chance >= 100) + return original_msg + + var/list + words = splittext(original_msg," ") + new_words = list() + + var/new_msg = "" + + for(var/w in words) + if(prob(chance)) + new_words += "..." + if(!keep_words) + continue + new_words += w + + new_msg = jointext(new_words," ") + + return new_msg + /mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE) var/static/list/crit_allowed_modes = list(MODE_WHISPER = TRUE, MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE) var/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE) @@ -381,4 +404,4 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(.) return . - . = ..() \ No newline at end of file + . = ..() diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index bf3139cc4f..829e467ebc 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -106,10 +106,10 @@ var/turf/t = turf if(obscuredTurfs[t]) if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, null, LIGHTING_LAYER+1) + t.obscured = image('icons/effects/cameravis.dmi', t, null, BYOND_LIGHTING_LAYER+0.1) t.obscured.pixel_x = -t.pixel_x t.obscured.pixel_y = -t.pixel_y - t.obscured.plane = LIGHTING_PLANE+1 + t.obscured.plane = BYOND_LIGHTING_PLANE+0.1 obscured += t.obscured for(var/eye in seenby) var/mob/camera/aiEye/m = eye @@ -170,4 +170,4 @@ obscured += t.obscured #undef UPDATE_BUFFER -#undef CHUNK_SIZE \ No newline at end of file +#undef CHUNK_SIZE diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 97034d389c..ae95a317a3 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -50,7 +50,7 @@ var/turf/T = get_turf(src) var/area/A = get_area(src) switch(requires_power) - if(POWER_REQ_NONE) + if(NONE) return FALSE if(POWER_REQ_ALL) return !T || !A || ((!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha))) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index b55fa2a663..75f0fb5e81 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -154,6 +154,7 @@ return 1 return 0 +#undef VOX_DELAY #endif /mob/living/silicon/ai/could_speak_in_language(datum/language/dt) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index cc17d8e4bd..2a2cda19e0 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -511,7 +511,7 @@ Structural Integrity: [M.getBruteLoss() > 50 ? "" : ""][M.getBruteLoss()]
Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
"} - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing dat += {"

Infection Detected.


Name: [D.name]
diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 7f6206dafb..aa1f5aff65 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -66,4 +66,4 @@ temp = master.supplied[index] if (length(temp) > 0) laws.supplied[index] = temp - return + return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 3ff18c8747..0ca3c63162 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -93,7 +93,7 @@ cut_overlay(fire_overlay) /mob/living/silicon/robot/update_canmove() - if(stat || buckled || lockcharge) + if(stat || buckled || lockcharge || resting) //CITADEL EDIT resting dogborg-os canmove = 0 else canmove = 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 553faeacd7..2a3af029dd 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -365,8 +365,12 @@ to_chat(user, "You start fixing yourself...") if(!W.use_tool(src, user, 50)) return - - adjustBruteLoss(-30) + adjustBruteLoss(-10) + else + to_chat(user, "You start fixing [src]...") + if(!do_after(user, 30, target = src)) + return + adjustBruteLoss(-30) updatehealth() add_fingerprint(user) visible_message("[user] has fixed some of the dents on [src].") @@ -376,11 +380,16 @@ user.changeNext_move(CLICK_CD_MELEE) var/obj/item/stack/cable_coil/coil = W if (getFireLoss() > 0 || getToxLoss() > 0) - if(src == user) + if(src == user && coil.use(1)) to_chat(user, "You start fixing yourself...") if(!do_after(user, 50, target = src)) return + adjustFireLoss(-10) + adjustToxLoss(-10) if (coil.use(1)) + to_chat(user, "You start fixing [src]...") + if(!do_after(user, 30, target = src)) + return adjustFireLoss(-30) adjustToxLoss(-30) updatehealth() @@ -592,9 +601,8 @@ //Citadel changes start here - Allows modules to use different icon files, and allows modules to specify a pixel offset icon = (module.cyborg_icon_override ? module.cyborg_icon_override : initial(icon)) - if(laser) - add_overlay("module.laser")//Is this even used??? - Yes modular_citadel/borg/inventory.dm + add_overlay("laser")//Is this even used??? - Yes borg/inventory.dm if(disabler) add_overlay("disabler")//ditto @@ -602,6 +610,13 @@ add_overlay("[module.sleeper_overlay]_g") if(sleeper_r && module.sleeper_overlay) add_overlay("[module.sleeper_overlay]_r") + if(module.dogborg == TRUE) + if(resting) + cut_overlays() + icon_state = "[module.cyborg_base_icon]-rest" + else + icon_state = "[module.cyborg_base_icon]" + if(stat == DEAD && module.has_snowflake_deadsprite) icon_state = "[module.cyborg_base_icon]-wreck" @@ -612,7 +627,6 @@ if(module.cyborg_base_icon == "robot") icon = 'icons/mob/robots.dmi' pixel_x = initial(pixel_x) - if(stat != DEAD && !(IsUnconscious() || IsStun() || IsKnockdown() || low_power_mode)) //Not dead, not stunned. if(!eye_lights) eye_lights = new() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4b23e6f47f..d3d324b5fa 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -198,27 +198,31 @@ /obj/item/robot_module/proc/do_transform_animation() var/mob/living/silicon/robot/R = loc - R.notransform = TRUE - var/obj/effect/temp_visual/decoy/fading/fivesecond/ANM = new /obj/effect/temp_visual/decoy/fading/fivesecond(R.loc, R) - ANM.layer = R.layer - 0.01 - new /obj/effect/temp_visual/small_smoke(R.loc) if(R.hat) R.hat.forceMove(get_turf(R)) R.hat = null - R.update_headlamp() - R.alpha = 0 - animate(R, alpha = 255, time = 50) + R.cut_overlays() + R.setDir(SOUTH) + do_transform_delay() + +/obj/item/robot_module/proc/do_transform_delay() + var/mob/living/silicon/robot/R = loc var/prev_lockcharge = R.lockcharge + sleep(1) + flick("[cyborg_base_icon]_transform", R) + R.notransform = TRUE R.SetLockdown(1) R.anchored = TRUE - sleep(2) + sleep(1) for(var/i in 1 to 4) playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, 1, -1) - sleep(12) + sleep(7) if(!prev_lockcharge) R.SetLockdown(0) + R.setDir(SOUTH) R.anchored = FALSE R.notransform = FALSE + R.update_headlamp() R.notify_ai(NEW_MODULE) if(R.hud_used) R.hud_used.update_robot_modules_display() diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index d265d19cb2..9b4386c727 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -274,7 +274,7 @@ Auto Patrol[]"}, if(BOT_PREP_ARREST) // preparing to arrest target // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again. - if(!Adjacent(target) || !isturf(target.loc) || target.AmountKnockdown() < 40) + if(!Adjacent(target) || !isturf(target.loc) || !target.recoveringstam || target.staminaloss <= 120) // CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks back_to_hunt() return @@ -301,7 +301,7 @@ Auto Patrol[]"}, back_to_idle() return - if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountKnockdown() < 40)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. + if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !target.recoveringstam && target.staminaloss <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss checks back_to_hunt() return else @@ -523,7 +523,7 @@ Auto Patrol[]"}, return if(iscarbon(A)) var/mob/living/carbon/C = A - if(!C.IsStun() || arrest_type) + if(C.canmove || arrest_type) // CIT CHANGE - makes sentient ed209s check for canmove rather than !isstun. stun_attack(A) else if(C.canBeHandcuffed() && !C.handcuffed) cuff(A) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 6946c8992f..4cf1f6b13f 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -383,12 +383,12 @@ return TRUE if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus)) - for(var/thing in C.viruses) + for(var/thing in C.diseases) var/datum/disease/D = thing //the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines. if(!(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) \ - && D.severity != VIRUS_SEVERITY_POSITIVE \ - && (D.stage > 1 || (D.spread_flags & VIRUS_SPREAD_AIRBORNE))) // medibot can't detect a virus in its initial stage unless it spreads airborne. + && D.severity != DISEASE_SEVERITY_POSITIVE \ + && (D.stage > 1 || (D.spread_flags & DISEASE_SPREAD_AIRBORNE))) // medibot can't detect a virus in its initial stage unless it spreads airborne. return TRUE //STOP DISEASE FOREVER return FALSE @@ -435,12 +435,12 @@ else if(treat_virus) var/virus = 0 - for(var/thing in C.viruses) + for(var/thing in C.diseases) var/datum/disease/D = thing //detectable virus if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC))) - if(D.severity != VIRUS_SEVERITY_POSITIVE) //virus is harmful - if((D.stage > 1) || (D.spread_flags & VIRUS_SPREAD_AIRBORNE)) + if(D.severity != DISEASE_SEVERITY_POSITIVE) //virus is harmful + if((D.stage > 1) || (D.spread_flags & DISEASE_SPREAD_AIRBORNE)) virus = 1 if(!reagent_id && (virus)) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 68b82abb0e..1754a20b94 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -203,7 +203,7 @@ Auto Patrol: []"}, return if(iscarbon(A)) var/mob/living/carbon/C = A - if(!C.IsStun() || arrest_type) + if(C.canmove || arrest_type) // CIT CHANGE - makes sentient secbots check for canmove rather than !isstun. stun_attack(A) else if(C.canBeHandcuffed() && !C.handcuffed) cuff(A) @@ -305,7 +305,7 @@ Auto Patrol: []"}, if(BOT_PREP_ARREST) // preparing to arrest target // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again. - if( !Adjacent(target) || !isturf(target.loc) || target.AmountKnockdown() < 40) + if( !Adjacent(target) || !isturf(target.loc) || target.staminaloss <= 120 || !target.recoveringstam) //CIT CHANGE - replaces amountknockdown with checks for stamina so secbots dont run into an infinite loop back_to_hunt() return @@ -332,7 +332,7 @@ Auto Patrol: []"}, back_to_idle() return - if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountKnockdown() < 40)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. + if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && !target.recoveringstam && target.staminaloss <= 120)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. CIT CHANGE - replaces amountknockdown with recoveringstam and staminaloss check back_to_hunt() return else //Try arresting again if the target escapes. diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 1c12b48919..f50b7c0ccf 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -313,8 +313,8 @@ desc = "A long, thin construct built to herald Nar-Sie's rise. It'll be all over soon." icon_state = "chosen" icon_living = "chosen" - maxHealth = 60 - health = 60 + maxHealth = 40 + health = 40 sight = SEE_MOBS melee_damage_lower = 15 melee_damage_upper = 20 @@ -340,12 +340,9 @@ /mob/living/simple_animal/hostile/construct/harvester/AttackingTarget() if(iscarbon(target)) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.dna && H.dna.species) - if(NODISMEMBER in H.dna.species.species_traits) - return ..() //ATTACK! var/mob/living/carbon/C = target + if(C.has_trait(TRAIT_NODISMEMBER)) + return ..() //ATTACK! var/list/parts = list() var/undismembermerable_limbs = 0 for(var/X in C.bodyparts) @@ -439,7 +436,8 @@ else if(LAZYLEN(GLOB.cult_narsie.souls_needed)) the_construct.master = pick(GLOB.cult_narsie.souls_needed) - to_chat(the_construct, "You are now tracking your prey, [the_construct.master] - harvest them!") + var/mob/living/real_target = the_construct.master //We can typecast this way because Narsie only allows /mob/living into the souls list + to_chat(the_construct, "You are now tracking your prey, [real_target.real_name] - harvest them!") else to_chat(the_construct, "Nar'Sie has completed her harvest!") return diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index a6e24f43dd..5a9ae07374 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -58,3 +58,4 @@ icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") + beauty = -300 diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 282a02494a..ae1681cbef 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -231,6 +231,9 @@ return if(!item_to_add) user.visible_message("[user] pets [src].","You rest your hand on [src]'s head for a moment.") + GET_COMPONENT_FROM(mood, /datum/component/mood, user) + if(mood) + mood.add_event("pet_corgi", /datum/mood_event/pet_corgi) return if(user && !user.temporarilyRemoveItemFromInventory(item_to_add)) @@ -613,6 +616,9 @@ if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454 new /obj/effect/temp_visual/heart(loc) emote("me", 1, "yaps happily!") + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("pet_corgi", /datum/mood_event/pet_corgi) else if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case) emote("me", 1, "growls!") diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index a3bc98f48a..646987b155 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -22,7 +22,7 @@ ventcrawler = VENTCRAWLER_ALWAYS var/datum/mind/origin var/egg_lain = 0 - //gold_core_spawnable = HOSTILE_SPAWN //are you sure about this?? + gold_core_spawnable = NO_SPAWN //are you sure about this?? // CITADEL CHANGE, Yes. /mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) var/obj/item/organ/body_egg/changeling_egg/egg = new(victim) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 8207f321cd..edb6e47ca8 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -106,7 +106,7 @@ if(!search_objects) . = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide - var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden)) + var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/device/electronic_assembly)) for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines)) if(can_see(targets_from, HM, vision_range)) @@ -209,6 +209,11 @@ return FALSE return TRUE + if(istype(the_target, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/O = the_target + if(O.combat_circuits) + return TRUE + if(istype(the_target, /obj/structure/destructible/clockwork/ocular_warden)) var/obj/structure/destructible/clockwork/ocular_warden/OW = the_target if(OW.target != src) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index de8545d3f0..eb2b1be1d4 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -66,6 +66,7 @@ desc = "A small pool of sludge, containing trace amounts of leaper venom." icon = 'icons/effects/tomatodecal.dmi' icon_state = "tomato_floor1" + beauty = -200 /obj/structure/leaper_bubble name = "leaper bubble" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm index 898a2ad734..1af22a8960 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm @@ -1,26 +1,27 @@ /mob/living/simple_animal/hostile/megafauna/dragon vore_active = TRUE + no_vore = FALSE /mob/living/simple_animal/hostile/megafauna/dragon/Initialize() // Create and register 'stomachs' - var/datum/belly/megafauna/dragon/maw/maw = new(src) - var/datum/belly/megafauna/dragon/gullet/gullet = new(src) - var/datum/belly/megafauna/dragon/gut/gut = new(src) - for(var/datum/belly/X in list(maw, gullet, gut)) - vore_organs[X.name] = X + var/obj/belly/megafauna/dragon/maw/maw = new(src) + var/obj/belly/megafauna/dragon/gullet/gullet = new(src) + var/obj/belly/megafauna/dragon/gut/gut = new(src) +// for(var/obj/belly/X in list(maw, gullet, gut)) +// vore_organs[X.name] = X // Connect 'stomachs' together maw.transferlocation = gullet gullet.transferlocation = gut - vore_selected = maw.name // NPC eats into maw + vore_selected = maw // NPC eats into maw return ..() -/datum/belly/megafauna/dragon +/obj/belly/megafauna/dragon human_prey_swallow_time = 50 // maybe enough to switch targets if distracted nonhuman_prey_swallow_time = 50 -/datum/belly/megafauna/dragon/maw +/obj/belly/megafauna/dragon/maw name = "maw" - inside_flavor = "The maw of the dreaded Ash drake closes around you, engulfing you into a swelteringly hot, disgusting enviroment. The acidic saliva tingles over your form while that tongue pushes you further back...towards the dark gullet beyond." + desc = "The maw of the dreaded Ash drake closes around you, engulfing you into a swelteringly hot, disgusting enviroment. The acidic saliva tingles over your form while that tongue pushes you further back...towards the dark gullet beyond." vore_verb = "scoop" vore_sound = 'sound/vore/pred/taurswallow.ogg' swallow_time = 20 @@ -30,9 +31,9 @@ autotransferchance = 66 autotransferwait = 200 -/datum/belly/megafauna/dragon/gullet +/obj/belly/megafauna/dragon/gullet name = "gullet" - inside_flavor = "A ripple of muscle and arching of the tongue pushes you down like any other food. No choice in the matter, you're simply consumed. The dark ambiance of the outside world is replaced with working, wet flesh. Your only light being what you brought with you." + desc = "A ripple of muscle and arching of the tongue pushes you down like any other food. No choice in the matter, you're simply consumed. The dark ambiance of the outside world is replaced with working, wet flesh. Your only light being what you brought with you." swallow_time = 60 // costs extra time to eat directly to here escapechance = 5 // From above, will transfer into gut @@ -40,10 +41,10 @@ autotransferchance = 50 autotransferwait = 200 -/datum/belly/megafauna/dragon/gut +/obj/belly/megafauna/dragon/gut name = "stomach" vore_capacity = 5 //I doubt this many people will actually last in the gut, but... - inside_flavor = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny." + desc = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny." digest_mode = DM_DRAGON digest_burn = 5 swallow_time = 100 // costs extra time to eat directly to here diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 670d571d4d..7259a730e5 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -101,15 +101,19 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca var/destroy_objects = 0 var/knockdown_people = 0 var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes") + var/overlay_googly_eyes = TRUE + var/idledamage = TRUE gold_core_spawnable = NO_SPAWN -/mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0) +/mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0, no_googlies = FALSE) . = ..() + if (no_googlies) + overlay_googly_eyes = FALSE CopyObject(copy, creator, destroy_original) /mob/living/simple_animal/hostile/mimic/copy/Life() ..() - if(!target && !ckey) //Objects eventually revert to normal if no one is around to terrorize + if(idledamage && !target && !ckey) //Objects eventually revert to normal if no one is around to terrorize adjustBruteLoss(1) for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell death() @@ -143,7 +147,8 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca icon_state = O.icon_state icon_living = icon_state copy_overlays(O) - add_overlay(googly_eyes) + if (overlay_googly_eyes) + add_overlay(googly_eyes) if(isstructure(O) || ismachinery(O)) health = (anchored * 50) + 50 destroy_objects = 1 diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index ab2126e7b9..edca0c5535 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -6,8 +6,8 @@ icon = 'icons/mob/mob.dmi' icon_state = "shade" icon_living = "shade" - maxHealth = 50 - health = 50 + maxHealth = 40 + health = 40 spacewalk = TRUE healable = 0 speak_emote = list("hisses") @@ -17,12 +17,11 @@ response_harm = "punches" speak_chance = 1 melee_damage_lower = 5 - melee_damage_upper = 15 + melee_damage_upper = 12 attacktext = "metaphysically strikes" minbodytemp = 0 maxbodytemp = INFINITY 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) - speed = -1 stop_automated_movement = 1 status_flags = 0 faction = list("cult") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 09eb099ae7..61e7153434 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -103,7 +103,8 @@ stack_trace("Simple animal being instantiated in nullspace") if(vore_active) init_belly() - verbs |= /mob/living/proc/animal_nom + if(!IsAdvancedToolUser()) + verbs |= /mob/living/simple_animal/proc/animal_nom /mob/living/simple_animal/Destroy() GLOB.simple_animals[AIStatus] -= src diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm index 2eca841c17..72459cc74d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -7,18 +7,18 @@ var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB) var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted var/vore_escape_chance = 25 // Chance of resisting out of mob + var/vore_absorb_chance = 0 // chance of absorbtion by mob var/vore_stomach_name // The name for the first belly if not "stomach" var/vore_stomach_flavor // The flavortext for the first belly if not the default var/vore_fullness = 0 // How "full" the belly is (controls icons) + var/list/living_mobs = list() // Release belly contents beforey being gc'd! /mob/living/simple_animal/Destroy() - for(var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - B.release_all_contents() // When your stomach is empty + release_vore_contents() prey_excludes.Cut() . = ..() @@ -34,10 +34,10 @@ vore_fullness = new_fullness - +/* /mob/living/simple_animal/proc/swallow_check() for(var/I in vore_organs) - var/datum/belly/B = vore_organs[I] + var/obj/belly/B = vore_organs[I] if(vore_active) update_fullness() if(!vore_fullness) @@ -48,16 +48,14 @@ /mob/living/simple_animal/proc/swallow_mob() for(var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - for(var/mob/living/M in B.internal_contents) - B.transfer_contents(M, B.transferlocation) - + var/obj/belly/B = vore_organs[I] + for(var/mob/living/M in B.contents) + B.transfer_contents(M, transferlocation) +*/ /mob/living/simple_animal/death() - for(var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - B.release_all_contents() // When your stomach is empty - ..() // then you have my permission to die. + release_vore_contents() + . = ..() // Simple animals have only one belly. This creates it (if it isn't already set up) /mob/living/simple_animal/proc/init_belly() @@ -66,18 +64,19 @@ if(no_vore) //If it can't vore, let's not give it a stomach. return - var/datum/belly/B = new /datum/belly(src) - B.immutable = TRUE + var/obj/belly/B = new /obj/belly(src) + vore_selected = B + B.immutable = 1 B.name = vore_stomach_name ? vore_stomach_name : "stomach" - B.inside_flavor = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." + B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." B.digest_mode = vore_default_mode B.escapable = vore_escape_chance > 0 B.escapechance = vore_escape_chance B.digestchance = vore_digest_chance + B.absorbchance = vore_absorb_chance B.human_prey_swallow_time = swallowTime B.nonhuman_prey_swallow_time = swallowTime B.vore_verb = "swallow" - // TODO - Customizable per mob B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace "The insides knead at you gently for a moment.", "The guts glorp wetly around you as some air shifts.", @@ -98,5 +97,21 @@ "The juices pooling beneath you sizzle against your sore skin.", "The churning walls slowly pulverize you into meaty nutrients.", "The stomach glorps and gurgles as it tries to work you into slop.") - src.vore_organs[B.name] = B - src.vore_selected = B.name +/* B.emote_lists[DM_ITEMWEAK] = list( + "The burning acids eat away at your form.", + "The muscular stomach flesh grinds harshly against you.", + "The caustic air stings your chest when you try to breathe.", + "The slimy guts squeeze inward to help the digestive juices soften you up.", + "The onslaught against your body doesn't seem to be letting up; you're food now.", + "The predator's body ripples and crushes against you as digestive enzymes pull you apart.", + "The juices pooling beneath you sizzle against your sore skin.", + "The churning walls slowly pulverize you into meaty nutrients.", + "The stomach glorps and gurgles as it tries to work you into slop.")*/ + +//Grab = Nomf +/* +/mob/living/simple_animal/UnarmedAttack(var/atom/A, var/proximity) + . = ..() + + if(a_intent == I_GRAB && isliving(A) && !has_hands) + animal_nom(A)*/ \ No newline at end of file diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 50d86a2cf6..106381bade 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -146,10 +146,23 @@ else status_traits[trait] |= list(source) -/mob/living/proc/remove_trait(trait, list/sources) +/mob/living/proc/add_trait_datum(trait, spawn_effects) //separate proc due to the way these ones are handled + if(has_trait(trait)) + return + if(!SStraits || !SStraits.traits[trait]) + return + var/datum/trait/T = SStraits.traits[trait] + new T (src, spawn_effects) + return TRUE + +/mob/living/proc/remove_trait(trait, list/sources, force) + if(!status_traits[trait]) return + if(locate(ROUNDSTART_TRAIT) in status_traits[trait] && !force) //mob traits applied through roundstart cannot normally be removed + return + if(!sources) // No defined source cures the trait entirely. status_traits -= trait return @@ -167,19 +180,29 @@ if(!LAZYLEN(status_traits[trait])) status_traits -= trait +/mob/living/proc/remove_trait_datum(trait) + var/datum/trait/T = roundstart_traits[trait] + if(T) + qdel(T) + return TRUE + /mob/living/proc/has_trait(trait, list/sources) if(!status_traits[trait]) return FALSE . = FALSE + if(sources && !islist(sources)) + sources = list(sources) if(LAZYLEN(sources)) for(var/S in sources) if(S in status_traits[trait]) return TRUE - else - if(LAZYLEN(status_traits[trait])) - return TRUE + else if(LAZYLEN(status_traits[trait])) + return TRUE + +/mob/living/proc/has_trait_datum(trait) + return roundstart_traits[trait] /mob/living/proc/remove_all_traits() status_traits = list() diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index c66168cee4..b2a4a867bc 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -9,7 +9,7 @@ /mob/living/carbon/get_taste_sensitivity() var/obj/item/organ/tongue/tongue = getorganslot(ORGAN_SLOT_TONGUE) - if(istype(tongue)) + if(istype(tongue) && !has_trait(TRAIT_AGEUSIA)) . = tongue.taste_sensitivity else . = 101 // can't taste anything without a tongue diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 26c6e88775..f5e5d32428 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -11,7 +11,6 @@ var/mob/dead/observe = M observe.reset_perspective(null) qdel(hud_used) - QDEL_LIST(viruses) for(var/cc in client_colours) qdel(cc) client_colours = null @@ -287,16 +286,6 @@ client.eye = loc return 1 -/mob/living/reset_perspective(atom/A) - if(..()) - update_sight() - if(client.eye && client.eye != src) - var/atom/AT = client.eye - AT.get_remote_view_fullscreens(src) - else - clear_fullscreen("remote_view", 0) - update_pipe_vision() - /mob/proc/show_inv(mob/user) return @@ -333,60 +322,6 @@ return 1 -//this and stop_pulling really ought to be /mob/living procs -/mob/start_pulling(atom/movable/AM, supress_message = 0) - if(!AM || !src) - return FALSE - if(!(AM.can_be_pulled(src))) - return FALSE - if(throwing || incapacitated()) - return FALSE - - AM.add_fingerprint(src) - - // If we're pulling something then drop what we're currently pulling and pull this instead. - if(pulling) - // Are we trying to pull something we are already pulling? Then just stop here, no need to continue. - if(AM == pulling) - return - stop_pulling() - - changeNext_move(CLICK_CD_GRABBING) - - if(AM.pulledby) - if(!supress_message) - visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") - add_logs(AM, AM.pulledby, "pulled from", src) - AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. - - pulling = AM - AM.pulledby = src - if(!supress_message) - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - update_pull_hud_icon() - - if(ismob(AM)) - var/mob/M = AM - - //Share diseases that are spread by touch - for(var/thing in viruses) - var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) - M.ContactContractDisease(D) - - for(var/thing in M.viruses) - var/datum/disease/D = thing - if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) - ContactContractDisease(D) - - add_logs(src, M, "grabbed", addition="passive grab") - if(!supress_message) - visible_message("[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by their hands":" passively"]!") - if(!iscarbon(src)) - M.LAssailant = null - else - M.LAssailant = usr - /mob/proc/can_resist() return FALSE //overridden in living.dm @@ -409,15 +344,6 @@ setDir(D) spintime -= speed -/mob/stop_pulling() - ..() - update_pull_hud_icon() - -/mob/verb/stop_pulling1() - set name = "Stop Pulling" - set category = "IC" - stop_pulling() - /mob/proc/update_pull_hud_icon() if(hud_used) if(hud_used.pull_icon) @@ -439,6 +365,10 @@ I.attack_self(src) update_inv_hands() + if(!I)//CIT CHANGE - allows "using" empty hands + use_that_empty_hand() //CIT CHANGE - ditto + update_inv_hands() // CIT CHANGE - ditto. + /mob/verb/memory() set name = "Notes" set category = "IC" @@ -617,6 +547,7 @@ stat("Location:", COORD(T)) stat("CPU:", "[world.cpu]") stat("Instances:", "[num2text(world.contents.len, 10)]") + stat("World Time:", "[world.time]") GLOB.stat_entry() config.stat_entry() stat(null) @@ -707,7 +638,6 @@ client.move_delay += movement_delay() return 1 - /mob/verb/westface() set hidden = 1 if(!canface()) @@ -716,7 +646,6 @@ client.move_delay += movement_delay() return 1 - /mob/verb/northface() set hidden = 1 if(!canface()) @@ -725,7 +654,6 @@ client.move_delay += movement_delay() return 1 - /mob/verb/southface() set hidden = 1 if(!canface()) @@ -929,39 +857,6 @@ if (L) L.alpha = lighting_alpha -/mob/living/vv_edit_var(var_name, var_value) - switch(var_name) - if("stat") - if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life - GLOB.dead_mob_list -= src - GLOB.alive_mob_list += src - if((stat < DEAD) && (var_value == DEAD))//Kill he - GLOB.alive_mob_list -= src - GLOB.dead_mob_list += src - . = ..() - switch(var_name) - if("knockdown") - SetKnockdown(var_value) - if("stun") - SetStun(var_value) - if("unconscious") - SetUnconscious(var_value) - if("sleeping") - SetSleeping(var_value) - if("eye_blind") - set_blindness(var_value) - if("eye_damage") - set_eye_damage(var_value) - if("eye_blurry") - set_blurriness(var_value) - if("maxHealth") - updatehealth() - if("resize") - update_transform() - if("lighting_alpha") - sync_lighting_plane_alpha() - - /mob/proc/is_literate() return 0 @@ -971,15 +866,6 @@ /mob/proc/get_idcard() return -/mob/proc/get_static_viruses() //used when creating blood and other infective objects - if(!LAZYLEN(viruses)) - return - var/list/datum/disease/diseases = list() - for(var/datum/disease/D in viruses) - var/static_virus = D.Copy() - diseases += static_virus - return diseases - /mob/vv_get_dropdown() . = ..() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index d4bebd6303..0088e09515 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -82,10 +82,6 @@ var/list/mob_spell_list = list() //construct spells and mime spells. Spells that do not transfer from one mob to another and can not be lost in mindswap. -//List of active diseases - - var/list/viruses = list() // list of all diseases in a mob - var/list/resistances = list() var/status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH //bitflags defining which status effects can be inflicted (replaces canknockdown, canstun, etc) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 989c8278a5..3b9930faa9 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -363,8 +363,10 @@ It's fairly easy to fix if dealing with single letters but not so much with comp if(M.mind in SSticker.mode.apprentices) return 2 if("monkey") - if(M.viruses && (locate(/datum/disease/transformation/jungle_fever) in M.viruses)) - return 2 + if(isliving(M)) + var/mob/living/L = M + if(L.diseases && (locate(/datum/disease/transformation/jungle_fever) in L.diseases)) + return 2 return TRUE if(M.mind && LAZYLEN(M.mind.antag_datums)) //they have an antag datum! return TRUE diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index a4d234ded7..39a0bba701 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -98,7 +98,7 @@ proc/get_top_level_mob(var/mob/S) return FALSE user.log_message(message, INDIVIDUAL_EMOTE_LOG) - message = "[user] " + message + message = "[user] " + "[message]" for(var/mob/M in GLOB.dead_mob_list) if(!M.client || isnewplayer(M)) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 64454b130e..9178a2341b 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -62,9 +62,9 @@ //keep viruses? if (tr_flags & TR_KEEPVIRUS) - O.viruses = viruses - viruses = list() - for(var/thing in O.viruses) + O.diseases = diseases + diseases = list() + for(var/thing in O.diseases) var/datum/disease/D = thing D.affected_mob = O @@ -76,6 +76,7 @@ O.setCloneLoss(getCloneLoss(), 0) O.adjustFireLoss(getFireLoss(), 0) O.setBrainLoss(getBrainLoss(), 0) + O.adjustStaminaLoss(getStaminaLoss(), 0)//CIT CHANGE - makes monkey transformations inherit stamina O.updatehealth() O.radiation = radiation @@ -218,9 +219,9 @@ //keep viruses? if (tr_flags & TR_KEEPVIRUS) - O.viruses = viruses - viruses = list() - for(var/thing in O.viruses) + O.diseases = diseases + diseases = list() + for(var/thing in O.diseases) var/datum/disease/D = thing D.affected_mob = O O.med_hud_set_status() @@ -233,6 +234,7 @@ O.setCloneLoss(getCloneLoss(), 0) O.adjustFireLoss(getFireLoss(), 0) O.setBrainLoss(getBrainLoss(), 0) + O.adjustStaminaLoss(getStaminaLoss(), 0)//CIT CHANGE - makes monkey transformations inherit stamina O.updatehealth() O.radiation = radiation diff --git a/code/modules/ninja/__ninjaDefines.dm b/code/modules/ninja/__ninjaDefines.dm index 352087f4e8..1a3e9dce63 100644 --- a/code/modules/ninja/__ninjaDefines.dm +++ b/code/modules/ninja/__ninjaDefines.dm @@ -18,7 +18,6 @@ Contents: #define INVALID_DRAIN "INVALID" //This one is if the drain proc needs to cancel, eg missing variables, etc, it's important. -#define DRAIN_RD_HACKED "RDHACK" #define DRAIN_RD_HACK_FAILED "RDHACKFAIL" #define DRAIN_MOB_SHOCK "MOBSHOCK" #define DRAIN_MOB_SHOCK_FAILED "MOBSHOCKFAIL" \ No newline at end of file diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index a182e86074..faad79664e 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -388,7 +388,7 @@ if(LIGHT_BROKEN) to_chat(user, "The [fitting] has been smashed.") if(cell) - to_chat(user, "Its backup power charge meter reads [(cell.charge / cell.maxcharge) * 100]%.") + to_chat(user, "Its backup power charge meter reads [round((cell.charge / cell.maxcharge) * 100, 0.1)]%.") diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 45149d1346..d160209e0c 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -18,6 +18,11 @@ field_generator power level display #define FG_CHARGING 1 #define FG_ONLINE 2 +//field generator construction defines +#define FG_UNSECURED 0 +#define FG_SECURED 1 +#define FG_WELDED 2 + /obj/machinery/field/generator name = "field generator" desc = "A large thermal battery that projects a high amount of energy when powered." diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 2293fb2fb2..f6b785b3e1 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -63,21 +63,21 @@ var/mob/living/L = cult_mind.current L.narsie_act() for(var/mob/living/player in GLOB.player_list) - if(player.stat != DEAD && is_station_level(player.loc.z) && !iscultist(player)) + if(player.stat != DEAD && player.loc && is_station_level(player.loc.z) && !iscultist(player) && !isanimal(player)) souls_needed[player] = TRUE - soul_goal = round(1 + LAZYLEN(souls_needed) * 0.6) + soul_goal = round(1 + LAZYLEN(souls_needed) * 0.75) INVOKE_ASYNC(src, .proc/begin_the_end) /obj/singularity/narsie/large/cult/proc/begin_the_end() sleep(50) priority_announce("An acausal dimensional event has been detected in your sector. Event has been flagged EXTINCTION-CLASS. Directing all available assets toward simulating solutions. SOLUTION ETA: 60 SECONDS.","Central Command Higher Dimensional Affairs", 'sound/misc/airraid.ogg') - sleep(550) - priority_announce("Simulations on acausal dimensional event complete. Deploying solution package now. Deployment ETA: TWO MINUTES. ","Central Command Higher Dimensional Affairs") + sleep(500) + priority_announce("Simulations on acausal dimensional event complete. Deploying solution package now. Deployment ETA: ONE MINUTE. ","Central Command Higher Dimensional Affairs") sleep(50) set_security_level("delta") SSshuttle.registerHostileEnvironment(src) SSshuttle.lockdown = TRUE - sleep(850) + sleep(600) if(resolved == FALSE) resolved = TRUE sound_to_playing_players('sound/machines/alarm.ogg') diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 0123919eb9..7a07ba5a7f 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -233,6 +233,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard) if(M.z == z) SEND_SOUND(M, 'sound/magic/charge.ogg') to_chat(M, "You feel reality distort for a moment...") + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("delam", /datum/mood_event/delam) if(combined_gas > MOLE_PENALTY_THRESHOLD) investigate_log("has collapsed into a singularity.", INVESTIGATE_SUPERMATTER) if(T) @@ -276,7 +279,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard) if(!removed || !removed.total_moles() || isspaceturf(T)) //we're in space or there is no gas to process if(takes_damage) damage += max((power / 1000) * DAMAGE_INCREASE_MULTIPLIER, 0.1) // always does at least some damage - else + else if(takes_damage) //causing damage damage = max(damage + (max(removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0) @@ -435,7 +438,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard) L.rad_act(rads) explode() - + return 1 /obj/machinery/power/supermatter_shard/bullet_act(obj/item/projectile/Proj) @@ -530,6 +533,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard) /obj/machinery/power/supermatter_shard/attackby(obj/item/W, mob/living/user, params) if(!istype(W) || (W.flags_1 & ABSTRACT_1) || !istype(user)) return + if (istype(W, /obj/item/melee/roastingstick)) + return ..() if(istype(W, /obj/item/scalpel/supermatter)) to_chat(user, "You carefully begin to scrape \the [src] with \the [W]...") if(W.use_tool(src, user, 60, volume=100)) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index ca0122930d..b55accc134 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -25,7 +25,7 @@ /obj/machinery/power/tesla_coil/Initialize() . = ..() - wires = new /datum/wires/tesla_coil(src) +// wires = new /datum/wires/tesla_coil(src) //CITADEL EDIT, Kevinz you cheaty fuccboi. linked_techweb = SSresearch.science_tech /obj/machinery/power/tesla_coil/RefreshParts() @@ -36,6 +36,10 @@ zap_cooldown -= (C.rating * 20) input_power_multiplier = power_multiplier +/obj/machinery/power/tesla_coil/on_construction() + if(anchored) + connect_to_network() + /obj/machinery/power/tesla_coil/default_unfasten_wrench(mob/user, obj/item/I, time = 20) . = ..() if(. == SUCCESSFUL_UNFASTEN) @@ -75,15 +79,13 @@ /obj/machinery/power/tesla_coil/tesla_act(var/power) if(anchored && !panel_open) obj_flags |= BEING_SHOCKED - //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) if(istype(linked_techweb)) - linked_techweb.research_points += min(power_produced, 10) + linked_techweb.research_points += min(power_produced, 1) addtimer(CALLBACK(src, .proc/reset_shocked), 10) else ..() @@ -110,20 +112,18 @@ /obj/machinery/power/tesla_coil/research/tesla_act(var/power) if(anchored && !panel_open) obj_flags |= BEING_SHOCKED - //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("rpcoilhit", src) playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) tesla_zap(src, 5, power_produced) if(istype(linked_techweb)) - linked_techweb.research_points += min(power_produced, 200) + linked_techweb.research_points += min(power_produced, 3) // 4 coils makes ~720/m bonus for R&D, addtimer(CALLBACK(src, .proc/reset_shocked), 10) else ..() -/obj/machinery/power/tesla_coil/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) +/obj/machinery/power/tesla_coil/research/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) . = ..() if(. == SUCCESSFUL_UNFASTEN) if(panel_open) @@ -131,7 +131,7 @@ else icon_state = "rpcoil[anchored]" -/obj/machinery/power/tesla_coil/attackby(obj/item/W, mob/user, params) +/obj/machinery/power/tesla_coil/research/attackby(obj/item/W, mob/user, params) . = ..() if(default_deconstruction_screwdriver(user, "rpcoil_open[anchored]", "rpcoil[anchored]", W)) return diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 5c463b4ee9..d7f78635b0 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -81,14 +81,8 @@ #define COMPFRICTION 5e5 -#define COMPSTARTERLOAD 2800 -// Crucial to make things work!!!! -// OLD FIX - explanation given down below. -// /obj/machinery/power/compressor/CanPass(atom/movable/mover, turf/target) -// return !density - /obj/machinery/power/compressor/locate_machinery() if(turbine) return @@ -169,7 +163,6 @@ // These are crucial to working of a turbine - the stats modify the power output. TurbGenQ modifies how much raw energy can you get from // rpms, TurbGenG modifies the shape of the curve - the lower the value the less straight the curve is. -#define TURBPRES 9000000 #define TURBGENQ 100000 #define TURBGENG 0.5 @@ -180,6 +173,7 @@ locate_machinery() if(!compressor) stat |= BROKEN + connect_to_network() /obj/machinery/power/turbine/RefreshParts() var/P = 0 @@ -370,3 +364,7 @@ if("reconnect") locate_machinery() . = TRUE + +#undef COMPFRICTION +#undef TURBGENQ +#undef TURBGENG diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm similarity index 100% rename from code/modules/projectiles/ammunition.dm rename to code/modules/projectiles/ammunition/_ammunition.dm diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/ammunition/_firing.dm similarity index 100% rename from code/modules/projectiles/firing.dm rename to code/modules/projectiles/ammunition/_firing.dm diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm deleted file mode 100644 index df0fd7278e..0000000000 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ /dev/null @@ -1,314 +0,0 @@ -// .357 (Syndie Revolver) - -/obj/item/ammo_casing/a357 - name = ".357 bullet casing" - desc = "A .357 bullet casing." - caliber = "357" - projectile_type = /obj/item/projectile/bullet/a357 - -// 7.62 (Nagant Rifle) - -/obj/item/ammo_casing/a762 - name = "7.62 bullet casing" - desc = "A 7.62 bullet casing." - icon_state = "762-casing" - caliber = "a762" - projectile_type = /obj/item/projectile/bullet/a762 - -/obj/item/ammo_casing/a762/enchanted - projectile_type = /obj/item/projectile/bullet/a762_enchanted - -// 7.62x38mmR (Nagant Revolver) - -/obj/item/ammo_casing/n762 - name = "7.62x38mmR bullet casing" - desc = "A 7.62x38mmR bullet casing." - caliber = "n762" - projectile_type = /obj/item/projectile/bullet/n762 - -// .50AE (Desert Eagle) - -/obj/item/ammo_casing/a50AE - name = ".50AE bullet casing" - desc = "A .50AE bullet casing." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet/a50AE - -// .38 (Detective's Gun) - -/obj/item/ammo_casing/c38 - name = ".38 bullet casing" - desc = "A .38 bullet casing." - caliber = "38" - projectile_type = /obj/item/projectile/bullet/c38 - -// 10mm (Stechkin) - -/obj/item/ammo_casing/c10mm - name = ".10mm bullet casing" - desc = "A 10mm bullet casing." - caliber = "10mm" - projectile_type = /obj/item/projectile/bullet/c10mm - -/obj/item/ammo_casing/c10mm/ap - name = ".10mm armor-piercing bullet casing" - desc = "A 10mm armor-piercing bullet casing." - projectile_type = /obj/item/projectile/bullet/c10mm_ap - -/obj/item/ammo_casing/c10mm/hp - name = ".10mm hollow-point bullet casing" - desc = "A 10mm hollow-point bullet casing." - projectile_type = /obj/item/projectile/bullet/c10mm_hp - -/obj/item/ammo_casing/c10mm/fire - name = ".10mm incendiary bullet casing" - desc = "A 10mm incendiary bullet casing." - projectile_type = /obj/item/projectile/bullet/incendiary/c10mm - -// 9mm (Stechkin APS) - -/obj/item/ammo_casing/c9mm - name = "9mm bullet casing" - desc = "A 9mm bullet casing." - caliber = "9mm" - projectile_type = /obj/item/projectile/bullet/c9mm - -/obj/item/ammo_casing/c9mm/ap - name = "9mm armor-piercing bullet casing" - desc = "A 9mm armor-piercing bullet casing." - projectile_type =/obj/item/projectile/bullet/c9mm_ap - -/obj/item/ammo_casing/c9mm/inc - name = "9mm incendiary bullet casing" - desc = "A 9mm incendiary bullet casing." - projectile_type = /obj/item/projectile/bullet/incendiary/c9mm - -// 4.6x30mm (Autorifles) - -/obj/item/ammo_casing/c46x30mm - name = "4.6x30mm bullet casing" - desc = "A 4.6x30mm bullet casing." - caliber = "4.6x30mm" - projectile_type = /obj/item/projectile/bullet/c46x30mm - -/obj/item/ammo_casing/c46x30mm/ap - name = "4.6x30mm armor-piercing bullet casing" - desc = "A 4.6x30mm armor-piercing bullet casing." - projectile_type = /obj/item/projectile/bullet/c46x30mm_ap - -/obj/item/ammo_casing/c46x30mm/inc - name = "4.6x30mm incendiary bullet casing" - desc = "A 4.6x30mm incendiary bullet casing." - projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm - -// .45 (M1911 + C20r) - -/obj/item/ammo_casing/c45 - name = ".45 bullet casing" - desc = "A .45 bullet casing." - caliber = ".45" - projectile_type = /obj/item/projectile/bullet/c45 - -/obj/item/ammo_casing/c45/nostamina - projectile_type = /obj/item/projectile/bullet/c45_nostamina - -// 5.56mm (M-90gl Carbine) - -/obj/item/ammo_casing/a556 - name = "5.56mm bullet casing" - desc = "A 5.56mm bullet casing." - caliber = "a556" - projectile_type = /obj/item/projectile/bullet/a556 - -// 40mm (Grenade Launcher) - -/obj/item/ammo_casing/a40mm - name = "40mm HE shell" - desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher." - caliber = "40mm" - icon_state = "40mmHE" - projectile_type = /obj/item/projectile/bullet/a40mm - -// .50 (Sniper) - -/obj/item/ammo_casing/p50 - name = ".50 bullet casing" - desc = "A .50 bullet casing." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet/p50 - icon_state = ".50" - -/obj/item/ammo_casing/p50/soporific - name = ".50 soporific bullet casing" - desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell." - projectile_type = /obj/item/projectile/bullet/p50/soporific - icon_state = "sleeper" - -/obj/item/ammo_casing/p50/penetrator - name = ".50 penetrator round bullet casing" - desc = "A .50 caliber penetrator round casing." - projectile_type = /obj/item/projectile/bullet/p50/penetrator - -// 1.95x129mm (SAW) - -/obj/item/ammo_casing/mm195x129 - name = "1.95x129mm bullet casing" - desc = "A 1.95x129mm bullet casing." - icon_state = "762-casing" - caliber = "mm195129" - projectile_type = /obj/item/projectile/bullet/mm195x129 - -/obj/item/ammo_casing/mm195x129/ap - name = "1.95x129mm armor-piercing bullet casing" - desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." - projectile_type = /obj/item/projectile/bullet/mm195x129_ap - -/obj/item/ammo_casing/mm195x129/hollow - name = "1.95x129mm hollow-point bullet casing" - desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets." - projectile_type = /obj/item/projectile/bullet/mm195x129_hp - -/obj/item/ammo_casing/mm195x129/incen - name = "1.95x129mm incendiary bullet casing" - desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames." - projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129 - -// Shotgun - -/obj/item/ammo_casing/shotgun - name = "shotgun slug" - desc = "A 12 gauge lead slug." - icon_state = "blshell" - caliber = "shotgun" - projectile_type = /obj/item/projectile/bullet/shotgun_slug - materials = list(MAT_METAL=4000) - -/obj/item/ammo_casing/shotgun/beanbag - name = "beanbag slug" - desc = "A weak beanbag slug for riot control." - icon_state = "bshell" - projectile_type = /obj/item/projectile/bullet/shotgun_beanbag - materials = list(MAT_METAL=250) - -/obj/item/ammo_casing/shotgun/incendiary - name = "incendiary slug" - desc = "An incendiary-coated shotgun slug." - icon_state = "ishell" - projectile_type = /obj/item/projectile/bullet/incendiary/shotgun - -/obj/item/ammo_casing/shotgun/dragonsbreath - name = "dragonsbreath shell" - desc = "A shotgun shell which fires a spread of incendiary pellets." - icon_state = "ishell2" - projectile_type = /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath - pellets = 4 - variance = 35 - -/obj/item/ammo_casing/shotgun/stunslug - name = "taser slug" - desc = "A stunning taser slug." - icon_state = "stunshell" - projectile_type = /obj/item/projectile/bullet/shotgun_stunslug - materials = list(MAT_METAL=250) - -/obj/item/ammo_casing/shotgun/meteorslug - name = "meteorslug shell" - desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired." - icon_state = "mshell" - projectile_type = /obj/item/projectile/bullet/shotgun_meteorslug - -/obj/item/ammo_casing/shotgun/pulseslug - name = "pulse slug" - desc = "A delicate device which can be loaded into a shotgun. The primer acts as a button which triggers the gain medium and fires a powerful \ - energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \ - would have difficulty with." - icon_state = "pshell" - projectile_type = /obj/item/projectile/beam/pulse/shotgun - -/obj/item/ammo_casing/shotgun/frag12 - name = "FRAG-12 slug" - desc = "A high explosive breaching round for a 12 gauge shotgun." - icon_state = "heshell" - projectile_type = /obj/item/projectile/bullet/shotgun_frag12 - -/obj/item/ammo_casing/shotgun/buckshot - name = "buckshot shell" - desc = "A 12 gauge buckshot shell." - icon_state = "gshell" - projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot - pellets = 6 - variance = 25 - -/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" - projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot - pellets = 6 - variance = 25 - materials = list(MAT_METAL=4000) - -/obj/item/ammo_casing/shotgun/improvised - name = "improvised shell" - desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." - icon_state = "improvshell" - projectile_type = /obj/item/projectile/bullet/pellet/shotgun_improvised - materials = list(MAT_METAL=250) - pellets = 10 - variance = 25 - -/obj/item/ammo_casing/shotgun/ion - name = "ion shell" - desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \ - The unique properties of the crystal split the pulse into a spread of individually weaker bolts." - icon_state = "ionshell" - projectile_type = /obj/item/projectile/ion/weak - pellets = 4 - variance = 35 - -/obj/item/ammo_casing/shotgun/laserslug - name = "laser slug" - desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package." - icon_state = "lshell" - projectile_type = /obj/item/projectile/beam/laser - -/obj/item/ammo_casing/shotgun/techshell - name = "unloaded technological shell" - desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects." - icon_state = "cshell" - projectile_type = null - -/obj/item/ammo_casing/shotgun/dart - name = "shotgun dart" - desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical." - icon_state = "cshell" - projectile_type = /obj/item/projectile/bullet/dart - var/reagent_amount = 30 - var/reagent_react = TRUE - -/obj/item/ammo_casing/shotgun/dart/noreact - name = "cryostasis shotgun dart" - desc = "A dart for use in shotguns, using similar technolgoy as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical." - icon_state = "cnrshell" - reagent_amount = 10 - reagent_react = FALSE - -/obj/item/ammo_casing/shotgun/dart/Initialize() - . = ..() - container_type |= OPENCONTAINER - create_reagents(reagent_amount) - reagents.set_reacting(reagent_react) - -/obj/item/ammo_casing/shotgun/dart/attackby() - return - -/obj/item/ammo_casing/shotgun/dart/bioterror - desc = "A shotgun dart filled with deadly toxins." - -/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize() - . = ..() - reagents.add_reagent("neurotoxin", 6) - reagents.add_reagent("spore", 6) - reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT - reagents.add_reagent("coniine", 6) - reagents.add_reagent("sodium_thiopental", 6) diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm new file mode 100644 index 0000000000..1ce2e0065e --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm @@ -0,0 +1,23 @@ +// 1.95x129mm (SAW) + +/obj/item/ammo_casing/mm195x129 + name = "1.95x129mm bullet casing" + desc = "A 1.95x129mm bullet casing." + icon_state = "762-casing" + caliber = "mm195129" + projectile_type = /obj/item/projectile/bullet/mm195x129 + +/obj/item/ammo_casing/mm195x129/ap + name = "1.95x129mm armor-piercing bullet casing" + desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." + projectile_type = /obj/item/projectile/bullet/mm195x129_ap + +/obj/item/ammo_casing/mm195x129/hollow + name = "1.95x129mm hollow-point bullet casing" + desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets." + projectile_type = /obj/item/projectile/bullet/mm195x129_hp + +/obj/item/ammo_casing/mm195x129/incen + name = "1.95x129mm incendiary bullet casing" + desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames." + projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129 diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm new file mode 100644 index 0000000000..02134e95e1 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm @@ -0,0 +1,50 @@ +// 10mm (Stechkin) + +/obj/item/ammo_casing/c10mm + name = ".10mm bullet casing" + desc = "A 10mm bullet casing." + caliber = "10mm" + projectile_type = /obj/item/projectile/bullet/c10mm + +/obj/item/ammo_casing/c10mm/ap + name = ".10mm armor-piercing bullet casing" + desc = "A 10mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/c10mm_ap + +/obj/item/ammo_casing/c10mm/hp + name = ".10mm hollow-point bullet casing" + desc = "A 10mm hollow-point bullet casing." + projectile_type = /obj/item/projectile/bullet/c10mm_hp + +/obj/item/ammo_casing/c10mm/fire + name = ".10mm incendiary bullet casing" + desc = "A 10mm incendiary bullet casing." + projectile_type = /obj/item/projectile/bullet/incendiary/c10mm + +// 9mm (Stechkin APS) + +/obj/item/ammo_casing/c9mm + name = "9mm bullet casing" + desc = "A 9mm bullet casing." + caliber = "9mm" + projectile_type = /obj/item/projectile/bullet/c9mm + +/obj/item/ammo_casing/c9mm/ap + name = "9mm armor-piercing bullet casing" + desc = "A 9mm armor-piercing bullet casing." + projectile_type =/obj/item/projectile/bullet/c9mm_ap + +/obj/item/ammo_casing/c9mm/inc + name = "9mm incendiary bullet casing" + desc = "A 9mm incendiary bullet casing." + projectile_type = /obj/item/projectile/bullet/incendiary/c9mm + + +// .50AE (Desert Eagle) + +/obj/item/ammo_casing/a50AE + name = ".50AE bullet casing" + desc = "A .50AE bullet casing." + caliber = ".50" + projectile_type = /obj/item/projectile/bullet/a50AE + diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm new file mode 100644 index 0000000000..52a72e0ff7 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -0,0 +1,23 @@ +// .357 (Syndie Revolver) + +/obj/item/ammo_casing/a357 + name = ".357 bullet casing" + desc = "A .357 bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/a357 + +// 7.62x38mmR (Nagant Revolver) + +/obj/item/ammo_casing/n762 + name = "7.62x38mmR bullet casing" + desc = "A 7.62x38mmR bullet casing." + caliber = "n762" + projectile_type = /obj/item/projectile/bullet/n762 + +// .38 (Detective's Gun) + +/obj/item/ammo_casing/c38 + name = ".38 bullet casing" + desc = "A .38 bullet casing." + caliber = "38" + projectile_type = /obj/item/projectile/bullet/c38 diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm new file mode 100644 index 0000000000..a35cfcba1c --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -0,0 +1,28 @@ +// 7.62 (Nagant Rifle) + +/obj/item/ammo_casing/a762 + name = "7.62 bullet casing" + desc = "A 7.62 bullet casing." + icon_state = "762-casing" + caliber = "a762" + projectile_type = /obj/item/projectile/bullet/a762 + +/obj/item/ammo_casing/a762/enchanted + projectile_type = /obj/item/projectile/bullet/a762_enchanted + +// 5.56mm (M-90gl Carbine) + +/obj/item/ammo_casing/a556 + name = "5.56mm bullet casing" + desc = "A 5.56mm bullet casing." + caliber = "a556" + projectile_type = /obj/item/projectile/bullet/a556 + +// 40mm (Grenade Launcher) + +/obj/item/ammo_casing/a40mm + name = "40mm HE shell" + desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher." + caliber = "40mm" + icon_state = "40mmHE" + projectile_type = /obj/item/projectile/bullet/a40mm diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm new file mode 100644 index 0000000000..b700d092d7 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -0,0 +1,139 @@ +// Shotgun + +/obj/item/ammo_casing/shotgun + name = "shotgun slug" + desc = "A 12 gauge lead slug." + icon_state = "blshell" + caliber = "shotgun" + projectile_type = /obj/item/projectile/bullet/shotgun_slug + materials = list(MAT_METAL=4000) + +/obj/item/ammo_casing/shotgun/beanbag + name = "beanbag slug" + desc = "A weak beanbag slug for riot control." + icon_state = "bshell" + projectile_type = /obj/item/projectile/bullet/shotgun_beanbag + materials = list(MAT_METAL=250) + +/obj/item/ammo_casing/shotgun/incendiary + name = "incendiary slug" + desc = "An incendiary-coated shotgun slug." + icon_state = "ishell" + projectile_type = /obj/item/projectile/bullet/incendiary/shotgun + +/obj/item/ammo_casing/shotgun/dragonsbreath + name = "dragonsbreath shell" + desc = "A shotgun shell which fires a spread of incendiary pellets." + icon_state = "ishell2" + projectile_type = /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath + pellets = 4 + variance = 35 + +/obj/item/ammo_casing/shotgun/stunslug + name = "taser slug" + desc = "A stunning taser slug." + icon_state = "stunshell" + projectile_type = /obj/item/projectile/bullet/shotgun_stunslug + materials = list(MAT_METAL=250) + +/obj/item/ammo_casing/shotgun/meteorslug + name = "meteorslug shell" + desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired." + icon_state = "mshell" + projectile_type = /obj/item/projectile/bullet/shotgun_meteorslug + +/obj/item/ammo_casing/shotgun/pulseslug + name = "pulse slug" + desc = "A delicate device which can be loaded into a shotgun. The primer acts as a button which triggers the gain medium and fires a powerful \ + energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \ + would have difficulty with." + icon_state = "pshell" + projectile_type = /obj/item/projectile/beam/pulse/shotgun + +/obj/item/ammo_casing/shotgun/frag12 + name = "FRAG-12 slug" + desc = "A high explosive breaching round for a 12 gauge shotgun." + icon_state = "heshell" + projectile_type = /obj/item/projectile/bullet/shotgun_frag12 + +/obj/item/ammo_casing/shotgun/buckshot + name = "buckshot shell" + desc = "A 12 gauge buckshot shell." + icon_state = "gshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot + pellets = 6 + variance = 25 + +/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" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot + pellets = 6 + variance = 25 + materials = list(MAT_METAL=4000) + +/obj/item/ammo_casing/shotgun/improvised + name = "improvised shell" + desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." + icon_state = "improvshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun_improvised + materials = list(MAT_METAL=250) + pellets = 10 + variance = 25 + +/obj/item/ammo_casing/shotgun/ion + name = "ion shell" + desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \ + The unique properties of the crystal split the pulse into a spread of individually weaker bolts." + icon_state = "ionshell" + projectile_type = /obj/item/projectile/ion/weak + pellets = 4 + variance = 35 + +/obj/item/ammo_casing/shotgun/laserslug + name = "laser slug" + desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package." + icon_state = "lshell" + projectile_type = /obj/item/projectile/beam/laser + +/obj/item/ammo_casing/shotgun/techshell + name = "unloaded technological shell" + desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects." + icon_state = "cshell" + projectile_type = null + +/obj/item/ammo_casing/shotgun/dart + name = "shotgun dart" + desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical." + icon_state = "cshell" + projectile_type = /obj/item/projectile/bullet/dart + var/reagent_amount = 30 + var/reagent_react = TRUE + +/obj/item/ammo_casing/shotgun/dart/noreact + name = "cryostasis shotgun dart" + desc = "A dart for use in shotguns, using similar technolgoy as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical." + icon_state = "cnrshell" + reagent_amount = 10 + reagent_react = FALSE + +/obj/item/ammo_casing/shotgun/dart/Initialize() + . = ..() + container_type |= OPENCONTAINER + create_reagents(reagent_amount) + reagents.set_reacting(reagent_react) + +/obj/item/ammo_casing/shotgun/dart/attackby() + return + +/obj/item/ammo_casing/shotgun/dart/bioterror + desc = "A shotgun dart filled with deadly toxins." + +/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize() + . = ..() + reagents.add_reagent("neurotoxin", 6) + reagents.add_reagent("spore", 6) + reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT + reagents.add_reagent("coniine", 6) + reagents.add_reagent("sodium_thiopental", 6) diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm new file mode 100644 index 0000000000..3be419c933 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/smg.dm @@ -0,0 +1,28 @@ +// 4.6x30mm (Autorifles) + +/obj/item/ammo_casing/c46x30mm + name = "4.6x30mm bullet casing" + desc = "A 4.6x30mm bullet casing." + caliber = "4.6x30mm" + projectile_type = /obj/item/projectile/bullet/c46x30mm + +/obj/item/ammo_casing/c46x30mm/ap + name = "4.6x30mm armor-piercing bullet casing" + desc = "A 4.6x30mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/c46x30mm_ap + +/obj/item/ammo_casing/c46x30mm/inc + name = "4.6x30mm incendiary bullet casing" + desc = "A 4.6x30mm incendiary bullet casing." + projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm + +// .45 (M1911 + C20r) + +/obj/item/ammo_casing/c45 + name = ".45 bullet casing" + desc = "A .45 bullet casing." + caliber = ".45" + projectile_type = /obj/item/projectile/bullet/c45 + +/obj/item/ammo_casing/c45/nostamina + projectile_type = /obj/item/projectile/bullet/c45_nostamina diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm new file mode 100644 index 0000000000..5906fcfaba --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm @@ -0,0 +1,19 @@ +// .50 (Sniper) + +/obj/item/ammo_casing/p50 + name = ".50 bullet casing" + desc = "A .50 bullet casing." + caliber = ".50" + projectile_type = /obj/item/projectile/bullet/p50 + icon_state = ".50" + +/obj/item/ammo_casing/p50/soporific + name = ".50 soporific bullet casing" + desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell." + projectile_type = /obj/item/projectile/bullet/p50/soporific + icon_state = "sleeper" + +/obj/item/ammo_casing/p50/penetrator + name = ".50 penetrator round bullet casing" + desc = "A .50 caliber penetrator round casing." + projectile_type = /obj/item/projectile/bullet/p50/penetrator diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm new file mode 100644 index 0000000000..154d269cd9 --- /dev/null +++ b/code/modules/projectiles/ammunition/caseless/_caseless.dm @@ -0,0 +1,15 @@ +/obj/item/ammo_casing/caseless + desc = "A caseless bullet casing." + firing_effect_type = null + heavy_metal = FALSE + +/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread) + if (..()) //successfully firing + moveToNullspace() + return 1 + else + return 0 + +/obj/item/ammo_casing/caseless/update_icon() + ..() + icon_state = "[initial(icon_state)]" diff --git a/code/modules/projectiles/ammunition/caseless.dm b/code/modules/projectiles/ammunition/caseless/foam.dm similarity index 56% rename from code/modules/projectiles/ammunition/caseless.dm rename to code/modules/projectiles/ammunition/caseless/foam.dm index b3439c86b2..fdf685e001 100644 --- a/code/modules/projectiles/ammunition/caseless.dm +++ b/code/modules/projectiles/ammunition/caseless/foam.dm @@ -1,117 +1,61 @@ - -// Caseless Ammunition - -/obj/item/ammo_casing/caseless - desc = "A caseless bullet casing." - firing_effect_type = null - heavy_metal = FALSE - -/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread) - if (..()) //successfully firing - moveToNullspace() - return 1 - else - return 0 - -/obj/item/ammo_casing/caseless/update_icon() - ..() - icon_state = "[initial(icon_state)]" - -/obj/item/ammo_casing/caseless/a75 - desc = "A .75 bullet casing." - caliber = "75" - icon_state = "s-casing-live" - projectile_type = /obj/item/projectile/bullet/gyro - -/obj/item/ammo_casing/caseless/a84mm - desc = "An 84mm anti-armour rocket." - caliber = "84mm" - icon_state = "s-casing-live" - projectile_type = /obj/item/projectile/bullet/a84mm - -/obj/item/ammo_casing/caseless/magspear - name = "magnetic spear" - desc = "A reusable spear that is typically loaded into kinetic spearguns." - projectile_type = /obj/item/projectile/bullet/reusable/magspear - caliber = "speargun" - icon_state = "magspear" - throwforce = 15 //still deadly when thrown - throw_speed = 3 - - -/obj/item/ammo_casing/caseless/laser - name = "laser casing" - desc = "You shouldn't be seeing this." - caliber = "laser" - icon_state = "s-casing-live" - projectile_type = /obj/item/projectile/beam - fire_sound = 'sound/weapons/laser.ogg' - firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy - -/obj/item/ammo_casing/caseless/laser/gatling - projectile_type = /obj/item/projectile/beam/weak - variance = 0.8 - click_cooldown_override = 1 - - -/obj/item/ammo_casing/caseless/foam_dart - name = "foam dart" - desc = "It's nerf or nothing! Ages 8 and up." - projectile_type = /obj/item/projectile/bullet/reusable/foam_dart - caliber = "foam_force" - icon = 'icons/obj/guns/toy.dmi' - icon_state = "foamdart" - var/modified = 0 - -/obj/item/ammo_casing/caseless/foam_dart/update_icon() - ..() - if (modified) - icon_state = "foamdart_empty" - desc = "It's nerf or nothing! ... Although, this one doesn't look too safe." - if(BB) - BB.icon_state = "foamdart_empty" - else - icon_state = initial(icon_state) - desc = "It's nerf or nothing! Ages 8 and up." - if(BB) - BB.icon_state = initial(BB.icon_state) - - -/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params) - var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB - if (istype(A, /obj/item/screwdriver) && !modified) - modified = 1 - FD.modified = 1 - FD.damage_type = BRUTE - to_chat(user, "You pop the safety cap off [src].") - update_icon() - else if (istype(A, /obj/item/pen)) - if(modified) - if(!FD.pen) - if(!user.transferItemToLoc(A, FD)) - return - FD.pen = A - FD.damage = 5 - FD.nodamage = 0 - to_chat(user, "You insert [A] into [src].") - else - to_chat(user, "There's already something in [src].") - else - to_chat(user, "The safety cap prevents you from inserting [A] into [src].") - else - return ..() - -/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user) - var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB - if(FD.pen) - FD.damage = initial(FD.damage) - FD.nodamage = initial(FD.nodamage) - user.put_in_hands(FD.pen) - to_chat(user, "You remove [FD.pen] from [src].") - FD.pen = null - -/obj/item/ammo_casing/caseless/foam_dart/riot - name = "riot foam dart" - desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up." - projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot - icon_state = "foamdart_riot" +/obj/item/ammo_casing/caseless/foam_dart + name = "foam dart" + desc = "It's nerf or nothing! Ages 8 and up." + projectile_type = /obj/item/projectile/bullet/reusable/foam_dart + caliber = "foam_force" + icon = 'icons/obj/guns/toy.dmi' + icon_state = "foamdart" + var/modified = 0 + +/obj/item/ammo_casing/caseless/foam_dart/update_icon() + ..() + if (modified) + icon_state = "foamdart_empty" + desc = "It's nerf or nothing! ... Although, this one doesn't look too safe." + if(BB) + BB.icon_state = "foamdart_empty" + else + icon_state = initial(icon_state) + desc = "It's nerf or nothing! Ages 8 and up." + if(BB) + BB.icon_state = initial(BB.icon_state) + + +/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params) + var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB + if (istype(A, /obj/item/screwdriver) && !modified) + modified = 1 + FD.modified = 1 + FD.damage_type = BRUTE + to_chat(user, "You pop the safety cap off [src].") + update_icon() + else if (istype(A, /obj/item/pen)) + if(modified) + if(!FD.pen) + if(!user.transferItemToLoc(A, FD)) + return + FD.pen = A + FD.damage = 5 + FD.nodamage = 0 + to_chat(user, "You insert [A] into [src].") + else + to_chat(user, "There's already something in [src].") + else + to_chat(user, "The safety cap prevents you from inserting [A] into [src].") + else + return ..() + +/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user) + var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB + if(FD.pen) + FD.damage = initial(FD.damage) + FD.nodamage = initial(FD.nodamage) + user.put_in_hands(FD.pen) + to_chat(user, "You remove [FD.pen] from [src].") + FD.pen = null + +/obj/item/ammo_casing/caseless/foam_dart/riot + name = "riot foam dart" + desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up." + projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot + icon_state = "foamdart_riot" diff --git a/code/modules/projectiles/ammunition/caseless/misc.dm b/code/modules/projectiles/ammunition/caseless/misc.dm new file mode 100644 index 0000000000..fcb491f071 --- /dev/null +++ b/code/modules/projectiles/ammunition/caseless/misc.dm @@ -0,0 +1,22 @@ +/obj/item/ammo_casing/caseless/magspear + name = "magnetic spear" + desc = "A reusable spear that is typically loaded into kinetic spearguns." + projectile_type = /obj/item/projectile/bullet/reusable/magspear + caliber = "speargun" + icon_state = "magspear" + throwforce = 15 //still deadly when thrown + throw_speed = 3 + +/obj/item/ammo_casing/caseless/laser + name = "laser casing" + desc = "You shouldn't be seeing this." + caliber = "laser" + icon_state = "s-casing-live" + projectile_type = /obj/item/projectile/beam + fire_sound = 'sound/weapons/laser.ogg' + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy + +/obj/item/ammo_casing/caseless/laser/gatling + projectile_type = /obj/item/projectile/beam/weak + variance = 0.8 + click_cooldown_override = 1 diff --git a/code/modules/projectiles/ammunition/caseless/rocket.dm b/code/modules/projectiles/ammunition/caseless/rocket.dm new file mode 100644 index 0000000000..0b74f6ff8c --- /dev/null +++ b/code/modules/projectiles/ammunition/caseless/rocket.dm @@ -0,0 +1,11 @@ +/obj/item/ammo_casing/caseless/a84mm + desc = "An 84mm anti-armour rocket." + caliber = "84mm" + icon_state = "s-casing-live" + projectile_type = /obj/item/projectile/bullet/a84mm + +/obj/item/ammo_casing/caseless/a75 + desc = "A .75 bullet casing." + caliber = "75" + icon_state = "s-casing-live" + projectile_type = /obj/item/projectile/bullet/gyro diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm deleted file mode 100644 index 96d0fd2e29..0000000000 --- a/code/modules/projectiles/ammunition/energy.dm +++ /dev/null @@ -1,258 +0,0 @@ -/obj/item/ammo_casing/energy - name = "energy weapon lens" - desc = "The part of the gun that makes the laser go pew." - caliber = "energy" - projectile_type = /obj/item/projectile/energy - 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' - firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy - heavy_metal = FALSE - -/obj/item/ammo_casing/energy/chameleon - projectile_type = /obj/item/projectile/energy/chameleon - e_cost = 0 - var/hitscan_mode = FALSE - var/list/projectile_vars = list() - -/obj/item/ammo_casing/energy/chameleon/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - . = ..() - if(!BB) - newshot() - for(var/V in projectile_vars) - if(BB.vars.Find(V)) - BB.vars[V] = projectile_vars[V] - if(hitscan_mode) - BB.hitscan = TRUE - -/obj/item/ammo_casing/energy/laser - projectile_type = /obj/item/projectile/beam/laser - select_name = "kill" - -/obj/item/ammo_casing/energy/lasergun - projectile_type = /obj/item/projectile/beam/laser - e_cost = 83 - select_name = "kill" - -/obj/item/ammo_casing/energy/lasergun/old - projectile_type = /obj/item/projectile/beam/laser - e_cost = 200 - select_name = "kill" - -/obj/item/ammo_casing/energy/laser/hos - e_cost = 100 - -/obj/item/ammo_casing/energy/laser/practice - projectile_type = /obj/item/projectile/beam/practice - select_name = "practice" - -/obj/item/ammo_casing/energy/laser/scatter - projectile_type = /obj/item/projectile/beam/scatter - pellets = 5 - variance = 25 - select_name = "scatter" - -/obj/item/ammo_casing/energy/laser/scatter/disabler - projectile_type = /obj/item/projectile/beam/disabler - pellets = 3 - variance = 15 - -/obj/item/ammo_casing/energy/laser/heavy - projectile_type = /obj/item/projectile/beam/laser/heavylaser - select_name = "anti-vehicle" - fire_sound = 'sound/weapons/lasercannonfire.ogg' - -/obj/item/ammo_casing/energy/laser/pulse - projectile_type = /obj/item/projectile/beam/pulse - e_cost = 200 - select_name = "DESTROY" - fire_sound = 'sound/weapons/pulse.ogg' - -/obj/item/ammo_casing/energy/laser/bluetag - projectile_type = /obj/item/projectile/beam/lasertag/bluetag - select_name = "bluetag" - -/obj/item/ammo_casing/energy/laser/bluetag/hitscan - projectile_type = /obj/item/projectile/beam/lasertag/bluetag/hitscan - -/obj/item/ammo_casing/energy/laser/redtag - projectile_type = /obj/item/projectile/beam/lasertag/redtag - select_name = "redtag" - -/obj/item/ammo_casing/energy/laser/redtag/hitscan - projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan - -/obj/item/ammo_casing/energy/xray - projectile_type = /obj/item/projectile/beam/xray - e_cost = 50 - fire_sound = 'sound/weapons/laser3.ogg' - -/obj/item/ammo_casing/energy/electrode - projectile_type = /obj/item/projectile/energy/electrode - select_name = "stun" - fire_sound = 'sound/weapons/taser.ogg' - e_cost = 200 - -/obj/item/ammo_casing/energy/electrode/spec - e_cost = 100 - -/obj/item/ammo_casing/energy/electrode/gun - fire_sound = 'sound/weapons/gunshot.ogg' - e_cost = 100 - -/obj/item/ammo_casing/energy/electrode/hos - e_cost = 200 - -/obj/item/ammo_casing/energy/electrode/old - e_cost = 1000 - -/obj/item/ammo_casing/energy/ion - projectile_type = /obj/item/projectile/ion - select_name = "ion" - fire_sound = 'sound/weapons/ionrifle.ogg' - -/obj/item/ammo_casing/energy/declone - projectile_type = /obj/item/projectile/energy/declone - select_name = "declone" - fire_sound = 'sound/weapons/pulse3.ogg' - -/obj/item/ammo_casing/energy/mindflayer - projectile_type = /obj/item/projectile/beam/mindflayer - select_name = "MINDFUCK" - fire_sound = 'sound/weapons/laser.ogg' - -/obj/item/ammo_casing/energy/flora - fire_sound = 'sound/effects/stealthoff.ogg' - -/obj/item/ammo_casing/energy/flora/yield - projectile_type = /obj/item/projectile/energy/florayield - select_name = "yield" - -/obj/item/ammo_casing/energy/flora/mut - projectile_type = /obj/item/projectile/energy/floramut - select_name = "mutation" - -/obj/item/ammo_casing/energy/temp - projectile_type = /obj/item/projectile/temp - select_name = "freeze" - e_cost = 250 - fire_sound = 'sound/weapons/pulse3.ogg' - -/obj/item/ammo_casing/energy/temp/hot - projectile_type = /obj/item/projectile/temp/hot - select_name = "bake" - -/obj/item/ammo_casing/energy/meteor - projectile_type = /obj/item/projectile/meteor - select_name = "goddamn meteor" - -/obj/item/ammo_casing/energy/disabler - projectile_type = /obj/item/projectile/beam/disabler - select_name = "disable" - 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 = 25 - -/obj/item/ammo_casing/energy/plasma/adv - projectile_type = /obj/item/projectile/plasma/adv - delay = 10 - 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' - var/obj/item/gun/energy/wormhole_projector/gun = null - select_name = "blue" - -/obj/item/ammo_casing/energy/wormhole/orange - projectile_type = /obj/item/projectile/beam/wormhole/orange - select_name = "orange" - -/obj/item/ammo_casing/energy/bolt - projectile_type = /obj/item/projectile/energy/bolt - select_name = "bolt" - e_cost = 500 - fire_sound = 'sound/weapons/genhit.ogg' - -/obj/item/ammo_casing/energy/bolt/halloween - projectile_type = /obj/item/projectile/energy/bolt/halloween - -/obj/item/ammo_casing/energy/bolt/large - projectile_type = /obj/item/projectile/energy/bolt/large - select_name = "heavy bolt" - -/obj/item/ammo_casing/energy/net - projectile_type = /obj/item/projectile/energy/net - select_name = "netting" - pellets = 6 - variance = 40 - -/obj/item/ammo_casing/energy/trap - projectile_type = /obj/item/projectile/energy/trap - select_name = "snare" - -/obj/item/ammo_casing/energy/instakill - projectile_type = /obj/item/projectile/beam/instakill - e_cost = 0 - select_name = "DESTROY" - -/obj/item/ammo_casing/energy/instakill/blue - projectile_type = /obj/item/projectile/beam/instakill/blue - -/obj/item/ammo_casing/energy/instakill/red - projectile_type = /obj/item/projectile/beam/instakill/red - -/obj/item/ammo_casing/energy/tesla_revolver - fire_sound = 'sound/magic/lightningbolt.ogg' - e_cost = 200 - select_name = "stun" - projectile_type = /obj/item/projectile/energy/tesla/revolver - -/obj/item/ammo_casing/energy/gravityrepulse - projectile_type = /obj/item/projectile/gravityrepulse - e_cost = 0 - fire_sound = 'sound/weapons/wave.ogg' - select_name = "repulse" - delay = 50 - var/obj/item/gun/energy/gravity_gun/gun = null - -/obj/item/ammo_casing/energy/gravityrepulse/New(var/obj/item/gun/energy/gravity_gun/G) - gun = G - -/obj/item/ammo_casing/energy/gravityattract - projectile_type = /obj/item/projectile/gravityattract - e_cost = 0 - fire_sound = 'sound/weapons/wave.ogg' - select_name = "attract" - delay = 50 - var/obj/item/gun/energy/gravity_gun/gun = null - - -/obj/item/ammo_casing/energy/gravityattract/New(var/obj/item/gun/energy/gravity_gun/G) - gun = G - -/obj/item/ammo_casing/energy/gravitychaos - projectile_type = /obj/item/projectile/gravitychaos - e_cost = 0 - fire_sound = 'sound/weapons/wave.ogg' - select_name = "chaos" - delay = 50 - var/obj/item/gun/energy/gravity_gun/gun = null - -/obj/item/ammo_casing/energy/gravitychaos/New(var/obj/item/gun/energy/gravity_gun/G) - gun = G - -/obj/item/ammo_casing/energy/plasma - projectile_type = /obj/item/projectile/plasma - select_name = "plasma burst" - fire_sound = 'sound/weapons/pulse.ogg' - -/obj/item/ammo_casing/energy/plasma/adv - projectile_type = /obj/item/projectile/plasma/adv diff --git a/code/modules/projectiles/ammunition/energy/_energy.dm b/code/modules/projectiles/ammunition/energy/_energy.dm new file mode 100644 index 0000000000..3a4e457c3d --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/_energy.dm @@ -0,0 +1,10 @@ +/obj/item/ammo_casing/energy + name = "energy weapon lens" + desc = "The part of the gun that makes the laser go pew." + caliber = "energy" + projectile_type = /obj/item/projectile/energy + 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' + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy + heavy_metal = FALSE diff --git a/code/modules/projectiles/ammunition/energy/chameleon.dm b/code/modules/projectiles/ammunition/energy/chameleon.dm new file mode 100644 index 0000000000..b47b6c4e5e --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/chameleon.dm @@ -0,0 +1,15 @@ +/obj/item/ammo_casing/energy/chameleon + projectile_type = /obj/item/projectile/energy/chameleon + e_cost = 0 + var/hitscan_mode = FALSE + var/list/projectile_vars = list() + +/obj/item/ammo_casing/energy/chameleon/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + . = ..() + if(!BB) + newshot() + for(var/V in projectile_vars) + if(BB.vars.Find(V)) + BB.vv_edit_var(V, projectile_vars[V]) + if(hitscan_mode) + BB.hitscan = TRUE diff --git a/code/modules/projectiles/ammunition/energy/ebow.dm b/code/modules/projectiles/ammunition/energy/ebow.dm new file mode 100644 index 0000000000..8d9c72d1ba --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/ebow.dm @@ -0,0 +1,12 @@ +/obj/item/ammo_casing/energy/bolt + projectile_type = /obj/item/projectile/energy/bolt + select_name = "bolt" + e_cost = 500 + fire_sound = 'sound/weapons/genhit.ogg' + +/obj/item/ammo_casing/energy/bolt/halloween + projectile_type = /obj/item/projectile/energy/bolt/halloween + +/obj/item/ammo_casing/energy/bolt/large + projectile_type = /obj/item/projectile/energy/bolt/large + select_name = "heavy bolt" diff --git a/code/modules/projectiles/ammunition/energy/gravity.dm b/code/modules/projectiles/ammunition/energy/gravity.dm new file mode 100644 index 0000000000..f549a5b5e4 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/gravity.dm @@ -0,0 +1,36 @@ +/obj/item/ammo_casing/energy/gravityrepulse + projectile_type = /obj/item/projectile/gravityrepulse + e_cost = 0 + fire_sound = 'sound/weapons/wave.ogg' + select_name = "repulse" + delay = 50 + var/obj/item/gun/energy/gravity_gun/gun + +/obj/item/ammo_casing/energy/gravityrepulse/Initialize(mapload, obj/item/gun/energy/gravity_gun/G) + . = ..() + gun = G + +/obj/item/ammo_casing/energy/gravityattract + projectile_type = /obj/item/projectile/gravityattract + e_cost = 0 + fire_sound = 'sound/weapons/wave.ogg' + select_name = "attract" + delay = 50 + var/obj/item/gun/energy/gravity_gun/gun + + +/obj/item/ammo_casing/energy/gravityattract/Initialize(mapload, obj/item/gun/energy/gravity_gun/G) + . = ..() + gun = G + +/obj/item/ammo_casing/energy/gravitychaos + projectile_type = /obj/item/projectile/gravitychaos + e_cost = 0 + fire_sound = 'sound/weapons/wave.ogg' + select_name = "chaos" + delay = 50 + var/obj/item/gun/energy/gravity_gun/gun + +/obj/item/ammo_casing/energy/gravitychaos/Initialize(mapload, obj/item/gun/energy/gravity_gun/G) + . = ..() + gun = G diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm new file mode 100644 index 0000000000..c87ea2ffbd --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -0,0 +1,66 @@ +/obj/item/ammo_casing/energy/laser + projectile_type = /obj/item/projectile/beam/laser + select_name = "kill" + +/obj/item/ammo_casing/energy/lasergun + projectile_type = /obj/item/projectile/beam/laser + e_cost = 83 + select_name = "kill" + +/obj/item/ammo_casing/energy/lasergun/old + projectile_type = /obj/item/projectile/beam/laser + e_cost = 200 + select_name = "kill" + +/obj/item/ammo_casing/energy/laser/hos + e_cost = 100 + +/obj/item/ammo_casing/energy/laser/practice + projectile_type = /obj/item/projectile/beam/practice + select_name = "practice" + +/obj/item/ammo_casing/energy/laser/scatter + projectile_type = /obj/item/projectile/beam/scatter + pellets = 5 + variance = 25 + select_name = "scatter" + +/obj/item/ammo_casing/energy/laser/scatter/disabler + projectile_type = /obj/item/projectile/beam/disabler + pellets = 3 + variance = 15 + +/obj/item/ammo_casing/energy/laser/heavy + projectile_type = /obj/item/projectile/beam/laser/heavylaser + select_name = "anti-vehicle" + fire_sound = 'sound/weapons/lasercannonfire.ogg' + +/obj/item/ammo_casing/energy/laser/pulse + projectile_type = /obj/item/projectile/beam/pulse + e_cost = 200 + select_name = "DESTROY" + fire_sound = 'sound/weapons/pulse.ogg' + +/obj/item/ammo_casing/energy/laser/bluetag + projectile_type = /obj/item/projectile/beam/lasertag/bluetag + select_name = "bluetag" + +/obj/item/ammo_casing/energy/laser/bluetag/hitscan + projectile_type = /obj/item/projectile/beam/lasertag/bluetag/hitscan + +/obj/item/ammo_casing/energy/laser/redtag + projectile_type = /obj/item/projectile/beam/lasertag/redtag + select_name = "redtag" + +/obj/item/ammo_casing/energy/laser/redtag/hitscan + projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan + +/obj/item/ammo_casing/energy/xray + projectile_type = /obj/item/projectile/beam/xray + e_cost = 50 + fire_sound = 'sound/weapons/laser3.ogg' + +/obj/item/ammo_casing/energy/mindflayer + projectile_type = /obj/item/projectile/beam/mindflayer + select_name = "MINDFUCK" + fire_sound = 'sound/weapons/laser.ogg' diff --git a/code/modules/projectiles/ammunition/energy/lmg.dm b/code/modules/projectiles/ammunition/energy/lmg.dm new file mode 100644 index 0000000000..5ebe83f792 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/lmg.dm @@ -0,0 +1,6 @@ +/obj/item/ammo_casing/energy/c3dbullet + projectile_type = /obj/item/projectile/bullet/c3d + select_name = "spraydown" + fire_sound = 'sound/weapons/gunshot_smg.ogg' + e_cost = 20 + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect diff --git a/code/modules/projectiles/ammunition/energy/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma.dm new file mode 100644 index 0000000000..d02abf9c88 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/plasma.dm @@ -0,0 +1,11 @@ +/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 = 25 + +/obj/item/ammo_casing/energy/plasma/adv + projectile_type = /obj/item/projectile/plasma/adv + delay = 10 + e_cost = 10 diff --git a/code/modules/projectiles/ammunition/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma_cit.dm similarity index 100% rename from code/modules/projectiles/ammunition/plasma.dm rename to code/modules/projectiles/ammunition/energy/plasma_cit.dm diff --git a/code/modules/projectiles/ammunition/energy/portal.dm b/code/modules/projectiles/ammunition/energy/portal.dm new file mode 100644 index 0000000000..3a6300a2f5 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/portal.dm @@ -0,0 +1,14 @@ +/obj/item/ammo_casing/energy/wormhole + projectile_type = /obj/item/projectile/beam/wormhole + e_cost = 0 + fire_sound = 'sound/weapons/pulse3.ogg' + var/obj/item/gun/energy/wormhole_projector/gun = null + select_name = "blue" + +/obj/item/ammo_casing/energy/wormhole/orange + projectile_type = /obj/item/projectile/beam/wormhole/orange + select_name = "orange" + +/obj/item/ammo_casing/energy/wormhole/Initialize(mapload, obj/item/gun/energy/wormhole_projector/wh) + . = ..() + gun = wh diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm new file mode 100644 index 0000000000..0438baf490 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -0,0 +1,61 @@ +/obj/item/ammo_casing/energy/ion + projectile_type = /obj/item/projectile/ion + select_name = "ion" + fire_sound = 'sound/weapons/ionrifle.ogg' + +/obj/item/ammo_casing/energy/declone + projectile_type = /obj/item/projectile/energy/declone + select_name = "declone" + fire_sound = 'sound/weapons/pulse3.ogg' + +/obj/item/ammo_casing/energy/flora + fire_sound = 'sound/effects/stealthoff.ogg' + +/obj/item/ammo_casing/energy/flora/yield + projectile_type = /obj/item/projectile/energy/florayield + select_name = "yield" + +/obj/item/ammo_casing/energy/flora/mut + projectile_type = /obj/item/projectile/energy/floramut + select_name = "mutation" + +/obj/item/ammo_casing/energy/temp + projectile_type = /obj/item/projectile/temp + select_name = "freeze" + e_cost = 250 + fire_sound = 'sound/weapons/pulse3.ogg' + +/obj/item/ammo_casing/energy/temp/hot + projectile_type = /obj/item/projectile/temp/hot + select_name = "bake" + +/obj/item/ammo_casing/energy/meteor + projectile_type = /obj/item/projectile/meteor + select_name = "goddamn meteor" + +/obj/item/ammo_casing/energy/net + projectile_type = /obj/item/projectile/energy/net + select_name = "netting" + pellets = 6 + variance = 40 + +/obj/item/ammo_casing/energy/trap + projectile_type = /obj/item/projectile/energy/trap + select_name = "snare" + +/obj/item/ammo_casing/energy/instakill + projectile_type = /obj/item/projectile/beam/instakill + e_cost = 0 + select_name = "DESTROY" + +/obj/item/ammo_casing/energy/instakill/blue + projectile_type = /obj/item/projectile/beam/instakill/blue + +/obj/item/ammo_casing/energy/instakill/red + projectile_type = /obj/item/projectile/beam/instakill/red + +/obj/item/ammo_casing/energy/tesla_revolver + fire_sound = 'sound/magic/lightningbolt.ogg' + e_cost = 200 + select_name = "stun" + projectile_type = /obj/item/projectile/energy/tesla/revolver diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm new file mode 100644 index 0000000000..5a88a97b08 --- /dev/null +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -0,0 +1,24 @@ +/obj/item/ammo_casing/energy/electrode + projectile_type = /obj/item/projectile/energy/electrode + select_name = "stun" + fire_sound = 'sound/weapons/taser.ogg' + e_cost = 200 + +/obj/item/ammo_casing/energy/electrode/spec + e_cost = 100 + +/obj/item/ammo_casing/energy/electrode/gun + fire_sound = 'sound/weapons/gunshot.ogg' + e_cost = 100 + +/obj/item/ammo_casing/energy/electrode/hos + e_cost = 200 + +/obj/item/ammo_casing/energy/electrode/old + e_cost = 1000 + +/obj/item/ammo_casing/energy/disabler + projectile_type = /obj/item/projectile/beam/disabler + select_name = "disable" + e_cost = 50 + fire_sound = 'sound/weapons/taser2.ogg' diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm new file mode 100644 index 0000000000..6ebf5739a9 --- /dev/null +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -0,0 +1,42 @@ +/obj/item/ammo_casing/magic + name = "magic casing" + desc = "I didn't even know magic needed ammo..." + projectile_type = /obj/item/projectile/magic + firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic + heavy_metal = FALSE + +/obj/item/ammo_casing/magic/change + projectile_type = /obj/item/projectile/magic/change + +/obj/item/ammo_casing/magic/animate + projectile_type = /obj/item/projectile/magic/animate + +/obj/item/ammo_casing/magic/heal + projectile_type = /obj/item/projectile/magic/resurrection + +/obj/item/ammo_casing/magic/death + projectile_type = /obj/item/projectile/magic/death + +/obj/item/ammo_casing/magic/teleport + projectile_type = /obj/item/projectile/magic/teleport + +/obj/item/ammo_casing/magic/door + projectile_type = /obj/item/projectile/magic/door + +/obj/item/ammo_casing/magic/fireball + projectile_type = /obj/item/projectile/magic/aoe/fireball + +/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/arcane_barrage + projectile_type = /obj/item/projectile/magic/arcane_barrage + +/obj/item/ammo_casing/magic/chaos/newshot() + ..() + +/obj/item/ammo_casing/magic/honk + projectile_type = /obj/item/projectile/bullet/honker diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special/syringe.dm similarity index 53% rename from code/modules/projectiles/ammunition/special.dm rename to code/modules/projectiles/ammunition/special/syringe.dm index b378d7fa6c..4a2a354ca6 100644 --- a/code/modules/projectiles/ammunition/special.dm +++ b/code/modules/projectiles/ammunition/special/syringe.dm @@ -1,111 +1,61 @@ -/obj/item/ammo_casing/magic - name = "magic casing" - desc = "I didn't even know magic needed ammo..." - projectile_type = /obj/item/projectile/magic - firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic - heavy_metal = FALSE - -/obj/item/ammo_casing/magic/change - projectile_type = /obj/item/projectile/magic/change - -/obj/item/ammo_casing/magic/animate - projectile_type = /obj/item/projectile/magic/animate - -/obj/item/ammo_casing/magic/heal - projectile_type = /obj/item/projectile/magic/resurrection - -/obj/item/ammo_casing/magic/death - projectile_type = /obj/item/projectile/magic/death - -/obj/item/ammo_casing/magic/teleport - projectile_type = /obj/item/projectile/magic/teleport - -/obj/item/ammo_casing/magic/door - projectile_type = /obj/item/projectile/magic/door - -/obj/item/ammo_casing/magic/fireball - projectile_type = /obj/item/projectile/magic/aoe/fireball - -/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/arcane_barrage - projectile_type = /obj/item/projectile/magic/arcane_barrage - -/obj/item/ammo_casing/magic/chaos/newshot() - ..() - -/obj/item/ammo_casing/magic/honk - projectile_type = /obj/item/projectile/bullet/honker - -/obj/item/ammo_casing/syringegun - name = "syringe gun spring" - desc = "A high-power spring that throws syringes." - projectile_type = /obj/item/projectile/bullet/dart/syringe - firing_effect_type = null - -/obj/item/ammo_casing/syringegun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - if(!BB) - return - if(istype(loc, /obj/item/gun/syringe)) - var/obj/item/gun/syringe/SG = loc - if(!SG.syringes.len) - return - - var/obj/item/reagent_containers/syringe/S = SG.syringes[1] - - S.reagents.trans_to(BB, S.reagents.total_volume) - BB.name = S.name - var/obj/item/projectile/bullet/dart/D = BB - D.piercing = S.proj_piercing - SG.syringes.Remove(S) - qdel(S) - ..() - -/obj/item/ammo_casing/chemgun - name = "dart synthesiser" - desc = "A high-power spring, linked to an energy-based dart synthesiser." - projectile_type = /obj/item/projectile/bullet/dart - firing_effect_type = null - -/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - if(!BB) - return - if(istype(loc, /obj/item/gun/chem)) - var/obj/item/gun/chem/CG = loc - if(CG.syringes_left <= 0) - return - CG.reagents.trans_to(BB, 15) - BB.name = "chemical dart" - CG.syringes_left-- - ..() - -/obj/item/ammo_casing/dnainjector - name = "rigged syringe gun spring" - desc = "A high-power spring that throws DNA injectors." - projectile_type = /obj/item/projectile/bullet/dnainjector - firing_effect_type = null - -/obj/item/ammo_casing/dnainjector/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - if(!BB) - return - if(istype(loc, /obj/item/gun/syringe/dna)) - var/obj/item/gun/syringe/dna/SG = loc - if(!SG.syringes.len) - return - - var/obj/item/dnainjector/S = popleft(SG.syringes) - var/obj/item/projectile/bullet/dnainjector/D = BB - S.forceMove(D) - D.injector = S - ..() - -/obj/item/ammo_casing/energy/c3dbullet - projectile_type = /obj/item/projectile/bullet/c3d - select_name = "spraydown" - fire_sound = 'sound/weapons/gunshot_smg.ogg' - e_cost = 20 - firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect +/obj/item/ammo_casing/syringegun + name = "syringe gun spring" + desc = "A high-power spring that throws syringes." + projectile_type = /obj/item/projectile/bullet/dart/syringe + firing_effect_type = null + +/obj/item/ammo_casing/syringegun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + if(!BB) + return + if(istype(loc, /obj/item/gun/syringe)) + var/obj/item/gun/syringe/SG = loc + if(!SG.syringes.len) + return + + var/obj/item/reagent_containers/syringe/S = SG.syringes[1] + + S.reagents.trans_to(BB, S.reagents.total_volume) + BB.name = S.name + var/obj/item/projectile/bullet/dart/D = BB + D.piercing = S.proj_piercing + SG.syringes.Remove(S) + qdel(S) + ..() + +/obj/item/ammo_casing/chemgun + name = "dart synthesiser" + desc = "A high-power spring, linked to an energy-based dart synthesiser." + projectile_type = /obj/item/projectile/bullet/dart + firing_effect_type = null + +/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + if(!BB) + return + if(istype(loc, /obj/item/gun/chem)) + var/obj/item/gun/chem/CG = loc + if(CG.syringes_left <= 0) + return + CG.reagents.trans_to(BB, 15) + BB.name = "chemical dart" + CG.syringes_left-- + ..() + +/obj/item/ammo_casing/dnainjector + name = "rigged syringe gun spring" + desc = "A high-power spring that throws DNA injectors." + projectile_type = /obj/item/projectile/bullet/dnainjector + firing_effect_type = null + +/obj/item/ammo_casing/dnainjector/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + if(!BB) + return + if(istype(loc, /obj/item/gun/syringe/dna)) + var/obj/item/gun/syringe/dna/SG = loc + if(!SG.syringes.len) + return + + var/obj/item/dnainjector/S = popleft(SG.syringes) + var/obj/item/projectile/bullet/dnainjector/D = BB + S.forceMove(D) + D.injector = S + ..() diff --git a/code/modules/projectiles/box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm similarity index 96% rename from code/modules/projectiles/box_magazine.dm rename to code/modules/projectiles/boxes_magazines/_box_magazine.dm index 57860e7910..1c5a2b1199 100644 --- a/code/modules/projectiles/box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -1,121 +1,121 @@ -//Boxes of ammo -/obj/item/ammo_box - name = "ammo box (null_reference_exception)" - desc = "A box of ammo." - icon_state = "357" - icon = 'icons/obj/ammo.dmi' - flags_1 = CONDUCT_1 - slot_flags = SLOT_BELT - item_state = "syringe_kit" - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - materials = list(MAT_METAL=30000) - throwforce = 2 - w_class = WEIGHT_CLASS_TINY - throw_speed = 3 - throw_range = 7 - var/list/stored_ammo = list() - var/ammo_type = /obj/item/ammo_casing - var/max_ammo = 7 - var/multiple_sprites = 0 - var/caliber - var/multiload = 1 - var/start_empty = 0 - -/obj/item/ammo_box/Initialize() - . = ..() - if(!start_empty) - for(var/i = 1, i <= max_ammo, i++) - stored_ammo += new ammo_type(src) - update_icon() - -/obj/item/ammo_box/proc/get_round(keep = 0) - if (!stored_ammo.len) - return null - else - var/b = stored_ammo[stored_ammo.len] - stored_ammo -= b - if (keep) - stored_ammo.Insert(1,b) - return b - -/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0) - // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type. - if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) - return 0 - - if (stored_ammo.len < max_ammo) - stored_ammo += R - R.forceMove(src) - return 1 - - //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo - else if(replace_spent) - for(var/obj/item/ammo_casing/AC in stored_ammo) - if(!AC.BB)//found a spent ammo - stored_ammo -= AC - AC.forceMove(get_turf(src.loc)) - - stored_ammo += R - R.forceMove(src) - return 1 - - return 0 - -/obj/item/ammo_box/proc/can_load(mob/user) - return 1 - -/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0) - var/num_loaded = 0 - if(!can_load(user)) - return - if(istype(A, /obj/item/ammo_box)) - var/obj/item/ammo_box/AM = A - for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - var/did_load = give_round(AC, replace_spent) - if(did_load) - AM.stored_ammo -= AC - num_loaded++ - if(!did_load || !multiload) - break - if(istype(A, /obj/item/ammo_casing)) - var/obj/item/ammo_casing/AC = A - if(give_round(AC, replace_spent)) - user.transferItemToLoc(AC, src, TRUE) - num_loaded++ - - if(num_loaded) - if(!silent) - to_chat(user, "You load [num_loaded] shell\s into \the [src]!") - playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1) - A.update_icon() - update_icon() - - return num_loaded - -/obj/item/ammo_box/attack_self(mob/user) - var/obj/item/ammo_casing/A = get_round() - if(A) - if(!user.put_in_hands(A)) - A.bounce_away(FALSE, NONE) - playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1) - to_chat(user, "You remove a round from \the [src]!") - update_icon() - -/obj/item/ammo_box/update_icon() - switch(multiple_sprites) - if(1) - icon_state = "[initial(icon_state)]-[stored_ammo.len]" - if(2) - icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]" - desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!" - -//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) +//Boxes of ammo +/obj/item/ammo_box + name = "ammo box (null_reference_exception)" + desc = "A box of ammo." + icon_state = "357" + icon = 'icons/obj/ammo.dmi' + flags_1 = CONDUCT_1 + slot_flags = SLOT_BELT + item_state = "syringe_kit" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + materials = list(MAT_METAL=30000) + throwforce = 2 + w_class = WEIGHT_CLASS_TINY + throw_speed = 3 + throw_range = 7 + var/list/stored_ammo = list() + var/ammo_type = /obj/item/ammo_casing + var/max_ammo = 7 + var/multiple_sprites = 0 + var/caliber + var/multiload = 1 + var/start_empty = 0 + +/obj/item/ammo_box/Initialize() + . = ..() + if(!start_empty) + for(var/i = 1, i <= max_ammo, i++) + stored_ammo += new ammo_type(src) + update_icon() + +/obj/item/ammo_box/proc/get_round(keep = 0) + if (!stored_ammo.len) + return null + else + var/b = stored_ammo[stored_ammo.len] + stored_ammo -= b + if (keep) + stored_ammo.Insert(1,b) + return b + +/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0) + // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type. + if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) + return 0 + + if (stored_ammo.len < max_ammo) + stored_ammo += R + R.forceMove(src) + return 1 + + //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo + else if(replace_spent) + for(var/obj/item/ammo_casing/AC in stored_ammo) + if(!AC.BB)//found a spent ammo + stored_ammo -= AC + AC.forceMove(get_turf(src.loc)) + + stored_ammo += R + R.forceMove(src) + return 1 + + return 0 + +/obj/item/ammo_box/proc/can_load(mob/user) + return 1 + +/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0) + var/num_loaded = 0 + if(!can_load(user)) + return + if(istype(A, /obj/item/ammo_box)) + var/obj/item/ammo_box/AM = A + for(var/obj/item/ammo_casing/AC in AM.stored_ammo) + var/did_load = give_round(AC, replace_spent) + if(did_load) + AM.stored_ammo -= AC + num_loaded++ + if(!did_load || !multiload) + break + if(istype(A, /obj/item/ammo_casing)) + var/obj/item/ammo_casing/AC = A + if(give_round(AC, replace_spent)) + user.transferItemToLoc(AC, src, TRUE) + num_loaded++ + + if(num_loaded) + if(!silent) + to_chat(user, "You load [num_loaded] shell\s into \the [src]!") + playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1) + A.update_icon() + update_icon() + + return num_loaded + +/obj/item/ammo_box/attack_self(mob/user) + var/obj/item/ammo_casing/A = get_round() + if(A) + if(!user.put_in_hands(A)) + A.bounce_away(FALSE, NONE) + playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1) + to_chat(user, "You remove a round from \the [src]!") + update_icon() + +/obj/item/ammo_box/update_icon() + switch(multiple_sprites) + if(1) + icon_state = "[initial(icon_state)]-[stored_ammo.len]" + if(2) + icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]" + desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!" + +//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 \ No newline at end of file diff --git a/code/modules/projectiles/boxes_magazines/external/grenade.dm b/code/modules/projectiles/boxes_magazines/external/grenade.dm new file mode 100644 index 0000000000..2b3c31f81c --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/grenade.dm @@ -0,0 +1,8 @@ +/obj/item/ammo_box/magazine/m75 + name = "specialized magazine (.75)" + icon_state = "75" + ammo_type = /obj/item/ammo_casing/caseless/a75 + caliber = "75" + multiple_sprites = 2 + max_ammo = 8 + diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm new file mode 100644 index 0000000000..cb42989022 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/lmg.dm @@ -0,0 +1,22 @@ +/obj/item/ammo_box/magazine/mm195x129 + name = "box magazine (1.95x129mm)" + icon_state = "a762-50" + ammo_type = /obj/item/ammo_casing/mm195x129 + caliber = "mm195129" + max_ammo = 50 + +/obj/item/ammo_box/magazine/mm195x129/hollow + name = "box magazine (Hollow-Point 1.95x129mm)" + ammo_type = /obj/item/ammo_casing/mm195x129/hollow + +/obj/item/ammo_box/magazine/mm195x129/ap + name = "box magazine (Armor Penetrating 1.95x129mm)" + ammo_type = /obj/item/ammo_casing/mm195x129/ap + +/obj/item/ammo_box/magazine/mm195x129/incen + name = "box magazine (Incendiary 1.95x129mm)" + ammo_type = /obj/item/ammo_casing/mm195x129/incen + +/obj/item/ammo_box/magazine/mm195x129/update_icon() + ..() + icon_state = "a762-[round(ammo_count(),10)]" diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm new file mode 100644 index 0000000000..d70b20c65c --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -0,0 +1,56 @@ +/obj/item/ammo_box/magazine/m10mm + name = "pistol magazine (10mm)" + desc = "A gun magazine." + icon_state = "9x19p" + ammo_type = /obj/item/ammo_casing/c10mm + caliber = "10mm" + max_ammo = 8 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/m10mm/fire + name = "pistol magazine (10mm incendiary)" + icon_state = "9x19pI" + desc = "A gun magazine. Loaded with rounds which ignite the target." + ammo_type = /obj/item/ammo_casing/c10mm/fire + +/obj/item/ammo_box/magazine/m10mm/hp + name = "pistol magazine (10mm HP)" + icon_state = "9x19pH" + desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing." + ammo_type = /obj/item/ammo_casing/c10mm/hp + +/obj/item/ammo_box/magazine/m10mm/ap + name = "pistol magazine (10mm AP)" + icon_state = "9x19pA" + desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets." + ammo_type = /obj/item/ammo_casing/c10mm/ap + +/obj/item/ammo_box/magazine/m45 + name = "handgun magazine (.45)" + icon_state = "45-8" + ammo_type = /obj/item/ammo_casing/c45 + caliber = ".45" + max_ammo = 8 + +/obj/item/ammo_box/magazine/m45/update_icon() + ..() + icon_state = "45-[ammo_count() ? "8" : "0"]" + +/obj/item/ammo_box/magazine/pistolm9mm + name = "pistol magazine (9mm)" + icon_state = "9x19p-8" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 15 + +/obj/item/ammo_box/magazine/pistolm9mm/update_icon() + ..() + icon_state = "9x19p-[ammo_count() ? "8" : "0"]" + +/obj/item/ammo_box/magazine/m50 + name = "handgun magazine (.50ae)" + icon_state = "50ae" + ammo_type = /obj/item/ammo_casing/a50AE + caliber = ".50" + max_ammo = 7 + multiple_sprites = 1 diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm new file mode 100644 index 0000000000..c4fb00aa22 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -0,0 +1,14 @@ +/obj/item/ammo_box/magazine/recharge + name = "power pack" + desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles." + icon_state = "oldrifle-20" + ammo_type = /obj/item/ammo_casing/caseless/laser + caliber = "laser" + max_ammo = 20 + +/obj/item/ammo_box/magazine/recharge/update_icon() + desc = "[initial(desc)] It has [stored_ammo.len] shot\s left." + icon_state = "oldrifle-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets" + return diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm new file mode 100644 index 0000000000..96e7d377ea --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm @@ -0,0 +1,21 @@ +/obj/item/ammo_box/magazine/m10mm/rifle + name = "rifle magazine (10mm)" + desc = "A well-worn magazine fitted for the surplus rifle." + icon_state = "75-8" + ammo_type = /obj/item/ammo_casing/c10mm + caliber = "10mm" + max_ammo = 10 + +/obj/item/ammo_box/magazine/m10mm/rifle/update_icon() + if(ammo_count()) + icon_state = "75-8" + else + icon_state = "75-0" + +/obj/item/ammo_box/magazine/m556 + name = "toploader magazine (5.56mm)" + icon_state = "5.56m" + ammo_type = /obj/item/ammo_casing/a556 + caliber = "a556" + max_ammo = 30 + multiple_sprites = 2 diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm new file mode 100644 index 0000000000..dc8d0175ba --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm @@ -0,0 +1,36 @@ +/obj/item/ammo_box/magazine/m12g + name = "shotgun magazine (12g taser slugs)" + desc = "A drum magazine." + icon_state = "m12gs" + ammo_type = /obj/item/ammo_casing/shotgun/stunslug + caliber = "shotgun" + max_ammo = 8 + +/obj/item/ammo_box/magazine/m12g/update_icon() + ..() + icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]" + +/obj/item/ammo_box/magazine/m12g/buckshot + name = "shotgun magazine (12g buckshot slugs)" + icon_state = "m12gb" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + +/obj/item/ammo_box/magazine/m12g/slug + name = "shotgun magazine (12g slugs)" + icon_state = "m12gb" + ammo_type = /obj/item/ammo_casing/shotgun + +/obj/item/ammo_box/magazine/m12g/dragon + name = "shotgun magazine (12g dragon's breath)" + icon_state = "m12gf" + ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath + +/obj/item/ammo_box/magazine/m12g/bioterror + name = "shotgun magazine (12g bioterror)" + icon_state = "m12gt" + ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror + +/obj/item/ammo_box/magazine/m12g/meteor + name = "shotgun magazine (12g meteor slugs)" + icon_state = "m12gbc" + ammo_type = /obj/item/ammo_casing/shotgun/meteorslug diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm new file mode 100644 index 0000000000..c6dc004879 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/smg.dm @@ -0,0 +1,76 @@ +/obj/item/ammo_box/magazine/wt550m9 + name = "wt550 magazine (4.6x30mm)" + icon_state = "46x30mmt-20" + ammo_type = /obj/item/ammo_casing/c46x30mm + caliber = "4.6x30mm" + max_ammo = 20 + +/obj/item/ammo_box/magazine/wt550m9/update_icon() + ..() + icon_state = "46x30mmt-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/wt550m9/wtap + name = "wt550 magazine (Armour Piercing 4.6x30mm)" + icon_state = "46x30mmtA-20" + ammo_type = /obj/item/ammo_casing/c46x30mm/ap + +/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon() + ..() + icon_state = "46x30mmtA-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/wt550m9/wtic + name = "wt550 magazine (Incindiary 4.6x30mm)" + icon_state = "46x30mmtI-20" + ammo_type = /obj/item/ammo_casing/c46x30mm/inc + +/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon() + ..() + icon_state = "46x30mmtI-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/uzim9mm + name = "uzi magazine (9mm)" + icon_state = "uzi9mm-32" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 32 + +/obj/item/ammo_box/magazine/uzim9mm/update_icon() + ..() + icon_state = "uzi9mm-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/smgm9mm + name = "SMG magazine (9mm)" + icon_state = "smg9mm-42" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 21 + +/obj/item/ammo_box/magazine/smgm9mm/update_icon() + ..() + icon_state = "smg9mm-[ammo_count() ? "42" : "0"]" + +/obj/item/ammo_box/magazine/smgm9mm/ap + name = "SMG magazine (Armour Piercing 9mm)" + ammo_type = /obj/item/ammo_casing/c9mm/ap + +/obj/item/ammo_box/magazine/smgm9mm/fire + name = "SMG Magazine (Incindiary 9mm)" + ammo_type = /obj/item/ammo_casing/c9mm/inc + +/obj/item/ammo_box/magazine/smgm45 + name = "SMG magazine (.45)" + icon_state = "c20r45-24" + ammo_type = /obj/item/ammo_casing/c45/nostamina + caliber = ".45" + max_ammo = 24 + +/obj/item/ammo_box/magazine/smgm45/update_icon() + ..() + icon_state = "c20r45-[round(ammo_count(),2)]" + +/obj/item/ammo_box/magazine/tommygunm45 + name = "drum magazine (.45)" + icon_state = "drum45" + ammo_type = /obj/item/ammo_casing/c45 + caliber = ".45" + max_ammo = 50 diff --git a/code/modules/projectiles/boxes_magazines/external/sniper.dm b/code/modules/projectiles/boxes_magazines/external/sniper.dm new file mode 100644 index 0000000000..67c6257bac --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/sniper.dm @@ -0,0 +1,26 @@ +/obj/item/ammo_box/magazine/sniper_rounds + name = "sniper rounds (.50)" + icon_state = ".50mag" + ammo_type = /obj/item/ammo_casing/p50 + max_ammo = 6 + caliber = ".50" + +/obj/item/ammo_box/magazine/sniper_rounds/update_icon() + if(ammo_count()) + icon_state = "[initial(icon_state)]-ammo" + else + icon_state = "[initial(icon_state)]" + +/obj/item/ammo_box/magazine/sniper_rounds/soporific + name = "sniper rounds (Zzzzz)" + desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..." + icon_state = "soporific" + ammo_type = /obj/item/ammo_casing/p50/soporific + max_ammo = 3 + caliber = ".50" + +/obj/item/ammo_box/magazine/sniper_rounds/penetrator + name = "sniper rounds (penetrator)" + desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it." + ammo_type = /obj/item/ammo_casing/p50/penetrator + max_ammo = 5 diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm new file mode 100644 index 0000000000..cb66391c02 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/external/toy.dm @@ -0,0 +1,55 @@ +/obj/item/ammo_box/magazine/toy + name = "foam force META magazine" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + caliber = "foam_force" + +/obj/item/ammo_box/magazine/toy/smg + name = "foam force SMG magazine" + icon_state = "smg9mm-42" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + max_ammo = 20 + +/obj/item/ammo_box/magazine/toy/smg/update_icon() + ..() + if(ammo_count()) + icon_state = "smg9mm-42" + else + icon_state = "smg9mm-0" + +/obj/item/ammo_box/magazine/toy/smg/riot + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + +/obj/item/ammo_box/magazine/toy/pistol + name = "foam force pistol magazine" + icon_state = "9x19p" + max_ammo = 8 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/toy/pistol/riot + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + +/obj/item/ammo_box/magazine/toy/smgm45 + name = "donksoft SMG magazine" + caliber = "foam_force" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + max_ammo = 20 + +/obj/item/ammo_box/magazine/toy/smgm45/update_icon() + ..() + icon_state = "c20r45-[round(ammo_count(),2)]" + +/obj/item/ammo_box/magazine/toy/smgm45/riot + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + +/obj/item/ammo_box/magazine/toy/m762 + name = "donksoft box magazine" + caliber = "foam_force" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + max_ammo = 50 + +/obj/item/ammo_box/magazine/toy/m762/update_icon() + ..() + icon_state = "a762-[round(ammo_count(),10)]" + +/obj/item/ammo_box/magazine/toy/m762/riot + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm deleted file mode 100644 index b7b3a3e286..0000000000 --- a/code/modules/projectiles/boxes_magazines/external_mag.dm +++ /dev/null @@ -1,340 +0,0 @@ - -///////////EXTERNAL MAGAZINES//////////////// - -/obj/item/ammo_box/magazine/m10mm - name = "pistol magazine (10mm)" - desc = "A gun magazine." - icon_state = "9x19p" - ammo_type = /obj/item/ammo_casing/c10mm - caliber = "10mm" - max_ammo = 8 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/m10mm/rifle - name = "rifle magazine (10mm)" - desc = "A well-worn magazine fitted for the surplus rifle." - icon_state = "75-8" - ammo_type = /obj/item/ammo_casing/c10mm - caliber = "10mm" - max_ammo = 10 - -/obj/item/ammo_box/magazine/m10mm/rifle/update_icon() - if(ammo_count()) - icon_state = "75-8" - else - icon_state = "75-0" - - -/obj/item/ammo_box/magazine/m10mm/fire - name = "pistol magazine (10mm incendiary)" - icon_state = "9x19pI" - desc = "A gun magazine. Loaded with rounds which ignite the target." - ammo_type = /obj/item/ammo_casing/c10mm/fire - -/obj/item/ammo_box/magazine/m10mm/hp - name = "pistol magazine (10mm HP)" - icon_state = "9x19pH" - desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing." - ammo_type = /obj/item/ammo_casing/c10mm/hp - -/obj/item/ammo_box/magazine/m10mm/ap - name = "pistol magazine (10mm AP)" - icon_state = "9x19pA" - desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets." - ammo_type = /obj/item/ammo_casing/c10mm/ap - -/obj/item/ammo_box/magazine/m45 - name = "handgun magazine (.45)" - icon_state = "45-8" - ammo_type = /obj/item/ammo_casing/c45 - caliber = ".45" - max_ammo = 8 - -/obj/item/ammo_box/magazine/m45/update_icon() - ..() - icon_state = "45-[ammo_count() ? "8" : "0"]" - -/obj/item/ammo_box/magazine/wt550m9 - name = "wt550 magazine (4.6x30mm)" - icon_state = "46x30mmt-20" - ammo_type = /obj/item/ammo_casing/c46x30mm - caliber = "4.6x30mm" - max_ammo = 20 - -/obj/item/ammo_box/magazine/wt550m9/update_icon() - ..() - icon_state = "46x30mmt-[round(ammo_count(),4)]" - -/obj/item/ammo_box/magazine/wt550m9/wtap - name = "wt550 magazine (Armour Piercing 4.6x30mm)" - icon_state = "46x30mmtA-20" - ammo_type = /obj/item/ammo_casing/c46x30mm/ap - -/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon() - ..() - icon_state = "46x30mmtA-[round(ammo_count(),4)]" - -/obj/item/ammo_box/magazine/wt550m9/wtic - name = "wt550 magazine (Incindiary 4.6x30mm)" - icon_state = "46x30mmtI-20" - ammo_type = /obj/item/ammo_casing/c46x30mm/inc - -/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon() - ..() - icon_state = "46x30mmtI-[round(ammo_count(),4)]" - -/obj/item/ammo_box/magazine/uzim9mm - name = "uzi magazine (9mm)" - icon_state = "uzi9mm-32" - ammo_type = /obj/item/ammo_casing/c9mm - caliber = "9mm" - max_ammo = 32 - -/obj/item/ammo_box/magazine/uzim9mm/update_icon() - ..() - icon_state = "uzi9mm-[round(ammo_count(),4)]" - -/obj/item/ammo_box/magazine/smgm9mm - name = "SMG magazine (9mm)" - icon_state = "smg9mm-42" - ammo_type = /obj/item/ammo_casing/c9mm - caliber = "9mm" - max_ammo = 21 - -/obj/item/ammo_box/magazine/smgm9mm/update_icon() - ..() - icon_state = "smg9mm-[ammo_count() ? "42" : "0"]" - -/obj/item/ammo_box/magazine/smgm9mm/ap - name = "SMG magazine (Armour Piercing 9mm)" - ammo_type = /obj/item/ammo_casing/c9mm/ap - -/obj/item/ammo_box/magazine/smgm9mm/fire - name = "SMG Magazine (Incindiary 9mm)" - ammo_type = /obj/item/ammo_casing/c9mm/inc - -/obj/item/ammo_box/magazine/pistolm9mm - name = "pistol magazine (9mm)" - icon_state = "9x19p-8" - ammo_type = /obj/item/ammo_casing/c9mm - caliber = "9mm" - max_ammo = 15 - -/obj/item/ammo_box/magazine/pistolm9mm/update_icon() - ..() - icon_state = "9x19p-[ammo_count() ? "8" : "0"]" - -/obj/item/ammo_box/magazine/smgm45 - name = "SMG magazine (.45)" - icon_state = "c20r45-24" - ammo_type = /obj/item/ammo_casing/c45/nostamina - caliber = ".45" - max_ammo = 24 - -/obj/item/ammo_box/magazine/smgm45/update_icon() - ..() - icon_state = "c20r45-[round(ammo_count(),2)]" - -/obj/item/ammo_box/magazine/tommygunm45 - name = "drum magazine (.45)" - icon_state = "drum45" - ammo_type = /obj/item/ammo_casing/c45 - caliber = ".45" - max_ammo = 50 - -/obj/item/ammo_box/magazine/m50 - name = "handgun magazine (.50ae)" - icon_state = "50ae" - ammo_type = /obj/item/ammo_casing/a50AE - caliber = ".50" - max_ammo = 7 - multiple_sprites = 1 - -/obj/item/ammo_box/magazine/m75 - name = "specialized magazine (.75)" - icon_state = "75" - ammo_type = /obj/item/ammo_casing/caseless/a75 - caliber = "75" - multiple_sprites = 2 - max_ammo = 8 - -/obj/item/ammo_box/magazine/m556 - name = "toploader magazine (5.56mm)" - icon_state = "5.56m" - ammo_type = /obj/item/ammo_casing/a556 - caliber = "a556" - max_ammo = 30 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/m12g - name = "shotgun magazine (12g taser slugs)" - desc = "A drum magazine." - icon_state = "m12gs" - ammo_type = /obj/item/ammo_casing/shotgun/stunslug - caliber = "shotgun" - max_ammo = 8 - -/obj/item/ammo_box/magazine/m12g/update_icon() - ..() - icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]" - -/obj/item/ammo_box/magazine/m12g/buckshot - name = "shotgun magazine (12g buckshot slugs)" - icon_state = "m12gb" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - -/obj/item/ammo_box/magazine/m12g/slug - name = "shotgun magazine (12g slugs)" - icon_state = "m12gb" - ammo_type = /obj/item/ammo_casing/shotgun - -/obj/item/ammo_box/magazine/m12g/dragon - name = "shotgun magazine (12g dragon's breath)" - icon_state = "m12gf" - ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath - -/obj/item/ammo_box/magazine/m12g/bioterror - name = "shotgun magazine (12g bioterror)" - icon_state = "m12gt" - ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror - -/obj/item/ammo_box/magazine/m12g/meteor - name = "shotgun magazine (12g meteor slugs)" - icon_state = "m12gbc" - ammo_type = /obj/item/ammo_casing/shotgun/meteorslug - - -//// SNIPER MAGAZINES - -/obj/item/ammo_box/magazine/sniper_rounds - name = "sniper rounds (.50)" - icon_state = ".50mag" - ammo_type = /obj/item/ammo_casing/p50 - max_ammo = 6 - caliber = ".50" - -/obj/item/ammo_box/magazine/sniper_rounds/update_icon() - if(ammo_count()) - icon_state = "[initial(icon_state)]-ammo" - else - icon_state = "[initial(icon_state)]" - -/obj/item/ammo_box/magazine/sniper_rounds/soporific - name = "sniper rounds (Zzzzz)" - desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..." - icon_state = "soporific" - ammo_type = /obj/item/ammo_casing/p50/soporific - max_ammo = 3 - caliber = ".50" - -/obj/item/ammo_box/magazine/sniper_rounds/penetrator - name = "sniper rounds (penetrator)" - desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it." - ammo_type = /obj/item/ammo_casing/p50/penetrator - max_ammo = 5 - -//// SAW MAGAZINES - -/obj/item/ammo_box/magazine/mm195x129 - name = "box magazine (1.95x129mm)" - icon_state = "a762-50" - ammo_type = /obj/item/ammo_casing/mm195x129 - caliber = "mm195129" - max_ammo = 50 - -/obj/item/ammo_box/magazine/mm195x129/hollow - name = "box magazine (Hollow-Point 1.95x129mm)" - ammo_type = /obj/item/ammo_casing/mm195x129/hollow - -/obj/item/ammo_box/magazine/mm195x129/ap - name = "box magazine (Armor Penetrating 1.95x129mm)" - ammo_type = /obj/item/ammo_casing/mm195x129/ap - -/obj/item/ammo_box/magazine/mm195x129/incen - name = "box magazine (Incendiary 1.95x129mm)" - ammo_type = /obj/item/ammo_casing/mm195x129/incen - -/obj/item/ammo_box/magazine/mm195x129/update_icon() - ..() - icon_state = "a762-[round(ammo_count(),10)]" - - - - -////TOY GUN MAGAZINES - -/obj/item/ammo_box/magazine/toy - name = "foam force META magazine" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - caliber = "foam_force" - -/obj/item/ammo_box/magazine/toy/smg - name = "foam force SMG magazine" - icon_state = "smg9mm-42" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - max_ammo = 20 - -/obj/item/ammo_box/magazine/toy/smg/update_icon() - ..() - if(ammo_count()) - icon_state = "smg9mm-42" - else - icon_state = "smg9mm-0" - -/obj/item/ammo_box/magazine/toy/smg/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - -/obj/item/ammo_box/magazine/toy/pistol - name = "foam force pistol magazine" - icon_state = "9x19p" - max_ammo = 8 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/toy/pistol/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - -/obj/item/ammo_box/magazine/toy/smgm45 - name = "donksoft SMG magazine" - caliber = "foam_force" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - max_ammo = 20 - -/obj/item/ammo_box/magazine/toy/smgm45/update_icon() - ..() - icon_state = "c20r45-[round(ammo_count(),2)]" - -/obj/item/ammo_box/magazine/toy/smgm45/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - -/obj/item/ammo_box/magazine/toy/m762 - name = "donksoft box magazine" - caliber = "foam_force" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - max_ammo = 50 - -/obj/item/ammo_box/magazine/toy/m762/update_icon() - ..() - icon_state = "a762-[round(ammo_count(),10)]" - -/obj/item/ammo_box/magazine/toy/m762/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - - - - -//// RECHARGEABLE MAGAZINES - -/obj/item/ammo_box/magazine/recharge - name = "power pack" - desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles." - icon_state = "oldrifle-20" - ammo_type = /obj/item/ammo_casing/caseless/laser - caliber = "laser" - max_ammo = 20 - -/obj/item/ammo_box/magazine/recharge/update_icon() - desc = "[initial(desc)] It has [stored_ammo.len] shot\s left." - icon_state = "oldrifle-[round(ammo_count(),4)]" - -/obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets" - return diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm new file mode 100644 index 0000000000..bbfc79471c --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -0,0 +1,47 @@ +/obj/item/ammo_box/magazine/internal/cylinder + name = "revolver cylinder" + ammo_type = /obj/item/ammo_casing/a357 + caliber = "357" + max_ammo = 7 + +/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(countempties = 1) + var/boolets = 0 + for(var/obj/item/ammo_casing/bullet in stored_ammo) + if(bullet && (bullet.BB || countempties)) + boolets++ + + return boolets + +/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0) + rotate() + + var/b = stored_ammo[1] + if(!keep) + stored_ammo[1] = null + + return b + +/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate() + var/b = stored_ammo[1] + stored_ammo.Cut(1,2) + stored_ammo.Insert(0, b) + +/obj/item/ammo_box/magazine/internal/cylinder/proc/spin() + for(var/i in 1 to rand(0, max_ammo*2)) + rotate() + +/obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0) + if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) + return FALSE + + for(var/i in 1 to stored_ammo.len) + var/obj/item/ammo_casing/bullet = stored_ammo[i] + if(!bullet || !bullet.BB) // found a spent ammo + stored_ammo[i] = R + R.forceMove(src) + + if(bullet) + bullet.forceMove(drop_location()) + return TRUE + + return FALSE diff --git a/code/modules/projectiles/boxes_magazines/internal/_internal.dm b/code/modules/projectiles/boxes_magazines/internal/_internal.dm new file mode 100644 index 0000000000..e21cb5ce61 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/_internal.dm @@ -0,0 +1,7 @@ +/obj/item/ammo_box/magazine/internal + desc = "Oh god, this shouldn't be here" + flags_1 = CONDUCT_1|ABSTRACT_1 + +//internals magazines are accessible, so replace spent ammo if full when trying to put a live one in +/obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R) + return ..(R,1) diff --git a/code/modules/projectiles/boxes_magazines/internal/grenade.dm b/code/modules/projectiles/boxes_magazines/internal/grenade.dm new file mode 100644 index 0000000000..12325a0299 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/grenade.dm @@ -0,0 +1,17 @@ +/obj/item/ammo_box/magazine/internal/cylinder/grenademulti + name = "grenade launcher internal magazine" + ammo_type = /obj/item/ammo_casing/a40mm + caliber = "40mm" + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/grenadelauncher + name = "grenade launcher internal magazine" + ammo_type = /obj/item/ammo_casing/a40mm + caliber = "40mm" + max_ammo = 1 + +/obj/item/ammo_box/magazine/internal/rocketlauncher + name = "grenade launcher internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/a84mm + caliber = "84mm" + max_ammo = 1 diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm new file mode 100644 index 0000000000..aab0643cbc --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm @@ -0,0 +1,11 @@ +/obj/item/ammo_box/magazine/internal/speargun + name = "speargun internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/magspear + caliber = "speargun" + max_ammo = 1 + +/obj/item/ammo_box/magazine/internal/minigun + name = "gatling gun fusion core" + ammo_type = /obj/item/ammo_casing/caseless/laser/gatling + caliber = "gatling" + max_ammo = 5000 diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm new file mode 100644 index 0000000000..976f80f437 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm @@ -0,0 +1,22 @@ +/obj/item/ammo_box/magazine/internal/cylinder/rev38 + name = "detective revolver cylinder" + ammo_type = /obj/item/ammo_casing/c38 + caliber = "38" + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/cylinder/rev762 + name = "nagant revolver cylinder" + ammo_type = /obj/item/ammo_casing/n762 + caliber = "n762" + max_ammo = 7 + +/obj/item/ammo_box/magazine/internal/cylinder/rus357 + name = "russian revolver cylinder" + ammo_type = /obj/item/ammo_casing/a357 + caliber = "357" + max_ammo = 6 + multiload = 0 + +/obj/item/ammo_box/magazine/internal/rus357/Initialize() + stored_ammo += new ammo_type(src) + . = ..() diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm new file mode 100644 index 0000000000..ef83e96b1c --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -0,0 +1,15 @@ +/obj/item/ammo_box/magazine/internal/boltaction + name = "bolt action rifle internal magazine" + desc = "Oh god, this shouldn't be here" + ammo_type = /obj/item/ammo_casing/a762 + caliber = "a762" + max_ammo = 5 + multiload = 1 + +/obj/item/ammo_box/magazine/internal/boltaction/enchanted + max_ammo = 1 + ammo_type = /obj/item/ammo_casing/a762/enchanted + +/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage + ammo_type = /obj/item/ammo_casing/magic/arcane_barrage + diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm new file mode 100644 index 0000000000..3bd277da31 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -0,0 +1,48 @@ +/obj/item/ammo_box/magazine/internal/shot + name = "shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/beanbag + caliber = "shotgun" + max_ammo = 4 + multiload = 0 + +/obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1) + if (!countempties) + var/boolets = 0 + for(var/obj/item/ammo_casing/bullet in stored_ammo) + if(bullet.BB) + boolets++ + return boolets + else + return ..() + +/obj/item/ammo_box/magazine/internal/shot/tube + name = "dual feed shotgun internal tube" + ammo_type = /obj/item/ammo_casing/shotgun/rubbershot + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/lethal + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + +/obj/item/ammo_box/magazine/internal/shot/com + name = "combat shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/shot/com/compact + name = "compact combat shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/dual + name = "double-barrel shotgun internal magazine" + max_ammo = 2 + +/obj/item/ammo_box/magazine/internal/shot/improvised + name = "improvised shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/improvised + max_ammo = 1 + +/obj/item/ammo_box/magazine/internal/shot/riot + name = "riot shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/rubbershot + max_ammo = 6 diff --git a/code/modules/projectiles/boxes_magazines/internal/toy.dm b/code/modules/projectiles/boxes_magazines/internal/toy.dm new file mode 100644 index 0000000000..f2bb0dbf08 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/internal/toy.dm @@ -0,0 +1,7 @@ +/obj/item/ammo_box/magazine/internal/shot/toy + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + caliber = "foam_force" + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/toy/crossbow + max_ammo = 5 diff --git a/code/modules/projectiles/boxes_magazines/internal_mag.dm b/code/modules/projectiles/boxes_magazines/internal_mag.dm deleted file mode 100644 index b26d30c389..0000000000 --- a/code/modules/projectiles/boxes_magazines/internal_mag.dm +++ /dev/null @@ -1,191 +0,0 @@ -////////////////INTERNAL MAGAZINES////////////////////// - -/obj/item/ammo_box/magazine/internal - desc = "Oh god, this shouldn't be here" - flags_1 = CONDUCT_1|ABSTRACT_1 - -//internals magazines are accessible, so replace spent ammo if full when trying to put a live one in -/obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R) - return ..(R,1) - - - -// Revolver internal mags -/obj/item/ammo_box/magazine/internal/cylinder - name = "revolver cylinder" - ammo_type = /obj/item/ammo_casing/a357 - caliber = "357" - max_ammo = 7 - -/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(countempties = 1) - var/boolets = 0 - for(var/obj/item/ammo_casing/bullet in stored_ammo) - if(bullet && (bullet.BB || countempties)) - boolets++ - - return boolets - -/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0) - rotate() - - var/b = stored_ammo[1] - if(!keep) - stored_ammo[1] = null - - return b - -/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate() - var/b = stored_ammo[1] - stored_ammo.Cut(1,2) - stored_ammo.Insert(0, b) - -/obj/item/ammo_box/magazine/internal/cylinder/proc/spin() - for(var/i in 1 to rand(0, max_ammo*2)) - rotate() - - -/obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0) - if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) - return 0 - - for(var/i in 1 to stored_ammo.len) - var/obj/item/ammo_casing/bullet = stored_ammo[i] - if(!bullet || !bullet.BB) // found a spent ammo - stored_ammo[i] = R - R.forceMove(src) - - if(bullet) - bullet.forceMove(drop_location()) - return 1 - - return 0 - -/obj/item/ammo_box/magazine/internal/cylinder/rev38 - name = "detective revolver cylinder" - ammo_type = /obj/item/ammo_casing/c38 - caliber = "38" - max_ammo = 6 - -/obj/item/ammo_box/magazine/internal/cylinder/grenademulti - name = "grenade launcher internal magazine" - ammo_type = /obj/item/ammo_casing/a40mm - caliber = "40mm" - max_ammo = 6 - -/obj/item/ammo_box/magazine/internal/cylinder/rev762 - name = "nagant revolver cylinder" - ammo_type = /obj/item/ammo_casing/n762 - caliber = "n762" - max_ammo = 7 - -// Shotgun internal mags -/obj/item/ammo_box/magazine/internal/shot - name = "shotgun internal magazine" - ammo_type = /obj/item/ammo_casing/shotgun/beanbag - caliber = "shotgun" - max_ammo = 4 - multiload = 0 - -/obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1) - if (!countempties) - var/boolets = 0 - for(var/obj/item/ammo_casing/bullet in stored_ammo) - if(bullet.BB) - boolets++ - return boolets - else - return ..() - - -/obj/item/ammo_box/magazine/internal/shot/tube - name = "dual feed shotgun internal tube" - ammo_type = /obj/item/ammo_casing/shotgun/rubbershot - max_ammo = 4 - -/obj/item/ammo_box/magazine/internal/shot/lethal - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - -/obj/item/ammo_box/magazine/internal/shot/com - name = "combat shotgun internal magazine" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - max_ammo = 6 - -/obj/item/ammo_box/magazine/internal/shot/com/compact - name = "compact combat shotgun internal magazine" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - max_ammo = 4 - -/obj/item/ammo_box/magazine/internal/shot/dual - name = "double-barrel shotgun internal magazine" - max_ammo = 2 - -/obj/item/ammo_box/magazine/internal/shot/improvised - name = "improvised shotgun internal magazine" - ammo_type = /obj/item/ammo_casing/shotgun/improvised - max_ammo = 1 - -/obj/item/ammo_box/magazine/internal/shot/riot - name = "riot shotgun internal magazine" - ammo_type = /obj/item/ammo_casing/shotgun/rubbershot - max_ammo = 6 - - - - -/obj/item/ammo_box/magazine/internal/grenadelauncher - name = "grenade launcher internal magazine" - ammo_type = /obj/item/ammo_casing/a40mm - caliber = "40mm" - max_ammo = 1 - -/obj/item/ammo_box/magazine/internal/rocketlauncher - name = "grenade launcher internal magazine" - ammo_type = /obj/item/ammo_casing/caseless/a84mm - caliber = "84mm" - max_ammo = 1 - -/obj/item/ammo_box/magazine/internal/speargun - name = "speargun internal magazine" - ammo_type = /obj/item/ammo_casing/caseless/magspear - caliber = "speargun" - max_ammo = 1 - -/obj/item/ammo_box/magazine/internal/cylinder/rus357 - name = "russian revolver cylinder" - ammo_type = /obj/item/ammo_casing/a357 - caliber = "357" - max_ammo = 6 - multiload = 0 - -/obj/item/ammo_box/magazine/internal/rus357/Initialize() - stored_ammo += new ammo_type(src) - . = ..() - -/obj/item/ammo_box/magazine/internal/boltaction - name = "bolt action rifle internal magazine" - desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/a762 - caliber = "a762" - max_ammo = 5 - multiload = 1 - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted - max_ammo = 1 - ammo_type = /obj/item/ammo_casing/a762/enchanted - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage - ammo_type = /obj/item/ammo_casing/magic/arcane_barrage - -/obj/item/ammo_box/magazine/internal/shot/toy - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - caliber = "foam_force" - max_ammo = 4 - -/obj/item/ammo_box/magazine/internal/shot/toy/crossbow - max_ammo = 5 - -/obj/item/ammo_box/magazine/internal/minigun - name = "gatling gun fusion core" - ammo_type = /obj/item/ammo_casing/caseless/laser/gatling - caliber = "gatling" - max_ammo = 5000 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 1a0e756277..7b7daadc18 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -27,7 +27,7 @@ var/obj/item/ammo_casing/chambered = null trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers var/sawn_desc = null //description change if weapon is sawn-off - var/sawn_state = SAWN_INTACT + var/sawn_off = FALSE var/burst_size = 1 //how large a burst is var/fire_delay = 0 //rate of fire for burst firing and semi auto var/firing_burst = 0 //Prevent the weapon from firing again while already firing @@ -35,6 +35,7 @@ var/weapon_weight = WEAPON_LIGHT var/spread = 0 //Spread induced by the gun itself. var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. + var/harmful = TRUE //some arent harmful and should have this set to false. used for pacifists with tasers, medibeams, etc lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' @@ -111,6 +112,9 @@ if(recoil) shake_camera(user, recoil + 1, recoil) + if(iscarbon(user)) //CIT CHANGE - makes gun recoil cause staminaloss + user.adjustStaminaLossBuffered(getstamcost(user)*(firing_burst && burst_size >= 2 ? 1/burst_size : 1)) //CIT CHANGE - ditto + if(suppressed) playsound(user, fire_sound, 10, 1) else @@ -169,6 +173,9 @@ //DUAL (or more!) WIELDING var/bonus_spread = 0 var/loop_counter = 0 + + bonus_spread += getinaccuracy(user) //CIT CHANGE - adds bonus spread while not aiming + if(ishuman(user) && user.a_intent == INTENT_HARM) var/mob/living/carbon/human/H = user for(var/obj/item/gun/G in H.held_items) @@ -246,6 +253,8 @@ var/rand_spr = rand() if(spread) randomized_gun_spread = rand(0,spread) + if(user.has_trait(TRAIT_POOR_AIM)) //nice shootin' tex + bonus_spread += 25 var/randomized_bonus_spread = rand(0, bonus_spread) if(burst_size > 1) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index c16c5f0fc0..f7cb05486f 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -21,9 +21,9 @@ /obj/item/gun/ballistic/update_icon() ..() if(current_skin) - icon_state = "[unique_reskin[current_skin]][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]" + icon_state = "[unique_reskin[current_skin]][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" else - icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]" + icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" /obj/item/gun/ballistic/process_chamber(empty_chamber = 1) @@ -185,7 +185,7 @@ /obj/item/gun/ballistic/proc/sawoff(mob/user) - if(sawn_state == SAWN_OFF) + if(sawn_off) to_chat(user, "\The [src] is already shortened!") return user.changeNext_move(CLICK_CD_MELEE) @@ -197,7 +197,7 @@ return if(do_after(user, 30, target = src)) - if(sawn_state == SAWN_OFF) + if(sawn_off) return user.visible_message("[user] shortens \the [src]!", "You shorten \the [src].") name = "sawn-off [src.name]" @@ -206,7 +206,7 @@ item_state = "gun" 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) - sawn_state = SAWN_OFF + sawn_off = TRUE update_icon() return 1 diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 14e529ba23..489f88ffad 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -311,7 +311,7 @@ /obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) ..() - if(istype(A, /obj/item/stack/cable_coil) && !sawn_state) + if(istype(A, /obj/item/stack/cable_coil) && !sawn_off) var/obj/item/stack/cable_coil/C = A if(C.use(10)) slot_flags = SLOT_BACK @@ -339,7 +339,7 @@ icon_state = "ishotgun" item_state = "gun" w_class = WEIGHT_CLASS_NORMAL - sawn_state = SAWN_OFF + sawn_off = TRUE slot_flags = SLOT_BELT diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 315178368d..723e1b910c 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -37,8 +37,13 @@ /obj/item/gun/ballistic/shotgun/attack_self(mob/living/user) if(recentpump > world.time) return + if(istype(user) && user.staminaloss >= STAMINA_SOFTCRIT)//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit + to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto + return//CIT CHANGE - ditto pump(user) recentpump = world.time + 10 + if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina. + user.adjustStaminaLossBuffered(5) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added return /obj/item/gun/ballistic/shotgun/blow_up(mob/user) diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index af666951cb..93a210879e 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -13,6 +13,7 @@ clumsy_check = 0 item_flags = NONE casing_ejector = FALSE + harmful = FALSE /obj/item/gun/ballistic/automatic/toy/unrestricted pin = /obj/item/device/firing_pin @@ -27,6 +28,7 @@ burst_size = 1 fire_delay = 0 actions_types = list() + harmful = FALSE /obj/item/gun/ballistic/automatic/toy/pistol/update_icon() ..() @@ -56,6 +58,7 @@ item_flags = NONE casing_ejector = FALSE can_suppress = FALSE + harmful = FALSE /obj/item/gun/ballistic/shotgun/toy/process_chamber(empty_chamber = 0) ..() diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/energy/mounted.dm similarity index 96% rename from code/modules/projectiles/guns/mounted.dm rename to code/modules/projectiles/guns/energy/mounted.dm index 5893c2a107..79226689de 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/energy/mounted.dm @@ -1,26 +1,26 @@ -/obj/item/gun/energy/e_gun/advtaser/mounted - name = "mounted taser" - desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots." - icon = 'icons/obj/items_cyborg.dmi' - icon_state = "taser" - item_state = "armcannonstun4" - force = 5 - selfcharge = 1 - can_flashlight = 0 - trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead - -/obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... - ..() - -/obj/item/gun/energy/laser/mounted - name = "mounted laser" - desc = "An arm mounted cannon that fires lethal lasers." - icon = 'icons/obj/items_cyborg.dmi' - icon_state = "laser" - item_state = "armcannonlase" - force = 5 - selfcharge = 1 - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - -/obj/item/gun/energy/laser/mounted/dropped() - ..() +/obj/item/gun/energy/e_gun/advtaser/mounted + name = "mounted taser" + desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "taser" + item_state = "armcannonstun4" + force = 5 + selfcharge = 1 + can_flashlight = 0 + trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead + +/obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... + ..() + +/obj/item/gun/energy/laser/mounted + name = "mounted laser" + desc = "An arm mounted cannon that fires lethal lasers." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "laser" + item_state = "armcannonlase" + force = 5 + selfcharge = 1 + trigger_guard = TRIGGER_GUARD_ALLOW_ALL + +/obj/item/gun/energy/laser/mounted/dropped() + ..() diff --git a/code/modules/projectiles/guns/energy/plasma.dm b/code/modules/projectiles/guns/energy/plasma_cit.dm similarity index 100% rename from code/modules/projectiles/guns/energy/plasma.dm rename to code/modules/projectiles/guns/energy/plasma_cit.dm diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 3d9408bcca..93188dd073 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -49,6 +49,7 @@ modifystate = 1 ammo_x_offset = 1 selfcharge = 1 + harmful = FALSE /obj/item/gun/energy/meteorgun name = "meteor gun" diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 69f6a47813..d7b62879dd 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -5,6 +5,7 @@ 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 + harmful = FALSE /obj/item/gun/energy/tesla_revolver name = "tesla gun" @@ -22,6 +23,7 @@ icon_state = "advtaser" ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler) ammo_x_offset = 2 + harmful = FALSE /obj/item/gun/energy/e_gun/advtaser/cyborg name = "cyborg taser" @@ -29,6 +31,7 @@ can_flashlight = 0 can_charge = 0 use_cyborg_cell = 1 + harmful = FALSE /obj/item/gun/energy/disabler name = "disabler" @@ -37,10 +40,11 @@ item_state = null ammo_type = list(/obj/item/ammo_casing/energy/disabler) ammo_x_offset = 3 + harmful = FALSE /obj/item/gun/energy/disabler/cyborg name = "cyborg disabler" desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating." can_charge = 0 use_cyborg_cell = 1 - + harmful = FALSE diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index c268c15272..617de22baa 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -27,6 +27,7 @@ ammo_type = /obj/item/ammo_casing/magic/heal icon_state = "staffofhealing" item_state = "staffofhealing" + harmful = FALSE /obj/item/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves return @@ -59,6 +60,7 @@ max_charges = 10 recharge_rate = 2 no_den_usage = 1 + harmful = FALSE /obj/item/gun/magic/staff/honk name = "staff of the honkmother" @@ -69,6 +71,7 @@ item_state = "honker" max_charges = 4 recharge_rate = 8 + harmful = FALSE /obj/item/gun/magic/staff/spellblade name = "spellblade" diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index bf3ade0748..6d094c6ff7 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -8,6 +8,7 @@ can_charge = 0 max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths) var/variable_charges = 1 + harmful = FALSE /obj/item/gun/magic/wand/Initialize() if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges @@ -85,6 +86,7 @@ fire_sound = 'sound/magic/staff_healing.ogg' icon_state = "revivewand" max_charges = 10 //10, 5, 5, 4 + harmful = FALSE /obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user) user.revive(full_heal = 1) @@ -125,6 +127,7 @@ icon_state = "telewand" max_charges = 10 //10, 5, 5, 4 no_den_usage = 1 + harmful = FALSE /obj/item/gun/magic/wand/teleport/zap_self(mob/living/user) if(do_teleport(user, user, 10)) @@ -146,6 +149,7 @@ fire_sound = 'sound/magic/staff_door.ogg' max_charges = 20 //20, 10, 10, 7 no_den_usage = 1 + harmful = FALSE /obj/item/gun/magic/wand/door/zap_self(mob/living/user) to_chat(user, "You feel vaguely more open with your feelings.") diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm similarity index 97% rename from code/modules/projectiles/guns/beam_rifle.dm rename to code/modules/projectiles/guns/misc/beam_rifle.dm index a2365dfc13..59465eb989 100644 --- a/code/modules/projectiles/guns/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -1,590 +1,590 @@ - -#define ZOOM_LOCK_AUTOZOOM_FREEMOVE 0 -#define ZOOM_LOCK_AUTOZOOM_ANGLELOCK 1 -#define ZOOM_LOCK_CENTER_VIEW 2 -#define ZOOM_LOCK_OFF 3 - -#define AUTOZOOM_PIXEL_STEP_FACTOR 48 - -#define AIMING_BEAM_ANGLE_CHANGE_THRESHOLD 0.1 - -/obj/item/gun/energy/beam_rifle - name = "particle acceleration rifle" - desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targetted by one. \ - Hold down left click while scoped to aim, when weapon is fully aimed (Tracer goes from red to green as it charges), release to fire. Moving while aiming or \ - changing where you're pointing at while aiming will delay the aiming process depending on how much you changed." - icon = 'icons/obj/guns/energy.dmi' - icon_state = "esniper" - item_state = "esniper" - fire_sound = 'sound/weapons/beam_sniper.ogg' - slot_flags = SLOT_BACK - force = 15 - materials = list() - recoil = 4 - ammo_x_offset = 3 - ammo_y_offset = 3 - modifystate = FALSE - weapon_weight = WEAPON_HEAVY - w_class = WEIGHT_CLASS_BULKY - ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan) - cell_type = /obj/item/stock_parts/cell/beam_rifle - canMouseDown = TRUE - pin = null - var/aiming = FALSE - var/aiming_time = 12 - var/aiming_time_fire_threshold = 5 - var/aiming_time_left = 12 - var/aiming_time_increase_user_movement = 3 - var/scoped_slow = 1 - var/aiming_time_increase_angle_multiplier = 0.3 - var/last_process = 0 - - var/lastangle = 0 - var/aiming_lastangle = 0 - var/mob/current_user = null - var/list/obj/effect/projectile/tracer/current_tracers - - var/structure_piercing = 2 //Amount * 2. For some reason structures aren't respecting this unless you have it doubled. Probably with the objects in question's Bump() code instead of this but I'll deal with this later. - var/structure_bleed_coeff = 0.7 - var/wall_pierce_amount = 0 - var/wall_devastate = 0 - var/aoe_structure_range = 1 - var/aoe_structure_damage = 50 - var/aoe_fire_range = 2 - var/aoe_fire_chance = 40 - var/aoe_mob_range = 1 - var/aoe_mob_damage = 30 - var/impact_structure_damage = 60 - var/projectile_damage = 30 - var/projectile_stun = 0 - var/projectile_setting_pierce = TRUE - var/delay = 65 - var/lastfire = 0 - - //ZOOMING - var/zoom_current_view_increase = 0 - var/zoom_target_view_increase = 10 - var/zooming = FALSE - var/zoom_lock = ZOOM_LOCK_OFF - var/zooming_angle - var/current_zoom_x = 0 - var/current_zoom_y = 0 - var/zoom_animating = 0 - - var/static/image/charged_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_charged") - var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty") - - var/datum/action/item_action/zoom_lock_action/zoom_lock_action - var/datum/component/mobhook - -/obj/item/gun/energy/beam_rifle/debug - delay = 0 - cell_type = /obj/item/stock_parts/cell/infinite - aiming_time = 0 - recoil = 0 - pin = /obj/item/device/firing_pin - -/obj/item/gun/energy/beam_rifle/equipped(mob/user) - set_user(user) - . = ..() - -/obj/item/gun/energy/beam_rifle/pickup(mob/user) - set_user(user) - . = ..() - -/obj/item/gun/energy/beam_rifle/dropped(mob/user) - set_user() - . = ..() - -/obj/item/gun/energy/beam_rifle/ui_action_click(owner, action) - if(istype(action, /datum/action/item_action/zoom_lock_action)) - zoom_lock++ - if(zoom_lock > 3) - zoom_lock = 0 - switch(zoom_lock) - if(ZOOM_LOCK_AUTOZOOM_FREEMOVE) - to_chat(owner, "You switch [src]'s zooming processor to free directional.") - if(ZOOM_LOCK_AUTOZOOM_ANGLELOCK) - to_chat(owner, "You switch [src]'s zooming processor to locked directional.") - if(ZOOM_LOCK_CENTER_VIEW) - to_chat(owner, "You switch [src]'s zooming processor to center mode.") - if(ZOOM_LOCK_OFF) - to_chat(owner, "You disable [src]'s zooming system.") - reset_zooming() - -/obj/item/gun/energy/beam_rifle/proc/smooth_zooming(delay_override = null) - if(!check_user() || !zooming || zoom_lock == ZOOM_LOCK_OFF || zoom_lock == ZOOM_LOCK_CENTER_VIEW) - return - if(zoom_animating && delay_override != 0) - return smooth_zooming(zoom_animating + delay_override) //Automatically compensate for ongoing zooming actions. - var/total_time = SSfastprocess.wait - if(delay_override) - total_time = delay_override - zoom_animating = total_time - animate(current_user.client, pixel_x = current_zoom_x, pixel_y = current_zoom_y , total_time, SINE_EASING, ANIMATION_PARALLEL) - zoom_animating = 0 - -/obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle) - if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF) - return - current_zoom_x = sin(current_angle) + sin(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase - current_zoom_y = cos(current_angle) + cos(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase - -/obj/item/gun/energy/beam_rifle/proc/handle_zooming() - if(!zooming || !check_user()) - return - current_user.client.change_view(world.view + zoom_target_view_increase) - zoom_current_view_increase = zoom_target_view_increase - set_autozoom_pixel_offsets_immediate(zooming_angle) - smooth_zooming() - -/obj/item/gun/energy/beam_rifle/proc/start_zooming() - if(zoom_lock == ZOOM_LOCK_OFF) - return - zooming = TRUE - -/obj/item/gun/energy/beam_rifle/proc/stop_zooming(mob/user) - if(zooming) - zooming = FALSE - reset_zooming(user) - -/obj/item/gun/energy/beam_rifle/proc/reset_zooming(mob/user) - if(!user) - user = current_user - if(!user || !user.client) - return FALSE - zoom_animating = 0 - animate(user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW) - zoom_current_view_increase = 0 - user.client.change_view(CONFIG_GET(string/default_view)) - zooming_angle = 0 - current_zoom_x = 0 - current_zoom_y = 0 - -/obj/item/gun/energy/beam_rifle/update_icon() - cut_overlays() - var/obj/item/ammo_casing/energy/primary_ammo = ammo_type[1] - if(cell.charge > primary_ammo.e_cost) - add_overlay(charged_overlay) - else - add_overlay(drained_overlay) - -/obj/item/gun/energy/beam_rifle/attack_self(mob/user) - projectile_setting_pierce = !projectile_setting_pierce - to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.") - aiming_beam() - -/obj/item/gun/energy/beam_rifle/proc/update_slowdown() - if(aiming) - slowdown = scoped_slow - else - slowdown = initial(slowdown) - -/obj/item/gun/energy/beam_rifle/Initialize() - . = ..() - current_tracers = list() - START_PROCESSING(SSprojectiles, src) - zoom_lock_action = new(src) - -/obj/item/gun/energy/beam_rifle/Destroy() - STOP_PROCESSING(SSfastprocess, src) - set_user(null) - QDEL_LIST(current_tracers) - QDEL_NULL(mobhook) - return ..() - -/obj/item/gun/energy/beam_rifle/emp_act(severity) - chambered = null - recharge_newshot() - -/obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE) - var/diff = abs(aiming_lastangle - lastangle) - check_user() - if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update) - return - aiming_lastangle = lastangle - var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new - P.gun = src - P.wall_pierce_amount = wall_pierce_amount - P.structure_pierce_amount = structure_piercing - P.do_pierce = projectile_setting_pierce - if(aiming_time) - var/percent = ((100/aiming_time)*aiming_time_left) - P.color = rgb(255 * percent,255 * ((100 - percent) / 100),0) - else - P.color = rgb(0, 255, 0) - var/turf/curloc = get_turf(src) - var/turf/targloc = get_turf(current_user.client.mouseObject) - if(!istype(targloc)) - if(!istype(curloc)) - return - targloc = get_turf_in_angle(lastangle, curloc, 10) - P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0) - P.fire(lastangle) - -/obj/item/gun/energy/beam_rifle/process() - if(!aiming) - last_process = world.time - return - check_user() - handle_zooming() - aiming_time_left = max(0, aiming_time_left - (world.time - last_process)) - aiming_beam(TRUE) - last_process = world.time - -/obj/item/gun/energy/beam_rifle/proc/check_user(automatic_cleanup = TRUE) - if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it! - if(automatic_cleanup) - stop_aiming() - set_user(null) - return FALSE - return TRUE - -/obj/item/gun/energy/beam_rifle/proc/process_aim() - if(istype(current_user) && current_user.client && current_user.client.mouseParams) - var/angle = mouse_angle_from_client(current_user.client) - switch(angle) - if(316 to 360) - current_user.setDir(NORTH) - if(0 to 45) - current_user.setDir(NORTH) - if(46 to 135) - current_user.setDir(EAST) - if(136 to 225) - current_user.setDir(SOUTH) - if(226 to 315) - current_user.setDir(WEST) - var/difference = abs(lastangle - angle) - if(difference > 350) //Too lazy to properly math, detects 360 --> 0 changes. - difference = (lastangle > 350? ((360 - lastangle) + angle) : ((360 - angle) + lastangle)) - delay_penalty(difference * aiming_time_increase_angle_multiplier) - lastangle = angle - -/obj/item/gun/energy/beam_rifle/proc/on_mob_move() - check_user() - if(aiming) - delay_penalty(aiming_time_increase_user_movement) - process_aim() - aiming_beam(TRUE) - -/obj/item/gun/energy/beam_rifle/proc/start_aiming() - aiming_time_left = aiming_time - aiming = TRUE - process_aim() - aiming_beam(TRUE) - zooming_angle = lastangle - start_zooming() - -/obj/item/gun/energy/beam_rifle/proc/stop_aiming(mob/user) - set waitfor = FALSE - aiming_time_left = aiming_time - aiming = FALSE - QDEL_LIST(current_tracers) - stop_zooming(user) - -/obj/item/gun/energy/beam_rifle/proc/set_user(mob/user) - if(user == current_user) - return - stop_aiming(current_user) - QDEL_NULL(mobhook) - if(istype(current_user)) - LAZYREMOVE(current_user.mousemove_intercept_objects, src) - current_user = null - if(istype(user)) - current_user = user - LAZYADD(current_user.mousemove_intercept_objects, src) - mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move)) - -/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) - if(aiming) - process_aim() - aiming_beam() - if(zoom_lock == ZOOM_LOCK_AUTOZOOM_FREEMOVE) - zooming_angle = lastangle - set_autozoom_pixel_offsets_immediate(zooming_angle) - smooth_zooming(2) - return ..() - -/obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob) - if(istype(mob)) - set_user(mob) - if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) - return - if((object in mob.contents) || (object == mob)) - return - start_aiming() - return ..() - -/obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M) - if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) - return - process_aim() - if(aiming_time_left <= aiming_time_fire_threshold && check_user()) - sync_ammo() - afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE) - stop_aiming() - QDEL_LIST(current_tracers) - return ..() - -/obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) - if(flag) //It's adjacent, is the user, or is on the user's person - if(target in user.contents) //can't shoot stuff inside us. - return - if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack - return - if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected) - return - if(!passthrough && (aiming_time > aiming_time_fire_threshold)) - return - if(lastfire > world.time + delay) - return - lastfire = world.time - . = ..() - stop_aiming() - -/obj/item/gun/energy/beam_rifle/proc/sync_ammo() - for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents) - AC.sync_stats() - -/obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount) - aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time) - -/obj/item/ammo_casing/energy/beam_rifle - name = "particle acceleration lens" - desc = "Don't look into barrel!" - var/wall_pierce_amount = 0 - var/wall_devastate = 0 - var/aoe_structure_range = 1 - var/aoe_structure_damage = 30 - var/aoe_fire_range = 2 - var/aoe_fire_chance = 66 - var/aoe_mob_range = 1 - var/aoe_mob_damage = 20 - var/impact_structure_damage = 50 - var/projectile_damage = 40 - var/projectile_stun = 0 - var/structure_piercing = 2 - var/structure_bleed_coeff = 0.7 - var/do_pierce = TRUE - var/obj/item/gun/energy/beam_rifle/host - -/obj/item/ammo_casing/energy/beam_rifle/proc/sync_stats() - var/obj/item/gun/energy/beam_rifle/BR = loc - if(!istype(BR)) - stack_trace("Beam rifle syncing error") - host = BR - do_pierce = BR.projectile_setting_pierce - wall_pierce_amount = BR.wall_pierce_amount - wall_devastate = BR.wall_devastate - aoe_structure_range = BR.aoe_structure_range - aoe_structure_damage = BR.aoe_structure_damage - aoe_fire_range = BR.aoe_fire_range - aoe_fire_chance = BR.aoe_fire_chance - aoe_mob_range = BR.aoe_mob_range - aoe_mob_damage = BR.aoe_mob_damage - impact_structure_damage = BR.impact_structure_damage - projectile_damage = BR.projectile_damage - projectile_stun = BR.projectile_stun - delay = BR.delay - structure_piercing = BR.structure_piercing - structure_bleed_coeff = BR.structure_bleed_coeff - -/obj/item/ammo_casing/energy/beam_rifle/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - . = ..() - var/obj/item/projectile/beam/beam_rifle/hitscan/HS_BB = BB - if(!istype(HS_BB)) - return - HS_BB.impact_direct_damage = projectile_damage - HS_BB.stun = projectile_stun - HS_BB.impact_structure_damage = impact_structure_damage - HS_BB.aoe_mob_damage = aoe_mob_damage - HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock - HS_BB.aoe_fire_chance = aoe_fire_chance - HS_BB.aoe_fire_range = aoe_fire_range - HS_BB.aoe_structure_damage = aoe_structure_damage - HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock - HS_BB.wall_devastate = wall_devastate - HS_BB.wall_pierce_amount = wall_pierce_amount - HS_BB.structure_pierce_amount = structure_piercing - HS_BB.structure_bleed_coeff = structure_bleed_coeff - HS_BB.do_pierce = do_pierce - HS_BB.gun = host - -/obj/item/ammo_casing/energy/beam_rifle/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread) - var/turf/curloc = get_turf(user) - if(!istype(curloc) || !BB) - return FALSE - var/obj/item/gun/energy/beam_rifle/gun = loc - if(!targloc && gun) - targloc = get_turf_in_angle(gun.lastangle, curloc, 10) - else if(!targloc) - return FALSE - var/firing_dir - if(BB.firer) - firing_dir = BB.firer.dir - if(!BB.suppressed && firing_effect_type) - new firing_effect_type(get_turf(src), firing_dir) - BB.preparePixelProjectile(target, user, params, spread) - BB.fire(gun? gun.lastangle : null, null) - BB = null - return TRUE - -/obj/item/ammo_casing/energy/beam_rifle/hitscan - projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan - select_name = "beam" - e_cost = 5000 - fire_sound = 'sound/weapons/beam_sniper.ogg' - -/obj/item/projectile/beam/beam_rifle - name = "particle beam" - icon = "" - hitsound = 'sound/effects/explosion3.ogg' - damage = 0 //Handled manually. - damage_type = BURN - flag = "energy" - range = 150 - jitter = 10 - var/obj/item/gun/energy/beam_rifle/gun - var/structure_pierce_amount = 0 //All set to 0 so the gun can manually set them during firing. - var/structure_bleed_coeff = 0 - var/structure_pierce = 0 - var/do_pierce = TRUE - var/wall_pierce_amount = 0 - var/wall_pierce = 0 - var/wall_devastate = 0 - var/aoe_structure_range = 0 - var/aoe_structure_damage = 0 - var/aoe_fire_range = 0 - var/aoe_fire_chance = 0 - var/aoe_mob_range = 0 - var/aoe_mob_damage = 0 - var/impact_structure_damage = 0 - var/impact_direct_damage = 0 - var/turf/cached - var/list/pierced = list() - -/obj/item/projectile/beam/beam_rifle/proc/AOE(turf/epicenter) - set waitfor = FALSE - if(!epicenter) - return - new /obj/effect/temp_visual/explosion/fast(epicenter) - for(var/mob/living/L in range(aoe_mob_range, epicenter)) //handle aoe mob damage - L.adjustFireLoss(aoe_mob_damage) - to_chat(L, "\The [src] sears you!") - for(var/turf/T in range(aoe_fire_range, epicenter)) //handle aoe fire - if(prob(aoe_fire_chance)) - new /obj/effect/hotspot(T) - for(var/obj/O in range(aoe_structure_range, epicenter)) - if(!isitem(O)) - if(O.level == 1) //Please don't break underfloor items! - continue - O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE) - -/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target) - if(!do_pierce) - return FALSE - if(pierced[target]) //we already pierced them go away - return TRUE - if(isclosedturf(target)) - if(wall_pierce++ < wall_pierce_amount) - if(prob(wall_devastate)) - if(iswallturf(target)) - var/turf/closed/wall/W = target - W.dismantle_wall(TRUE, TRUE) - else - target.ex_act(EXPLODE_HEAVY) - return TRUE - if(ismovableatom(target)) - var/atom/movable/AM = target - if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM)) - if(structure_pierce < structure_pierce_amount) - if(isobj(AM)) - var/obj/O = AM - O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE) - pierced[AM] = TRUE - structure_pierce++ - return TRUE - return FALSE - -/obj/item/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target) - if(istype(target, /obj/machinery/door)) - return 0.4 - if(istype(target, /obj/structure/window)) - return 0.5 - return 1 - -/obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target) - if(isobj(target)) - var/obj/O = target - O.take_damage(impact_structure_damage * get_damage_coeff(target), BURN, "laser", FALSE) - if(isliving(target)) - var/mob/living/L = target - L.adjustFireLoss(impact_direct_damage) - L.emote("scream") - -/obj/item/projectile/beam/beam_rifle/proc/handle_hit(atom/target) - set waitfor = FALSE - if(!cached && !QDELETED(target)) - cached = get_turf(target) - if(nodamage) - return FALSE - playsound(cached, 'sound/effects/explosion3.ogg', 100, 1) - AOE(cached) - if(!QDELETED(target)) - handle_impact(target) - -/obj/item/projectile/beam/beam_rifle/Collide(atom/target) - if(check_pierce(target)) - permutated += target - trajectory_ignore_forcemove = TRUE - forceMove(target) - trajectory_ignore_forcemove = FALSE - return FALSE - if(!QDELETED(target)) - cached = get_turf(target) - . = ..() - -/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE) - if(!QDELETED(target)) - cached = get_turf(target) - handle_hit(target) - . = ..() - -/obj/item/projectile/beam/beam_rifle/hitscan - icon_state = "" - hitscan = TRUE - tracer_type = /obj/effect/projectile/tracer/tracer/beam_rifle - var/constant_tracer = FALSE - -/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, highlander) - set waitfor = FALSE - if(isnull(highlander)) - highlander = constant_tracer - if(highlander && istype(gun)) - QDEL_LIST(gun.current_tracers) - for(var/datum/point/p in beam_segments) - gun.current_tracers += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, 0) - else - for(var/datum/point/p in beam_segments) - generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration) - if(cleanup) - QDEL_LIST(beam_segments) - beam_segments = null - QDEL_NULL(beam_index) - -/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam - tracer_type = /obj/effect/projectile/tracer/tracer/aiming - name = "aiming beam" - hitsound = null - hitsound_wall = null - nodamage = TRUE - damage = 0 - constant_tracer = TRUE - -/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target) - qdel(src) - return FALSE - -/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() - qdel(src) - return FALSE + +#define ZOOM_LOCK_AUTOZOOM_FREEMOVE 0 +#define ZOOM_LOCK_AUTOZOOM_ANGLELOCK 1 +#define ZOOM_LOCK_CENTER_VIEW 2 +#define ZOOM_LOCK_OFF 3 + +#define AUTOZOOM_PIXEL_STEP_FACTOR 48 + +#define AIMING_BEAM_ANGLE_CHANGE_THRESHOLD 0.1 + +/obj/item/gun/energy/beam_rifle + name = "particle acceleration rifle" + desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targetted by one. \ + Hold down left click while scoped to aim, when weapon is fully aimed (Tracer goes from red to green as it charges), release to fire. Moving while aiming or \ + changing where you're pointing at while aiming will delay the aiming process depending on how much you changed." + icon = 'icons/obj/guns/energy.dmi' + icon_state = "esniper" + item_state = "esniper" + fire_sound = 'sound/weapons/beam_sniper.ogg' + slot_flags = SLOT_BACK + force = 15 + materials = list() + recoil = 4 + ammo_x_offset = 3 + ammo_y_offset = 3 + modifystate = FALSE + weapon_weight = WEAPON_HEAVY + w_class = WEIGHT_CLASS_BULKY + ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan) + cell_type = /obj/item/stock_parts/cell/beam_rifle + canMouseDown = TRUE + pin = null + var/aiming = FALSE + var/aiming_time = 12 + var/aiming_time_fire_threshold = 5 + var/aiming_time_left = 12 + var/aiming_time_increase_user_movement = 3 + var/scoped_slow = 1 + var/aiming_time_increase_angle_multiplier = 0.3 + var/last_process = 0 + + var/lastangle = 0 + var/aiming_lastangle = 0 + var/mob/current_user = null + var/list/obj/effect/projectile/tracer/current_tracers + + var/structure_piercing = 2 //Amount * 2. For some reason structures aren't respecting this unless you have it doubled. Probably with the objects in question's Bump() code instead of this but I'll deal with this later. + var/structure_bleed_coeff = 0.7 + var/wall_pierce_amount = 0 + var/wall_devastate = 0 + var/aoe_structure_range = 1 + var/aoe_structure_damage = 50 + var/aoe_fire_range = 2 + var/aoe_fire_chance = 40 + var/aoe_mob_range = 1 + var/aoe_mob_damage = 30 + var/impact_structure_damage = 60 + var/projectile_damage = 30 + var/projectile_stun = 0 + var/projectile_setting_pierce = TRUE + var/delay = 65 + var/lastfire = 0 + + //ZOOMING + var/zoom_current_view_increase = 0 + var/zoom_target_view_increase = 10 + var/zooming = FALSE + var/zoom_lock = ZOOM_LOCK_OFF + var/zooming_angle + var/current_zoom_x = 0 + var/current_zoom_y = 0 + var/zoom_animating = 0 + + var/static/image/charged_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_charged") + var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty") + + var/datum/action/item_action/zoom_lock_action/zoom_lock_action + var/datum/component/mobhook + +/obj/item/gun/energy/beam_rifle/debug + delay = 0 + cell_type = /obj/item/stock_parts/cell/infinite + aiming_time = 0 + recoil = 0 + pin = /obj/item/device/firing_pin + +/obj/item/gun/energy/beam_rifle/equipped(mob/user) + set_user(user) + . = ..() + +/obj/item/gun/energy/beam_rifle/pickup(mob/user) + set_user(user) + . = ..() + +/obj/item/gun/energy/beam_rifle/dropped(mob/user) + set_user() + . = ..() + +/obj/item/gun/energy/beam_rifle/ui_action_click(owner, action) + if(istype(action, /datum/action/item_action/zoom_lock_action)) + zoom_lock++ + if(zoom_lock > 3) + zoom_lock = 0 + switch(zoom_lock) + if(ZOOM_LOCK_AUTOZOOM_FREEMOVE) + to_chat(owner, "You switch [src]'s zooming processor to free directional.") + if(ZOOM_LOCK_AUTOZOOM_ANGLELOCK) + to_chat(owner, "You switch [src]'s zooming processor to locked directional.") + if(ZOOM_LOCK_CENTER_VIEW) + to_chat(owner, "You switch [src]'s zooming processor to center mode.") + if(ZOOM_LOCK_OFF) + to_chat(owner, "You disable [src]'s zooming system.") + reset_zooming() + +/obj/item/gun/energy/beam_rifle/proc/smooth_zooming(delay_override = null) + if(!check_user() || !zooming || zoom_lock == ZOOM_LOCK_OFF || zoom_lock == ZOOM_LOCK_CENTER_VIEW) + return + if(zoom_animating && delay_override != 0) + return smooth_zooming(zoom_animating + delay_override) //Automatically compensate for ongoing zooming actions. + var/total_time = SSfastprocess.wait + if(delay_override) + total_time = delay_override + zoom_animating = total_time + animate(current_user.client, pixel_x = current_zoom_x, pixel_y = current_zoom_y , total_time, SINE_EASING, ANIMATION_PARALLEL) + zoom_animating = 0 + +/obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle) + if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF) + return + current_zoom_x = sin(current_angle) + sin(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase + current_zoom_y = cos(current_angle) + cos(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase + +/obj/item/gun/energy/beam_rifle/proc/handle_zooming() + if(!zooming || !check_user()) + return + current_user.client.change_view(world.view + zoom_target_view_increase) + zoom_current_view_increase = zoom_target_view_increase + set_autozoom_pixel_offsets_immediate(zooming_angle) + smooth_zooming() + +/obj/item/gun/energy/beam_rifle/proc/start_zooming() + if(zoom_lock == ZOOM_LOCK_OFF) + return + zooming = TRUE + +/obj/item/gun/energy/beam_rifle/proc/stop_zooming(mob/user) + if(zooming) + zooming = FALSE + reset_zooming(user) + +/obj/item/gun/energy/beam_rifle/proc/reset_zooming(mob/user) + if(!user) + user = current_user + if(!user || !user.client) + return FALSE + zoom_animating = 0 + animate(user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW) + zoom_current_view_increase = 0 + user.client.change_view(CONFIG_GET(string/default_view)) + zooming_angle = 0 + current_zoom_x = 0 + current_zoom_y = 0 + +/obj/item/gun/energy/beam_rifle/update_icon() + cut_overlays() + var/obj/item/ammo_casing/energy/primary_ammo = ammo_type[1] + if(cell.charge > primary_ammo.e_cost) + add_overlay(charged_overlay) + else + add_overlay(drained_overlay) + +/obj/item/gun/energy/beam_rifle/attack_self(mob/user) + projectile_setting_pierce = !projectile_setting_pierce + to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.") + aiming_beam() + +/obj/item/gun/energy/beam_rifle/proc/update_slowdown() + if(aiming) + slowdown = scoped_slow + else + slowdown = initial(slowdown) + +/obj/item/gun/energy/beam_rifle/Initialize() + . = ..() + current_tracers = list() + START_PROCESSING(SSprojectiles, src) + zoom_lock_action = new(src) + +/obj/item/gun/energy/beam_rifle/Destroy() + STOP_PROCESSING(SSfastprocess, src) + set_user(null) + QDEL_LIST(current_tracers) + QDEL_NULL(mobhook) + return ..() + +/obj/item/gun/energy/beam_rifle/emp_act(severity) + chambered = null + recharge_newshot() + +/obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE) + var/diff = abs(aiming_lastangle - lastangle) + check_user() + if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update) + return + aiming_lastangle = lastangle + var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new + P.gun = src + P.wall_pierce_amount = wall_pierce_amount + P.structure_pierce_amount = structure_piercing + P.do_pierce = projectile_setting_pierce + if(aiming_time) + var/percent = ((100/aiming_time)*aiming_time_left) + P.color = rgb(255 * percent,255 * ((100 - percent) / 100),0) + else + P.color = rgb(0, 255, 0) + var/turf/curloc = get_turf(src) + var/turf/targloc = get_turf(current_user.client.mouseObject) + if(!istype(targloc)) + if(!istype(curloc)) + return + targloc = get_turf_in_angle(lastangle, curloc, 10) + P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0) + P.fire(lastangle) + +/obj/item/gun/energy/beam_rifle/process() + if(!aiming) + last_process = world.time + return + check_user() + handle_zooming() + aiming_time_left = max(0, aiming_time_left - (world.time - last_process)) + aiming_beam(TRUE) + last_process = world.time + +/obj/item/gun/energy/beam_rifle/proc/check_user(automatic_cleanup = TRUE) + if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it! + if(automatic_cleanup) + stop_aiming() + set_user(null) + return FALSE + return TRUE + +/obj/item/gun/energy/beam_rifle/proc/process_aim() + if(istype(current_user) && current_user.client && current_user.client.mouseParams) + var/angle = mouse_angle_from_client(current_user.client) + switch(angle) + if(316 to 360) + current_user.setDir(NORTH) + if(0 to 45) + current_user.setDir(NORTH) + if(46 to 135) + current_user.setDir(EAST) + if(136 to 225) + current_user.setDir(SOUTH) + if(226 to 315) + current_user.setDir(WEST) + var/difference = abs(lastangle - angle) + if(difference > 350) //Too lazy to properly math, detects 360 --> 0 changes. + difference = (lastangle > 350? ((360 - lastangle) + angle) : ((360 - angle) + lastangle)) + delay_penalty(difference * aiming_time_increase_angle_multiplier) + lastangle = angle + +/obj/item/gun/energy/beam_rifle/proc/on_mob_move() + check_user() + if(aiming) + delay_penalty(aiming_time_increase_user_movement) + process_aim() + aiming_beam(TRUE) + +/obj/item/gun/energy/beam_rifle/proc/start_aiming() + aiming_time_left = aiming_time + aiming = TRUE + process_aim() + aiming_beam(TRUE) + zooming_angle = lastangle + start_zooming() + +/obj/item/gun/energy/beam_rifle/proc/stop_aiming(mob/user) + set waitfor = FALSE + aiming_time_left = aiming_time + aiming = FALSE + QDEL_LIST(current_tracers) + stop_zooming(user) + +/obj/item/gun/energy/beam_rifle/proc/set_user(mob/user) + if(user == current_user) + return + stop_aiming(current_user) + QDEL_NULL(mobhook) + if(istype(current_user)) + LAZYREMOVE(current_user.mousemove_intercept_objects, src) + current_user = null + if(istype(user)) + current_user = user + LAZYADD(current_user.mousemove_intercept_objects, src) + mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move)) + +/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) + if(aiming) + process_aim() + aiming_beam() + if(zoom_lock == ZOOM_LOCK_AUTOZOOM_FREEMOVE) + zooming_angle = lastangle + set_autozoom_pixel_offsets_immediate(zooming_angle) + smooth_zooming(2) + return ..() + +/obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob) + if(istype(mob)) + set_user(mob) + if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) + return + if((object in mob.contents) || (object == mob)) + return + start_aiming() + return ..() + +/obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M) + if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) + return + process_aim() + if(aiming_time_left <= aiming_time_fire_threshold && check_user()) + sync_ammo() + afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE) + stop_aiming() + QDEL_LIST(current_tracers) + return ..() + +/obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) + if(flag) //It's adjacent, is the user, or is on the user's person + if(target in user.contents) //can't shoot stuff inside us. + return + if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack + return + if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected) + return + if(!passthrough && (aiming_time > aiming_time_fire_threshold)) + return + if(lastfire > world.time + delay) + return + lastfire = world.time + . = ..() + stop_aiming() + +/obj/item/gun/energy/beam_rifle/proc/sync_ammo() + for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents) + AC.sync_stats() + +/obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount) + aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time) + +/obj/item/ammo_casing/energy/beam_rifle + name = "particle acceleration lens" + desc = "Don't look into barrel!" + var/wall_pierce_amount = 0 + var/wall_devastate = 0 + var/aoe_structure_range = 1 + var/aoe_structure_damage = 30 + var/aoe_fire_range = 2 + var/aoe_fire_chance = 66 + var/aoe_mob_range = 1 + var/aoe_mob_damage = 20 + var/impact_structure_damage = 50 + var/projectile_damage = 40 + var/projectile_stun = 0 + var/structure_piercing = 2 + var/structure_bleed_coeff = 0.7 + var/do_pierce = TRUE + var/obj/item/gun/energy/beam_rifle/host + +/obj/item/ammo_casing/energy/beam_rifle/proc/sync_stats() + var/obj/item/gun/energy/beam_rifle/BR = loc + if(!istype(BR)) + stack_trace("Beam rifle syncing error") + host = BR + do_pierce = BR.projectile_setting_pierce + wall_pierce_amount = BR.wall_pierce_amount + wall_devastate = BR.wall_devastate + aoe_structure_range = BR.aoe_structure_range + aoe_structure_damage = BR.aoe_structure_damage + aoe_fire_range = BR.aoe_fire_range + aoe_fire_chance = BR.aoe_fire_chance + aoe_mob_range = BR.aoe_mob_range + aoe_mob_damage = BR.aoe_mob_damage + impact_structure_damage = BR.impact_structure_damage + projectile_damage = BR.projectile_damage + projectile_stun = BR.projectile_stun + delay = BR.delay + structure_piercing = BR.structure_piercing + structure_bleed_coeff = BR.structure_bleed_coeff + +/obj/item/ammo_casing/energy/beam_rifle/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + . = ..() + var/obj/item/projectile/beam/beam_rifle/hitscan/HS_BB = BB + if(!istype(HS_BB)) + return + HS_BB.impact_direct_damage = projectile_damage + HS_BB.stun = projectile_stun + HS_BB.impact_structure_damage = impact_structure_damage + HS_BB.aoe_mob_damage = aoe_mob_damage + HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock + HS_BB.aoe_fire_chance = aoe_fire_chance + HS_BB.aoe_fire_range = aoe_fire_range + HS_BB.aoe_structure_damage = aoe_structure_damage + HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock + HS_BB.wall_devastate = wall_devastate + HS_BB.wall_pierce_amount = wall_pierce_amount + HS_BB.structure_pierce_amount = structure_piercing + HS_BB.structure_bleed_coeff = structure_bleed_coeff + HS_BB.do_pierce = do_pierce + HS_BB.gun = host + +/obj/item/ammo_casing/energy/beam_rifle/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread) + var/turf/curloc = get_turf(user) + if(!istype(curloc) || !BB) + return FALSE + var/obj/item/gun/energy/beam_rifle/gun = loc + if(!targloc && gun) + targloc = get_turf_in_angle(gun.lastangle, curloc, 10) + else if(!targloc) + return FALSE + var/firing_dir + if(BB.firer) + firing_dir = BB.firer.dir + if(!BB.suppressed && firing_effect_type) + new firing_effect_type(get_turf(src), firing_dir) + BB.preparePixelProjectile(target, user, params, spread) + BB.fire(gun? gun.lastangle : null, null) + BB = null + return TRUE + +/obj/item/ammo_casing/energy/beam_rifle/hitscan + projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan + select_name = "beam" + e_cost = 5000 + fire_sound = 'sound/weapons/beam_sniper.ogg' + +/obj/item/projectile/beam/beam_rifle + name = "particle beam" + icon = "" + hitsound = 'sound/effects/explosion3.ogg' + damage = 0 //Handled manually. + damage_type = BURN + flag = "energy" + range = 150 + jitter = 10 + var/obj/item/gun/energy/beam_rifle/gun + var/structure_pierce_amount = 0 //All set to 0 so the gun can manually set them during firing. + var/structure_bleed_coeff = 0 + var/structure_pierce = 0 + var/do_pierce = TRUE + var/wall_pierce_amount = 0 + var/wall_pierce = 0 + var/wall_devastate = 0 + var/aoe_structure_range = 0 + var/aoe_structure_damage = 0 + var/aoe_fire_range = 0 + var/aoe_fire_chance = 0 + var/aoe_mob_range = 0 + var/aoe_mob_damage = 0 + var/impact_structure_damage = 0 + var/impact_direct_damage = 0 + var/turf/cached + var/list/pierced = list() + +/obj/item/projectile/beam/beam_rifle/proc/AOE(turf/epicenter) + set waitfor = FALSE + if(!epicenter) + return + new /obj/effect/temp_visual/explosion/fast(epicenter) + for(var/mob/living/L in range(aoe_mob_range, epicenter)) //handle aoe mob damage + L.adjustFireLoss(aoe_mob_damage) + to_chat(L, "\The [src] sears you!") + for(var/turf/T in range(aoe_fire_range, epicenter)) //handle aoe fire + if(prob(aoe_fire_chance)) + new /obj/effect/hotspot(T) + for(var/obj/O in range(aoe_structure_range, epicenter)) + if(!isitem(O)) + if(O.level == 1) //Please don't break underfloor items! + continue + O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE) + +/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target) + if(!do_pierce) + return FALSE + if(pierced[target]) //we already pierced them go away + return TRUE + if(isclosedturf(target)) + if(wall_pierce++ < wall_pierce_amount) + if(prob(wall_devastate)) + if(iswallturf(target)) + var/turf/closed/wall/W = target + W.dismantle_wall(TRUE, TRUE) + else + target.ex_act(EXPLODE_HEAVY) + return TRUE + if(ismovableatom(target)) + var/atom/movable/AM = target + if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM)) + if(structure_pierce < structure_pierce_amount) + if(isobj(AM)) + var/obj/O = AM + O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE) + pierced[AM] = TRUE + structure_pierce++ + return TRUE + return FALSE + +/obj/item/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target) + if(istype(target, /obj/machinery/door)) + return 0.4 + if(istype(target, /obj/structure/window)) + return 0.5 + return 1 + +/obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target) + if(isobj(target)) + var/obj/O = target + O.take_damage(impact_structure_damage * get_damage_coeff(target), BURN, "laser", FALSE) + if(isliving(target)) + var/mob/living/L = target + L.adjustFireLoss(impact_direct_damage) + L.emote("scream") + +/obj/item/projectile/beam/beam_rifle/proc/handle_hit(atom/target) + set waitfor = FALSE + if(!cached && !QDELETED(target)) + cached = get_turf(target) + if(nodamage) + return FALSE + playsound(cached, 'sound/effects/explosion3.ogg', 100, 1) + AOE(cached) + if(!QDELETED(target)) + handle_impact(target) + +/obj/item/projectile/beam/beam_rifle/Collide(atom/target) + if(check_pierce(target)) + permutated += target + trajectory_ignore_forcemove = TRUE + forceMove(target) + trajectory_ignore_forcemove = FALSE + return FALSE + if(!QDELETED(target)) + cached = get_turf(target) + . = ..() + +/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE) + if(!QDELETED(target)) + cached = get_turf(target) + handle_hit(target) + . = ..() + +/obj/item/projectile/beam/beam_rifle/hitscan + icon_state = "" + hitscan = TRUE + tracer_type = /obj/effect/projectile/tracer/tracer/beam_rifle + var/constant_tracer = FALSE + +/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, highlander) + set waitfor = FALSE + if(isnull(highlander)) + highlander = constant_tracer + if(highlander && istype(gun)) + QDEL_LIST(gun.current_tracers) + for(var/datum/point/p in beam_segments) + gun.current_tracers += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, 0) + else + for(var/datum/point/p in beam_segments) + generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration) + if(cleanup) + QDEL_LIST(beam_segments) + beam_segments = null + QDEL_NULL(beam_index) + +/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam + tracer_type = /obj/effect/projectile/tracer/tracer/aiming + name = "aiming beam" + hitsound = null + hitsound_wall = null + nodamage = TRUE + damage = 0 + constant_tracer = TRUE + +/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target) + qdel(src) + return FALSE + +/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() + qdel(src) + return FALSE diff --git a/code/modules/projectiles/guns/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm similarity index 95% rename from code/modules/projectiles/guns/chem_gun.dm rename to code/modules/projectiles/guns/misc/chem_gun.dm index b928abafef..17e3bd1876 100644 --- a/code/modules/projectiles/guns/chem_gun.dm +++ b/code/modules/projectiles/guns/misc/chem_gun.dm @@ -1,47 +1,47 @@ -//his isn't a subtype of the syringe gun because the syringegun subtype is made to hold syringes -//this is meant to hold reagents/obj/item/gun/syringe -/obj/item/gun/chem - name = "reagent gun" - desc = "A Nanotrasen syringe gun, modified to automatically synthesise chemical darts, and instead hold reagents." - icon_state = "chemgun" - item_state = "chemgun" - w_class = WEIGHT_CLASS_NORMAL - throw_speed = 3 - throw_range = 7 - force = 4 - materials = list(MAT_METAL=2000) - clumsy_check = FALSE - fire_sound = 'sound/items/syringeproj.ogg' - container_type = OPENCONTAINER - var/time_per_syringe = 250 - var/syringes_left = 4 - var/max_syringes = 4 - var/last_synth = 0 - -/obj/item/gun/chem/Initialize() - . = ..() - chambered = new /obj/item/ammo_casing/chemgun(src) - START_PROCESSING(SSobj, src) - create_reagents(100) - -/obj/item/gun/chem/Destroy() - . = ..() - STOP_PROCESSING(SSobj, src) - -/obj/item/gun/chem/can_shoot() - return syringes_left - -/obj/item/gun/chem/process_chamber() - if(chambered && !chambered.BB && syringes_left) - chambered.newshot() - -/obj/item/gun/chem/process() - if(syringes_left >= max_syringes) - return - if(world.time < last_synth+time_per_syringe) - return - to_chat(loc, "You hear a click as [src] synthesizes a new dart.") - syringes_left++ - if(chambered && !chambered.BB) - chambered.newshot() +//his isn't a subtype of the syringe gun because the syringegun subtype is made to hold syringes +//this is meant to hold reagents/obj/item/gun/syringe +/obj/item/gun/chem + name = "reagent gun" + desc = "A Nanotrasen syringe gun, modified to automatically synthesise chemical darts, and instead hold reagents." + icon_state = "chemgun" + item_state = "chemgun" + w_class = WEIGHT_CLASS_NORMAL + throw_speed = 3 + throw_range = 7 + force = 4 + materials = list(MAT_METAL=2000) + clumsy_check = FALSE + fire_sound = 'sound/items/syringeproj.ogg' + container_type = OPENCONTAINER + var/time_per_syringe = 250 + var/syringes_left = 4 + var/max_syringes = 4 + var/last_synth = 0 + +/obj/item/gun/chem/Initialize() + . = ..() + chambered = new /obj/item/ammo_casing/chemgun(src) + START_PROCESSING(SSobj, src) + create_reagents(100) + +/obj/item/gun/chem/Destroy() + . = ..() + STOP_PROCESSING(SSobj, src) + +/obj/item/gun/chem/can_shoot() + return syringes_left + +/obj/item/gun/chem/process_chamber() + if(chambered && !chambered.BB && syringes_left) + chambered.newshot() + +/obj/item/gun/chem/process() + if(syringes_left >= max_syringes) + return + if(world.time < last_synth+time_per_syringe) + return + to_chat(loc, "You hear a click as [src] synthesizes a new dart.") + syringes_left++ + if(chambered && !chambered.BB) + chambered.newshot() last_synth = world.time \ No newline at end of file diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/misc/grenade_launcher.dm similarity index 97% rename from code/modules/projectiles/guns/grenade_launcher.dm rename to code/modules/projectiles/guns/misc/grenade_launcher.dm index 771c0091e3..e57d77bdf9 100644 --- a/code/modules/projectiles/guns/grenade_launcher.dm +++ b/code/modules/projectiles/guns/misc/grenade_launcher.dm @@ -1,52 +1,52 @@ -/obj/item/gun/grenadelauncher - name = "grenade launcher" - desc = "A terrible, terrible thing. It's really awful!" - icon = 'icons/obj/guns/projectile.dmi' - icon_state = "riotgun" - item_state = "riotgun" - w_class = WEIGHT_CLASS_BULKY - throw_speed = 2 - throw_range = 7 - force = 5 - var/list/grenades = new/list() - var/max_grenades = 3 - materials = list(MAT_METAL=2000) - -/obj/item/gun/grenadelauncher/examine(mob/user) - ..() - to_chat(user, "[grenades.len] / [max_grenades] grenades loaded.") - -/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params) - - if((istype(I, /obj/item/grenade))) - if(grenades.len < max_grenades) - if(!user.transferItemToLoc(I, src)) - return - grenades += I - to_chat(user, "You put the grenade in the grenade launcher.") - to_chat(user, "[grenades.len] / [max_grenades] Grenades.") - else - to_chat(usr, "The grenade launcher cannot hold more grenades.") - -/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) - if(target == user) - return - - if(grenades.len) - fire_grenade(target,user) - else - to_chat(user, "The grenade launcher is empty.") - -/obj/item/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) - user.visible_message("[user] fired a grenade!", \ - "You fire the grenade launcher!") - var/obj/item/grenade/F = grenades[1] //Now with less copypasta! - grenades -= F - F.forceMove(user.loc) - F.throw_at(target, 30, 2, user) - message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - F.active = 1 - F.icon_state = initial(F.icon_state) + "_active" - playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - addtimer(CALLBACK(F, /obj/item/grenade.proc/prime), 15) +/obj/item/gun/grenadelauncher + name = "grenade launcher" + desc = "A terrible, terrible thing. It's really awful!" + icon = 'icons/obj/guns/projectile.dmi' + icon_state = "riotgun" + item_state = "riotgun" + w_class = WEIGHT_CLASS_BULKY + throw_speed = 2 + throw_range = 7 + force = 5 + var/list/grenades = new/list() + var/max_grenades = 3 + materials = list(MAT_METAL=2000) + +/obj/item/gun/grenadelauncher/examine(mob/user) + ..() + to_chat(user, "[grenades.len] / [max_grenades] grenades loaded.") + +/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params) + + if((istype(I, /obj/item/grenade))) + if(grenades.len < max_grenades) + if(!user.transferItemToLoc(I, src)) + return + grenades += I + to_chat(user, "You put the grenade in the grenade launcher.") + to_chat(user, "[grenades.len] / [max_grenades] Grenades.") + else + to_chat(usr, "The grenade launcher cannot hold more grenades.") + +/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) + if(target == user) + return + + if(grenades.len) + fire_grenade(target,user) + else + to_chat(user, "The grenade launcher is empty.") + +/obj/item/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) + user.visible_message("[user] fired a grenade!", \ + "You fire the grenade launcher!") + var/obj/item/grenade/F = grenades[1] //Now with less copypasta! + grenades -= F + F.forceMove(user.loc) + F.throw_at(target, 30, 2, user) + message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + F.active = 1 + F.icon_state = initial(F.icon_state) + "_active" + playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + addtimer(CALLBACK(F, /obj/item/grenade.proc/prime), 15) diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm similarity index 95% rename from code/modules/projectiles/guns/medbeam.dm rename to code/modules/projectiles/guns/misc/medbeam.dm index 79cafe0dd6..0626505791 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/misc/medbeam.dm @@ -1,133 +1,134 @@ -/obj/item/gun/medbeam - name = "Medical Beamgun" - desc = "Don't cross the streams!" - icon = 'icons/obj/chronos.dmi' - icon_state = "chronogun" - item_state = "chronogun" - w_class = WEIGHT_CLASS_NORMAL - - var/mob/living/current_target - var/last_check = 0 - var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though - var/max_range = 8 - var/active = 0 - var/datum/beam/current_beam = null - var/mounted = 0 //Denotes if this is a handheld or mounted version - - weapon_weight = WEAPON_MEDIUM - -/obj/item/gun/medbeam/Initialize() - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/gun/medbeam/Destroy(mob/user) - STOP_PROCESSING(SSobj, src) - LoseTarget() - return ..() - -/obj/item/gun/medbeam/dropped(mob/user) - ..() - LoseTarget() - -/obj/item/gun/medbeam/equipped(mob/user) - ..() - LoseTarget() - -/obj/item/gun/medbeam/proc/LoseTarget() - if(active) - qdel(current_beam) - current_beam = null - active = 0 - on_beam_release(current_target) - current_target = null - -/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - if(isliving(user)) - add_fingerprint(user) - - if(current_target) - LoseTarget() - if(!isliving(target)) - return - - current_target = target - active = TRUE - current_beam = new(user,current_target,time=6000,beam_icon_state="medbeam",btype=/obj/effect/ebeam/medical) - INVOKE_ASYNC(current_beam, /datum/beam.proc/Start) - - SSblackbox.record_feedback("tally", "gun_fired", 1, type) - -/obj/item/gun/medbeam/process() - - var/source = loc - if(!mounted && !isliving(source)) - LoseTarget() - return - - if(!current_target) - LoseTarget() - return - - if(world.time <= last_check+check_delay) - return - - last_check = world.time - - if(get_dist(source, current_target)>max_range || !los_check(source, current_target)) - LoseTarget() - if(isliving(source)) - to_chat(source, "You lose control of the beam!") - return - - if(current_target) - on_beam_tick(current_target) - -/obj/item/gun/medbeam/proc/los_check(atom/movable/user, mob/target) - var/turf/user_turf = user.loc - if(mounted) - user_turf = get_turf(user) - else if(!istype(user_turf)) - return 0 - var/obj/dummy = new(user_turf) - dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows - for(var/turf/turf in getline(user_turf,target)) - if(mounted && turf == user_turf) - continue //Mechs are dense and thus fail the check - if(turf.density) - qdel(dummy) - return 0 - for(var/atom/movable/AM in turf) - if(!AM.CanPass(dummy,turf,1)) - qdel(dummy) - return 0 - for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams! - if(B.owner.origin != current_beam.origin) - explosion(B.loc,0,3,5,8) - qdel(dummy) - return 0 - qdel(dummy) - return 1 - -/obj/item/gun/medbeam/proc/on_beam_hit(var/mob/living/target) - return - -/obj/item/gun/medbeam/proc/on_beam_tick(var/mob/living/target) - if(target.health != target.maxHealth) - new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") - target.adjustBruteLoss(-4) - target.adjustFireLoss(-4) - return - -/obj/item/gun/medbeam/proc/on_beam_release(var/mob/living/target) - return - -/obj/effect/ebeam/medical - name = "medical beam" - -//////////////////////////////Mech Version/////////////////////////////// -/obj/item/gun/medbeam/mech - mounted = 1 - -/obj/item/gun/medbeam/mech/Initialize() - . = ..() - STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj +/obj/item/gun/medbeam + name = "Medical Beamgun" + desc = "Don't cross the streams!" + icon = 'icons/obj/chronos.dmi' + icon_state = "chronogun" + item_state = "chronogun" + w_class = WEIGHT_CLASS_NORMAL + harmful = FALSE + + var/mob/living/current_target + var/last_check = 0 + var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though + var/max_range = 8 + var/active = 0 + var/datum/beam/current_beam = null + var/mounted = 0 //Denotes if this is a handheld or mounted version + + weapon_weight = WEAPON_MEDIUM + +/obj/item/gun/medbeam/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/item/gun/medbeam/Destroy(mob/user) + STOP_PROCESSING(SSobj, src) + LoseTarget() + return ..() + +/obj/item/gun/medbeam/dropped(mob/user) + ..() + LoseTarget() + +/obj/item/gun/medbeam/equipped(mob/user) + ..() + LoseTarget() + +/obj/item/gun/medbeam/proc/LoseTarget() + if(active) + qdel(current_beam) + current_beam = null + active = 0 + on_beam_release(current_target) + current_target = null + +/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + if(isliving(user)) + add_fingerprint(user) + + if(current_target) + LoseTarget() + if(!isliving(target)) + return + + current_target = target + active = TRUE + current_beam = new(user,current_target,time=6000,beam_icon_state="medbeam",btype=/obj/effect/ebeam/medical) + INVOKE_ASYNC(current_beam, /datum/beam.proc/Start) + + SSblackbox.record_feedback("tally", "gun_fired", 1, type) + +/obj/item/gun/medbeam/process() + + var/source = loc + if(!mounted && !isliving(source)) + LoseTarget() + return + + if(!current_target) + LoseTarget() + return + + if(world.time <= last_check+check_delay) + return + + last_check = world.time + + if(get_dist(source, current_target)>max_range || !los_check(source, current_target)) + LoseTarget() + if(isliving(source)) + to_chat(source, "You lose control of the beam!") + return + + if(current_target) + on_beam_tick(current_target) + +/obj/item/gun/medbeam/proc/los_check(atom/movable/user, mob/target) + var/turf/user_turf = user.loc + if(mounted) + user_turf = get_turf(user) + else if(!istype(user_turf)) + return 0 + var/obj/dummy = new(user_turf) + dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows + for(var/turf/turf in getline(user_turf,target)) + if(mounted && turf == user_turf) + continue //Mechs are dense and thus fail the check + if(turf.density) + qdel(dummy) + return 0 + for(var/atom/movable/AM in turf) + if(!AM.CanPass(dummy,turf,1)) + qdel(dummy) + return 0 + for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams! + if(B.owner.origin != current_beam.origin) + explosion(B.loc,0,3,5,8) + qdel(dummy) + return 0 + qdel(dummy) + return 1 + +/obj/item/gun/medbeam/proc/on_beam_hit(var/mob/living/target) + return + +/obj/item/gun/medbeam/proc/on_beam_tick(var/mob/living/target) + if(target.health != target.maxHealth) + new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") + target.adjustBruteLoss(-4) + target.adjustFireLoss(-4) + return + +/obj/item/gun/medbeam/proc/on_beam_release(var/mob/living/target) + return + +/obj/effect/ebeam/medical + name = "medical beam" + +//////////////////////////////Mech Version/////////////////////////////// +/obj/item/gun/medbeam/mech + mounted = 1 + +/obj/item/gun/medbeam/mech/Initialize() + . = ..() + STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm similarity index 96% rename from code/modules/projectiles/guns/syringe_gun.dm rename to code/modules/projectiles/guns/misc/syringe_gun.dm index ac9f7daedf..cc1b321e3a 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -1,104 +1,104 @@ -/obj/item/gun/syringe - name = "syringe gun" - 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 = WEIGHT_CLASS_NORMAL - throw_speed = 3 - throw_range = 7 - force = 4 - materials = list(MAT_METAL=2000) - clumsy_check = 0 - fire_sound = 'sound/items/syringeproj.ogg' - var/list/syringes = list() - var/max_syringes = 1 - -/obj/item/gun/syringe/Initialize() - . = ..() - chambered = new /obj/item/ammo_casing/syringegun(src) - -/obj/item/gun/syringe/recharge_newshot() - if(!syringes.len) - return - chambered.newshot() - -/obj/item/gun/syringe/can_shoot() - return syringes.len - -/obj/item/gun/syringe/process_chamber() - if(chambered && !chambered.BB) //we just fired - recharge_newshot() - -/obj/item/gun/syringe/examine(mob/user) - ..() - to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.") - -/obj/item/gun/syringe/attack_self(mob/living/user) - if(!syringes.len) - to_chat(user, "[src] is empty!") - return 0 - - var/obj/item/reagent_containers/syringe/S = syringes[syringes.len] - - if(!S) - return 0 - S.forceMove(user.loc) - - syringes.Remove(S) - to_chat(user, "You unload [S] from \the [src].") - - return 1 - -/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE) - if(istype(A, /obj/item/reagent_containers/syringe)) - if(syringes.len < max_syringes) - if(!user.transferItemToLoc(A, src)) - return FALSE - to_chat(user, "You load [A] into \the [src].") - syringes += A - recharge_newshot() - return TRUE - else - to_chat(user, "[src] cannot hold more syringes!") - return FALSE - -/obj/item/gun/syringe/rapidsyringe - name = "rapid syringe gun" - desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." - icon_state = "rapidsyringegun" - max_syringes = 6 - -/obj/item/gun/syringe/syndicate - name = "dart pistol" - desc = "A small spring-loaded sidearm that functions identically to a syringe gun." - icon_state = "syringe_pistol" - item_state = "gun" //Smaller inhand - w_class = WEIGHT_CLASS_SMALL - force = 2 //Also very weak because it's smaller - suppressed = TRUE //Softer fire sound - can_unsuppress = FALSE //Permanently silenced - -/obj/item/gun/syringe/dna - name = "modified syringe gun" - desc = "A syringe gun that has been modified to fit DNA injectors instead of normal syringes." - -/obj/item/gun/syringe/dna/Initialize() - . = ..() - chambered = new /obj/item/ammo_casing/dnainjector(src) - -/obj/item/gun/syringe/dna/attackby(obj/item/A, mob/user, params, show_msg = TRUE) - if(istype(A, /obj/item/dnainjector)) - var/obj/item/dnainjector/D = A - if(D.used) - to_chat(user, "This injector is used up!") - return - if(syringes.len < max_syringes) - if(!user.transferItemToLoc(D, src)) - return FALSE - to_chat(user, "You load \the [D] into \the [src].") - syringes += D - recharge_newshot() - return TRUE - else - to_chat(user, "[src] cannot hold more syringes!") - return FALSE +/obj/item/gun/syringe + name = "syringe gun" + 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 = WEIGHT_CLASS_NORMAL + throw_speed = 3 + throw_range = 7 + force = 4 + materials = list(MAT_METAL=2000) + clumsy_check = 0 + fire_sound = 'sound/items/syringeproj.ogg' + var/list/syringes = list() + var/max_syringes = 1 + +/obj/item/gun/syringe/Initialize() + . = ..() + chambered = new /obj/item/ammo_casing/syringegun(src) + +/obj/item/gun/syringe/recharge_newshot() + if(!syringes.len) + return + chambered.newshot() + +/obj/item/gun/syringe/can_shoot() + return syringes.len + +/obj/item/gun/syringe/process_chamber() + if(chambered && !chambered.BB) //we just fired + recharge_newshot() + +/obj/item/gun/syringe/examine(mob/user) + ..() + to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.") + +/obj/item/gun/syringe/attack_self(mob/living/user) + if(!syringes.len) + to_chat(user, "[src] is empty!") + return 0 + + var/obj/item/reagent_containers/syringe/S = syringes[syringes.len] + + if(!S) + return 0 + S.forceMove(user.loc) + + syringes.Remove(S) + to_chat(user, "You unload [S] from \the [src].") + + return 1 + +/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE) + if(istype(A, /obj/item/reagent_containers/syringe)) + if(syringes.len < max_syringes) + if(!user.transferItemToLoc(A, src)) + return FALSE + to_chat(user, "You load [A] into \the [src].") + syringes += A + recharge_newshot() + return TRUE + else + to_chat(user, "[src] cannot hold more syringes!") + return FALSE + +/obj/item/gun/syringe/rapidsyringe + name = "rapid syringe gun" + desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." + icon_state = "rapidsyringegun" + max_syringes = 6 + +/obj/item/gun/syringe/syndicate + name = "dart pistol" + desc = "A small spring-loaded sidearm that functions identically to a syringe gun." + icon_state = "syringe_pistol" + item_state = "gun" //Smaller inhand + w_class = WEIGHT_CLASS_SMALL + force = 2 //Also very weak because it's smaller + suppressed = TRUE //Softer fire sound + can_unsuppress = FALSE //Permanently silenced + +/obj/item/gun/syringe/dna + name = "modified syringe gun" + desc = "A syringe gun that has been modified to fit DNA injectors instead of normal syringes." + +/obj/item/gun/syringe/dna/Initialize() + . = ..() + chambered = new /obj/item/ammo_casing/dnainjector(src) + +/obj/item/gun/syringe/dna/attackby(obj/item/A, mob/user, params, show_msg = TRUE) + if(istype(A, /obj/item/dnainjector)) + var/obj/item/dnainjector/D = A + if(D.used) + to_chat(user, "This injector is used up!") + return + if(syringes.len < max_syringes) + if(!user.transferItemToLoc(D, src)) + return FALSE + to_chat(user, "You load \the [D] into \the [src].") + syringes += D + recharge_newshot() + return TRUE + else + to_chat(user, "[src] cannot hold more syringes!") + return FALSE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 546ed7743b..db43917d6c 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -419,6 +419,9 @@ transform = M trajectory.increment(trajectory_multiplier) var/turf/T = trajectory.return_turf() + if(!istype(T)) + qdel(src) + return if(T.z != loc.z) var/old = loc before_z_change(loc, T) @@ -459,6 +462,13 @@ xo = targloc.x - curloc.x setAngle(Get_Angle(src, targloc)) + //CIT CHANGES START HERE - makes it so laying down makes you unable to shoot through most objects + if(iscarbon(source)) + var/mob/living/carbon/checklad = source + if(istype(checklad) && checklad.resting) + pass_flags = 0 + //END OF CIT CHANGES + if(isliving(source) && params) var/list/calculated = calculate_projectile_angle_and_pixel_offsets(source, params) p_x = calculated[2] diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 235f27e9e5..725ef9baa6 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -7,422 +7,3 @@ flag = "bullet" hitsound_wall = "ricochet" impact_effect_type = /obj/effect/temp_visual/impact_effect - -/obj/item/projectile/bullet/incendiary - damage = 20 - var/fire_stacks = 4 - -/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/M = target - M.adjust_fire_stacks(fire_stacks) - M.IgniteMob() - -/obj/item/projectile/bullet/incendiary/Move() - . = ..() - var/turf/location = get_turf(src) - if(location) - new /obj/effect/hotspot(location) - location.hotspot_expose(700, 50, 1) - -// .357 (Syndie Revolver) - -/obj/item/projectile/bullet/a357 - name = ".357 bullet" - damage = 60 - -// 7.62 (Nagant Rifle) - -/obj/item/projectile/bullet/a762 - name = "7.62 bullet" - damage = 60 - -/obj/item/projectile/bullet/a762_enchanted - name = "enchanted 7.62 bullet" - damage = 5 - stamina = 80 - -// 7.62x38mmR (Nagant Revolver) - -/obj/item/projectile/bullet/n762 - name = "7.62x38mmR bullet" - damage = 60 - -// .50AE (Desert Eagle) - -/obj/item/projectile/bullet/a50AE - name = ".50AE bullet" - damage = 60 - -// .38 (Detective's Gun) - -/obj/item/projectile/bullet/c38 - name = ".38 bullet" - damage = 15 - knockdown = 60 - stamina = 50 - -// 10mm (Stechkin) - -/obj/item/projectile/bullet/c10mm - name = "10mm bullet" - damage = 30 - -/obj/item/projectile/bullet/c10mm_ap - name = "10mm armor-piercing bullet" - damage = 27 - armour_penetration = 40 - -/obj/item/projectile/bullet/c10mm_hp - name = "10mm hollow-point bullet" - damage = 40 - armour_penetration = -50 - -/obj/item/projectile/bullet/incendiary/c10mm - name = "10mm incendiary bullet" - damage = 15 - fire_stacks = 2 - -// 9mm (Stechkin APS) - -/obj/item/projectile/bullet/c9mm - name = "9mm bullet" - damage = 20 - -/obj/item/projectile/bullet/c9mm_ap - name = "9mm armor-piercing bullet" - damage = 15 - armour_penetration = 40 - -/obj/item/projectile/bullet/incendiary/c9mm - name = "9mm incendiary bullet" - damage = 10 - fire_stacks = 1 - -// 4.6x30mm (Autorifles) - -/obj/item/projectile/bullet/c46x30mm - name = "4.6x30mm bullet" - damage = 20 - -/obj/item/projectile/bullet/c46x30mm_ap - name = "4.6x30mm armor-piercing bullet" - damage = 15 - armour_penetration = 40 - -/obj/item/projectile/bullet/incendiary/c46x30mm - name = "4.6x30mm incendiary bullet" - damage = 10 - fire_stacks = 1 - -// .45 (M1911 & C20r) - -/obj/item/projectile/bullet/c45 - name = ".45 bullet" - damage = 20 - stamina = 65 - -/obj/item/projectile/bullet/c45_nostamina - name = ".45 bullet" - damage = 30 - -// 5.56mm (M-90gl Carbine) - -/obj/item/projectile/bullet/a556 - name = "5.56mm bullet" - damage = 35 - -// 40mm (Grenade Launcher - -/obj/item/projectile/bullet/a40mm - name ="40mm grenade" - desc = "USE A WEEL GUN" - icon_state= "bolter" - damage = 60 - -/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 0, 2, 1, 0, flame_range = 3) - return TRUE - -// .50 (Sniper) - -/obj/item/projectile/bullet/p50 - name =".50 bullet" - speed = 0.4 - damage = 70 - knockdown = 100 - dismemberment = 50 - armour_penetration = 50 - var/breakthings = TRUE - -/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0) - if((blocked != 100) && (!ismob(target) && breakthings)) - target.ex_act(rand(1,2)) - return ..() - -/obj/item/projectile/bullet/p50/soporific - name =".50 soporific bullet" - armour_penetration = 0 - nodamage = TRUE - dismemberment = 0 - knockdown = 0 - breakthings = FALSE - -/obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE) - if((blocked != 100) && isliving(target)) - var/mob/living/L = target - L.Sleeping(400) - return ..() - -/obj/item/projectile/bullet/p50/penetrator - name =".50 penetrator bullet" - icon_state = "gauss" - name = "penetrator round" - damage = 60 - forcedodge = TRUE - dismemberment = 0 //It goes through you cleanly. - knockdown = 0 - breakthings = FALSE - -// 1.95x129mm (SAW) - -/obj/item/projectile/bullet/mm195x129 - name = "1.95x129mm bullet" - damage = 45 - armour_penetration = 5 - -/obj/item/projectile/bullet/mm195x129_ap - name = "1.95x129mm armor-piercing bullet" - damage = 40 - armour_penetration = 75 - -/obj/item/projectile/bullet/mm195x129_hp - name = "1.95x129mm hollow-point bullet" - damage = 60 - armour_penetration = -60 - -/obj/item/projectile/bullet/incendiary/mm195x129 - name = "1.95x129mm incendiary bullet" - damage = 15 - fire_stacks = 3 - -// Shotgun - -/obj/item/projectile/bullet/shotgun_slug - name = "12g shotgun slug" - damage = 60 - -/obj/item/projectile/bullet/shotgun_beanbag - name = "beanbag slug" - damage = 5 - stamina = 80 - -/obj/item/projectile/bullet/incendiary/shotgun - name = "incendiary slug" - damage = 20 - -/obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath - name = "dragonsbreath pellet" - damage = 5 - -/obj/item/projectile/bullet/shotgun_stunslug - name = "stunslug" - damage = 5 - knockdown = 100 - stutter = 5 - jitter = 20 - range = 7 - icon_state = "spark" - color = "#FFFF00" - -/obj/item/projectile/bullet/shotgun_meteorslug - name = "meteorslug" - icon = 'icons/obj/meteor.dmi' - icon_state = "dust" - damage = 20 - knockdown = 80 - hitsound = 'sound/effects/meteorimpact.ogg' - -/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE) - . = ..() - if(ismovableatom(target)) - var/atom/movable/M = target - var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) - M.throw_at(throw_target, 3, 2) - -/obj/item/projectile/bullet/shotgun_meteorslug/Initialize() - . = ..() - SpinAnimation() - -/obj/item/projectile/bullet/shotgun_frag12 - name ="frag12 slug" - damage = 25 - knockdown = 50 - -/obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 0, 1) - return TRUE - -/obj/item/projectile/bullet/pellet - var/tile_dropoff = 0.75 - var/tile_dropoff_s = 1.25 - -/obj/item/projectile/bullet/pellet/shotgun_buckshot - name = "buckshot pellet" - damage = 12.5 - -/obj/item/projectile/bullet/pellet/shotgun_rubbershot - name = "rubbershot pellet" - damage = 3 - stamina = 25 - -/obj/item/projectile/bullet/pellet/Range() - ..() - if(damage > 0) - damage -= tile_dropoff - if(stamina > 0) - stamina -= tile_dropoff_s - if(damage < 0 && stamina < 0) - qdel(src) - -/obj/item/projectile/bullet/pellet/shotgun_improvised - tile_dropoff = 0.55 //Come on it does 6 damage don't be like that. - damage = 6 - -/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize() - . = ..() - range = rand(1, 8) - -/obj/item/projectile/bullet/pellet/shotgun_improvised/on_range() - do_sparks(1, TRUE, src) - ..() - -// Scattershot - -/obj/item/projectile/bullet/scattershot - damage = 20 - stamina = 65 - -// LMD (exosuits) - -/obj/item/projectile/bullet/lmg - damage = 20 - -// Turrets - -/obj/item/projectile/bullet/manned_turret - damage = 20 - -/obj/item/projectile/bullet/syndicate_turret - damage = 20 - -// FNX-99 (Mechs) - -/obj/item/projectile/bullet/incendiary/fnx99 - damage = 20 - -// C3D (Borgs) - -/obj/item/projectile/bullet/c3d - damage = 20 - -// Honker - -/obj/item/projectile/bullet/honker - damage = 0 - knockdown = 60 - forcedodge = TRUE - nodamage = TRUE - hitsound = 'sound/items/bikehorn.ogg' - icon = 'icons/obj/hydroponics/harvest.dmi' - icon_state = "banana" - range = 200 - -/obj/item/projectile/bullet/honker/Initialize() - . = ..() - SpinAnimation() - -// Mime - -/obj/item/projectile/bullet/mime - damage = 20 - -/obj/item/projectile/bullet/mime/on_hit(atom/target, blocked = FALSE) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/M = target - M.silent = max(M.silent, 10) - -// Darts - -/obj/item/projectile/bullet/dart - name = "dart" - icon_state = "cbbolt" - damage = 6 - var/piercing = FALSE - -/obj/item/projectile/bullet/dart/Initialize() - . = ..() - create_reagents(50) - reagents.set_reacting(FALSE) - -/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE) - if(iscarbon(target)) - var/mob/living/carbon/M = target - if(blocked != 100) // not completely blocked - if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. - ..() - reagents.reaction(M, INJECT) - reagents.trans_to(M, reagents.total_volume) - return TRUE - else - blocked = 100 - target.visible_message("\The [src] was deflected!", \ - "You were protected against \the [src]!") - - ..(target, blocked) - reagents.set_reacting(TRUE) - reagents.handle_reactions() - return TRUE - -/obj/item/projectile/bullet/dart/metalfoam/Initialize() - . = ..() - reagents.add_reagent("aluminium", 15) - reagents.add_reagent("foaming_agent", 5) - reagents.add_reagent("facid", 5) - -//This one is for future syringe guns update -/obj/item/projectile/bullet/dart/syringe - name = "syringe" - icon_state = "syringeproj" - -// DNA injector - -/obj/item/projectile/bullet/dnainjector - name = "\improper DNA injector" - icon_state = "syringeproj" - var/obj/item/dnainjector/injector - damage = 5 - hitsound_wall = "shatter" - -/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE) - if(iscarbon(target)) - var/mob/living/carbon/M = target - if(blocked != 100) - if(M.can_inject(null, FALSE, def_zone, FALSE)) - if(injector.inject(M, firer)) - QDEL_NULL(injector) - return TRUE - else - blocked = 100 - target.visible_message("\The [src] was deflected!", \ - "You were protected against \the [src]!") - return ..() - -/obj/item/projectile/bullet/dnainjector/Destroy() - QDEL_NULL(injector) - return ..() - diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm new file mode 100644 index 0000000000..d0cf74421c --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm @@ -0,0 +1,17 @@ +/obj/item/projectile/bullet/incendiary + damage = 20 + var/fire_stacks = 4 + +/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/M = target + M.adjust_fire_stacks(fire_stacks) + M.IgniteMob() + +/obj/item/projectile/bullet/incendiary/Move() + . = ..() + var/turf/location = get_turf(src) + if(location) + new /obj/effect/hotspot(location) + location.hotspot_expose(700, 50, 1) diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm new file mode 100644 index 0000000000..023c3b9090 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -0,0 +1,39 @@ +/obj/item/projectile/bullet/dart + name = "dart" + icon_state = "cbbolt" + damage = 6 + var/piercing = FALSE + +/obj/item/projectile/bullet/dart/Initialize() + . = ..() + create_reagents(50) + reagents.set_reacting(FALSE) + +/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE) + if(iscarbon(target)) + var/mob/living/carbon/M = target + if(blocked != 100) // not completely blocked + if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. + ..() + reagents.reaction(M, INJECT) + reagents.trans_to(M, reagents.total_volume) + return TRUE + else + blocked = 100 + target.visible_message("\The [src] was deflected!", \ + "You were protected against \the [src]!") + + ..(target, blocked) + reagents.set_reacting(TRUE) + reagents.handle_reactions() + return TRUE + +/obj/item/projectile/bullet/dart/metalfoam/Initialize() + . = ..() + reagents.add_reagent("aluminium", 15) + reagents.add_reagent("foaming_agent", 5) + reagents.add_reagent("facid", 5) + +/obj/item/projectile/bullet/dart/syringe + name = "syringe" + icon_state = "syringeproj" diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm new file mode 100644 index 0000000000..861ead5393 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm @@ -0,0 +1,24 @@ +/obj/item/projectile/bullet/dnainjector + name = "\improper DNA injector" + icon_state = "syringeproj" + var/obj/item/dnainjector/injector + damage = 5 + hitsound_wall = "shatter" + +/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE) + if(iscarbon(target)) + var/mob/living/carbon/M = target + if(blocked != 100) + if(M.can_inject(null, FALSE, def_zone, FALSE)) + if(injector.inject(M, firer)) + QDEL_NULL(injector) + return TRUE + else + blocked = 100 + target.visible_message("\The [src] was deflected!", \ + "You were protected against \the [src]!") + return ..() + +/obj/item/projectile/bullet/dnainjector/Destroy() + QDEL_NULL(injector) + return ..() diff --git a/code/modules/projectiles/projectile/bullets/grenade.dm b/code/modules/projectiles/projectile/bullets/grenade.dm new file mode 100644 index 0000000000..965001b55f --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/grenade.dm @@ -0,0 +1,12 @@ +// 40mm (Grenade Launcher + +/obj/item/projectile/bullet/a40mm + name ="40mm grenade" + desc = "USE A WEEL GUN" + icon_state= "bolter" + damage = 60 + +/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 0, 2, 1, 0, flame_range = 3) + return TRUE diff --git a/code/modules/projectiles/projectile/bullets/lmg.dm b/code/modules/projectiles/projectile/bullets/lmg.dm new file mode 100644 index 0000000000..03e64976d9 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/lmg.dm @@ -0,0 +1,44 @@ +// C3D (Borgs) + +/obj/item/projectile/bullet/c3d + damage = 20 + +// Mech LMG + +/obj/item/projectile/bullet/lmg + damage = 20 + +// Mech FNX-99 + +/obj/item/projectile/bullet/incendiary/fnx99 + damage = 20 + +// Turrets + +/obj/item/projectile/bullet/manned_turret + damage = 20 + +/obj/item/projectile/bullet/syndicate_turret + damage = 20 + +// 1.95x129mm (SAW) + +/obj/item/projectile/bullet/mm195x129 + name = "1.95x129mm bullet" + damage = 45 + armour_penetration = 5 + +/obj/item/projectile/bullet/mm195x129_ap + name = "1.95x129mm armor-piercing bullet" + damage = 40 + armour_penetration = 75 + +/obj/item/projectile/bullet/mm195x129_hp + name = "1.95x129mm hollow-point bullet" + damage = 60 + armour_penetration = -60 + +/obj/item/projectile/bullet/incendiary/mm195x129 + name = "1.95x129mm incendiary bullet" + damage = 15 + fire_stacks = 3 diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm new file mode 100644 index 0000000000..ac14fa563c --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -0,0 +1,36 @@ +// 9mm (Stechkin APS) + +/obj/item/projectile/bullet/c9mm + name = "9mm bullet" + damage = 20 + +/obj/item/projectile/bullet/c9mm_ap + name = "9mm armor-piercing bullet" + damage = 15 + armour_penetration = 40 + +/obj/item/projectile/bullet/incendiary/c9mm + name = "9mm incendiary bullet" + damage = 10 + fire_stacks = 1 + +// 10mm (Stechkin) + +/obj/item/projectile/bullet/c10mm + name = "10mm bullet" + damage = 30 + +/obj/item/projectile/bullet/c10mm_ap + name = "10mm armor-piercing bullet" + damage = 27 + armour_penetration = 40 + +/obj/item/projectile/bullet/c10mm_hp + name = "10mm hollow-point bullet" + damage = 40 + armour_penetration = -50 + +/obj/item/projectile/bullet/incendiary/c10mm + name = "10mm incendiary bullet" + damage = 15 + fire_stacks = 2 diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm new file mode 100644 index 0000000000..fc4ed0fa50 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -0,0 +1,25 @@ +// 7.62x38mmR (Nagant Revolver) + +/obj/item/projectile/bullet/n762 + name = "7.62x38mmR bullet" + damage = 60 + +// .50AE (Desert Eagle) + +/obj/item/projectile/bullet/a50AE + name = ".50AE bullet" + damage = 60 + +// .38 (Detective's Gun) + +/obj/item/projectile/bullet/c38 + name = ".38 bullet" + damage = 15 + knockdown = 60 + stamina = 50 + +// .357 (Syndie Revolver) + +/obj/item/projectile/bullet/a357 + name = ".357 bullet" + damage = 60 diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm new file mode 100644 index 0000000000..a019c05ef1 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -0,0 +1,16 @@ +// 5.56mm (M-90gl Carbine) + +/obj/item/projectile/bullet/a556 + name = "5.56mm bullet" + damage = 35 + +// 7.62 (Nagant Rifle) + +/obj/item/projectile/bullet/a762 + name = "7.62 bullet" + damage = 60 + +/obj/item/projectile/bullet/a762_enchanted + name = "enchanted 7.62 bullet" + damage = 5 + stamina = 80 diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm new file mode 100644 index 0000000000..ecbe2e96e4 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -0,0 +1,95 @@ +/obj/item/projectile/bullet/shotgun_slug + name = "12g shotgun slug" + damage = 60 + +/obj/item/projectile/bullet/shotgun_beanbag + name = "beanbag slug" + damage = 5 + stamina = 80 + +/obj/item/projectile/bullet/incendiary/shotgun + name = "incendiary slug" + damage = 20 + +/obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath + name = "dragonsbreath pellet" + damage = 5 + +/obj/item/projectile/bullet/shotgun_stunslug + name = "stunslug" + damage = 5 + knockdown = 100 + stutter = 5 + jitter = 20 + range = 7 + icon_state = "spark" + color = "#FFFF00" + +/obj/item/projectile/bullet/shotgun_meteorslug + name = "meteorslug" + icon = 'icons/obj/meteor.dmi' + icon_state = "dust" + damage = 20 + knockdown = 80 + hitsound = 'sound/effects/meteorimpact.ogg' + +/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE) + . = ..() + if(ismovableatom(target)) + var/atom/movable/M = target + var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) + M.throw_at(throw_target, 3, 2) + +/obj/item/projectile/bullet/shotgun_meteorslug/Initialize() + . = ..() + SpinAnimation() + +/obj/item/projectile/bullet/shotgun_frag12 + name ="frag12 slug" + damage = 25 + knockdown = 50 + +/obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 0, 1) + return TRUE + +/obj/item/projectile/bullet/pellet + var/tile_dropoff = 0.75 + var/tile_dropoff_s = 1.25 + +/obj/item/projectile/bullet/pellet/shotgun_buckshot + name = "buckshot pellet" + damage = 12.5 + +/obj/item/projectile/bullet/pellet/shotgun_rubbershot + name = "rubbershot pellet" + damage = 3 + stamina = 25 + +/obj/item/projectile/bullet/pellet/Range() + ..() + if(damage > 0) + damage -= tile_dropoff + if(stamina > 0) + stamina -= tile_dropoff_s + if(damage < 0 && stamina < 0) + qdel(src) + +/obj/item/projectile/bullet/pellet/shotgun_improvised + tile_dropoff = 0.55 //Come on it does 6 damage don't be like that. + damage = 6 + +/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize() + . = ..() + range = rand(1, 8) + +/obj/item/projectile/bullet/pellet/shotgun_improvised/on_range() + do_sparks(1, TRUE, src) + ..() + +// Mech Scattershot + +/obj/item/projectile/bullet/scattershot + damage = 20 + stamina = 65 diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm new file mode 100644 index 0000000000..50532a5977 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -0,0 +1,26 @@ +// .45 (M1911 & C20r) + +/obj/item/projectile/bullet/c45 + name = ".45 bullet" + damage = 20 + stamina = 65 + +/obj/item/projectile/bullet/c45_nostamina + name = ".45 bullet" + damage = 30 + +// 4.6x30mm (Autorifles) + +/obj/item/projectile/bullet/c46x30mm + name = "4.6x30mm bullet" + damage = 20 + +/obj/item/projectile/bullet/c46x30mm_ap + name = "4.6x30mm armor-piercing bullet" + damage = 15 + armour_penetration = 40 + +/obj/item/projectile/bullet/incendiary/c46x30mm + name = "4.6x30mm incendiary bullet" + damage = 10 + fire_stacks = 1 diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm new file mode 100644 index 0000000000..d29cb70440 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -0,0 +1,39 @@ +// .50 (Sniper) + +/obj/item/projectile/bullet/p50 + name =".50 bullet" + speed = 0.4 + damage = 70 + knockdown = 100 + dismemberment = 50 + armour_penetration = 50 + var/breakthings = TRUE + +/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0) + if((blocked != 100) && (!ismob(target) && breakthings)) + target.ex_act(rand(1,2)) + return ..() + +/obj/item/projectile/bullet/p50/soporific + name =".50 soporific bullet" + armour_penetration = 0 + nodamage = TRUE + dismemberment = 0 + knockdown = 0 + breakthings = FALSE + +/obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && isliving(target)) + var/mob/living/L = target + L.Sleeping(400) + return ..() + +/obj/item/projectile/bullet/p50/penetrator + name =".50 penetrator bullet" + icon_state = "gauss" + name = "penetrator round" + damage = 60 + forcedodge = TRUE + dismemberment = 0 //It goes through you cleanly. + knockdown = 0 + breakthings = FALSE diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm new file mode 100644 index 0000000000..091dff454c --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -0,0 +1,26 @@ +// Honker + +/obj/item/projectile/bullet/honker + damage = 0 + knockdown = 60 + forcedodge = TRUE + nodamage = TRUE + hitsound = 'sound/items/bikehorn.ogg' + icon = 'icons/obj/hydroponics/harvest.dmi' + icon_state = "banana" + range = 200 + +/obj/item/projectile/bullet/honker/Initialize() + . = ..() + SpinAnimation() + +// Mime + +/obj/item/projectile/bullet/mime + damage = 20 + +/obj/item/projectile/bullet/mime/on_hit(atom/target, blocked = FALSE) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/M = target + M.silent = max(M.silent, 10) diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm new file mode 100644 index 0000000000..3df1eb74d3 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/_energy.dm @@ -0,0 +1,8 @@ +/obj/item/projectile/energy + name = "energy" + icon_state = "spark" + damage = 0 + damage_type = BURN + flag = "energy" + is_reflectable = TRUE + diff --git a/code/modules/projectiles/projectile/energy/chameleon.dm b/code/modules/projectiles/projectile/energy/chameleon.dm new file mode 100644 index 0000000000..8ed6283c51 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/chameleon.dm @@ -0,0 +1,3 @@ +/obj/item/projectile/energy/chameleon + nodamage = TRUE + diff --git a/code/modules/projectiles/projectile/energy/ebow.dm b/code/modules/projectiles/projectile/energy/ebow.dm new file mode 100644 index 0000000000..3e65bbfad2 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/ebow.dm @@ -0,0 +1,15 @@ +/obj/item/projectile/energy/bolt //ebow bolts + name = "bolt" + icon_state = "cbbolt" + damage = 8 + damage_type = TOX + nodamage = 0 + knockdown = 100 + stutter = 5 + +/obj/item/projectile/energy/bolt/halloween + name = "candy corn" + icon_state = "candy_corn" + +/obj/item/projectile/energy/bolt/large + damage = 20 diff --git a/code/modules/projectiles/projectile/energy/misc.dm b/code/modules/projectiles/projectile/energy/misc.dm new file mode 100644 index 0000000000..21c3138add --- /dev/null +++ b/code/modules/projectiles/projectile/energy/misc.dm @@ -0,0 +1,15 @@ +/obj/item/projectile/energy/declone + name = "radiation beam" + icon_state = "declone" + damage = 20 + damage_type = CLONE + irradiate = 10 + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser + +/obj/item/projectile/energy/dart //ninja throwing dart + name = "dart" + icon_state = "toxin" + damage = 5 + damage_type = TOX + knockdown = 100 + range = 7 diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm new file mode 100644 index 0000000000..48544d1c28 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -0,0 +1,98 @@ +/obj/item/projectile/energy/net + name = "energy netting" + icon_state = "e_netting" + damage = 10 + damage_type = STAMINA + hitsound = 'sound/weapons/taserhit.ogg' + range = 10 + +/obj/item/projectile/energy/net/Initialize() + . = ..() + SpinAnimation() + +/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE) + if(isliving(target)) + var/turf/Tloc = get_turf(target) + if(!locate(/obj/effect/nettingportal) in Tloc) + new /obj/effect/nettingportal(Tloc) + ..() + +/obj/item/projectile/energy/net/on_range() + do_sparks(1, TRUE, src) + ..() + +/obj/effect/nettingportal + name = "DRAGnet teleportation field" + desc = "A field of bluespace energy, locking on to teleport a target." + icon = 'icons/effects/effects.dmi' + icon_state = "dragnetfield" + light_range = 3 + anchored = TRUE + +/obj/effect/nettingportal/Initialize() + . = ..() + var/obj/item/device/beacon/teletarget = null + for(var/obj/machinery/computer/teleporter/com in GLOB.machines) + if(com.target) + if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) + teletarget = com.target + + addtimer(CALLBACK(src, .proc/pop, teletarget), 30) + +/obj/effect/nettingportal/proc/pop(teletarget) + if(teletarget) + for(var/mob/living/L in get_turf(src)) + do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon + else + for(var/mob/living/L in get_turf(src)) + do_teleport(L, L, 15) //Otherwise it just warps you off somewhere. + + qdel(src) + +/obj/effect/nettingportal/singularity_act() + return + +/obj/effect/nettingportal/singularity_pull() + return + +/obj/item/projectile/energy/trap + name = "energy snare" + icon_state = "e_snare" + nodamage = 1 + knockdown = 20 + hitsound = 'sound/weapons/taserhit.ogg' + range = 4 + +/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE) + if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap + new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc)) + else if(iscarbon(target)) + var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target)) + B.Crossed(target) + ..() + +/obj/item/projectile/energy/trap/on_range() + new /obj/item/restraints/legcuffs/beartrap/energy(loc) + ..() + +/obj/item/projectile/energy/trap/cyborg + name = "Energy Bola" + icon_state = "e_snare" + nodamage = 1 + knockdown = 0 + hitsound = 'sound/weapons/taserhit.ogg' + range = 10 + +/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE) + if(!ismob(target) || blocked >= 100) + do_sparks(1, TRUE, src) + qdel(src) + if(iscarbon(target)) + var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) + B.Crossed(target) + QDEL_IN(src, 10) + ..() + +/obj/item/projectile/energy/trap/cyborg/on_range() + do_sparks(1, TRUE, src) + qdel(src) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm new file mode 100644 index 0000000000..3b04febae3 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -0,0 +1,31 @@ +/obj/item/projectile/energy/electrode + name = "electrode" + icon_state = "spark" + color = "#FFFF00" + nodamage = 1 + knockdown = 100 + stutter = 5 + jitter = 20 + hitsound = 'sound/weapons/taserhit.ogg' + range = 7 + tracer_type = /obj/effect/projectile/tracer/stun + muzzle_type = /obj/effect/projectile/muzzle/stun + impact_type = /obj/effect/projectile/impact/stun + +/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) + . = ..() + if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks! + do_sparks(1, TRUE, src) + else if(iscarbon(target)) + var/mob/living/carbon/C = target + GET_COMPONENT_FROM(mood, /datum/component/mood, C) + if(mood) + mood.add_event("tased", /datum/mood_event/tased) + if(C.dna && C.dna.check_mutation(HULK)) + C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + else if((C.status_flags & CANKNOCKDOWN) && !C.has_trait(TRAIT_STUNIMMUNE)) + addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) + +/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet + do_sparks(1, TRUE, src) + ..() diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm new file mode 100644 index 0000000000..6eebd6afbf --- /dev/null +++ b/code/modules/projectiles/projectile/energy/tesla.dm @@ -0,0 +1,31 @@ +/obj/item/projectile/energy/tesla + name = "tesla bolt" + icon_state = "tesla_projectile" + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser + var/chain + +/obj/item/projectile/energy/tesla/fire(setAngle) + if(firer) + chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) + ..() + +/obj/item/projectile/energy/tesla/Destroy() + qdel(chain) + return ..() + +/obj/item/projectile/energy/tesla/revolver + name = "energy orb" + +/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target) + . = ..() + if(isliving(target)) + tesla_zap(target, 3, 10000) + qdel(src) + +/obj/item/projectile/energy/tesla/cannon + name = "tesla orb" + +/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target) + . = ..() + tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE) + qdel(src) diff --git a/code/modules/projectiles/projectile/reusable/_reusable.dm b/code/modules/projectiles/projectile/reusable/_reusable.dm new file mode 100644 index 0000000000..33c9678fe4 --- /dev/null +++ b/code/modules/projectiles/projectile/reusable/_reusable.dm @@ -0,0 +1,20 @@ +/obj/item/projectile/bullet/reusable + name = "reusable bullet" + desc = "How do you even reuse a bullet?" + var/ammo_type = /obj/item/ammo_casing/caseless + var/dropped = FALSE + impact_effect_type = null + +/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE) + . = ..() + handle_drop() + +/obj/item/projectile/bullet/reusable/on_range() + handle_drop() + ..() + +/obj/item/projectile/bullet/reusable/proc/handle_drop() + if(!dropped) + var/turf/T = get_turf(src) + new ammo_type(T) + dropped = TRUE diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm similarity index 59% rename from code/modules/projectiles/projectile/reusable.dm rename to code/modules/projectiles/projectile/reusable/foam_dart.dm index ccd4b7589c..c7f99c75aa 100644 --- a/code/modules/projectiles/projectile/reusable.dm +++ b/code/modules/projectiles/projectile/reusable/foam_dart.dm @@ -1,69 +1,41 @@ -/obj/item/projectile/bullet/reusable - name = "reusable bullet" - desc = "How do you even reuse a bullet?" - var/ammo_type = /obj/item/ammo_casing/caseless - var/dropped = 0 - impact_effect_type = null - -/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE) - . = ..() - handle_drop() - -/obj/item/projectile/bullet/reusable/on_range() - handle_drop() - ..() - -/obj/item/projectile/bullet/reusable/proc/handle_drop() - if(!dropped) - var/turf/T = get_turf(src) - new ammo_type(T) - dropped = 1 - -/obj/item/projectile/bullet/reusable/magspear - name = "magnetic spear" - desc = "WHITE WHALE, HOLY GRAIL" - damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp - icon_state = "magspear" - ammo_type = /obj/item/ammo_casing/caseless/magspear - -/obj/item/projectile/bullet/reusable/foam_dart - name = "foam dart" - desc = "I hope you're wearing eye protection." - damage = 0 // It's a damn toy. - damage_type = OXY - nodamage = 1 - icon = 'icons/obj/guns/toy.dmi' - icon_state = "foamdart_proj" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - range = 10 - var/modified = 0 - var/obj/item/pen/pen = null - -/obj/item/projectile/bullet/reusable/foam_dart/handle_drop() - if(dropped) - return - var/turf/T = get_turf(src) - dropped = 1 - var/obj/item/ammo_casing/caseless/foam_dart/newcasing = new ammo_type(T) - newcasing.modified = modified - var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB - newdart.modified = modified - newdart.damage = damage - newdart.nodamage = nodamage - newdart.damage_type = damage_type - if(pen) - newdart.pen = pen - pen.forceMove(newdart) - pen = null - newdart.update_icon() - - -/obj/item/projectile/bullet/reusable/foam_dart/Destroy() - pen = null - return ..() - -/obj/item/projectile/bullet/reusable/foam_dart/riot - name = "riot foam dart" - icon_state = "foamdart_riot_proj" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - stamina = 25 +/obj/item/projectile/bullet/reusable/foam_dart + name = "foam dart" + desc = "I hope you're wearing eye protection." + damage = 0 // It's a damn toy. + damage_type = OXY + nodamage = 1 + icon = 'icons/obj/guns/toy.dmi' + icon_state = "foamdart_proj" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + range = 10 + var/modified = 0 + var/obj/item/pen/pen = null + +/obj/item/projectile/bullet/reusable/foam_dart/handle_drop() + if(dropped) + return + var/turf/T = get_turf(src) + dropped = 1 + var/obj/item/ammo_casing/caseless/foam_dart/newcasing = new ammo_type(T) + newcasing.modified = modified + var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB + newdart.modified = modified + newdart.damage = damage + newdart.nodamage = nodamage + newdart.damage_type = damage_type + if(pen) + newdart.pen = pen + pen.forceMove(newdart) + pen = null + newdart.update_icon() + + +/obj/item/projectile/bullet/reusable/foam_dart/Destroy() + pen = null + return ..() + +/obj/item/projectile/bullet/reusable/foam_dart/riot + name = "riot foam dart" + icon_state = "foamdart_riot_proj" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + stamina = 25 diff --git a/code/modules/projectiles/projectile/reusable/magspear.dm b/code/modules/projectiles/projectile/reusable/magspear.dm new file mode 100644 index 0000000000..7fcd6b80a6 --- /dev/null +++ b/code/modules/projectiles/projectile/reusable/magspear.dm @@ -0,0 +1,6 @@ +/obj/item/projectile/bullet/reusable/magspear + name = "magnetic spear" + desc = "WHITE WHALE, HOLY GRAIL" + damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp + icon_state = "magspear" + ammo_type = /obj/item/ammo_casing/caseless/magspear diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm deleted file mode 100644 index e8f309309a..0000000000 --- a/code/modules/projectiles/projectile/special.dm +++ /dev/null @@ -1,617 +0,0 @@ -/obj/item/projectile/ion - name = "ion bolt" - icon_state = "ion" - damage = 0 - damage_type = BURN - nodamage = 1 - flag = "energy" - impact_effect_type = /obj/effect/temp_visual/impact_effect/ion - - -/obj/item/projectile/ion/on_hit(atom/target, blocked = FALSE) - ..() - empulse(target, 1, 1) - return 1 - - -/obj/item/projectile/ion/weak - -/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = FALSE) - ..() - empulse(target, 0, 0) - return 1 - - -/obj/item/projectile/bullet/gyro - name ="explosive bolt" - icon_state= "bolter" - damage = 50 - -/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 0, 2) - return 1 - -/obj/item/projectile/bullet/a84mm - name ="anti-armour rocket" - desc = "USE A WEEL GUN" - icon_state= "atrocket" - damage = 80 - var/anti_armour_damage = 200 - armour_penetration = 100 - dismemberment = 100 - -/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE) - ..() - explosion(target, -1, 1, 3, 1, 0, flame_range = 4) - - if(ismecha(target)) - var/obj/mecha/M = target - M.take_damage(anti_armour_damage) - if(issilicon(target)) - var/mob/living/silicon/S = target - S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25) - return 1 - -/obj/item/projectile/bullet/srmrocket - name ="SRM-8 Rocket" - desc = "Boom." - icon_state = "missile" - damage = 30 - ricochets_max = 0 //it's a MISSILE - -/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0) - ..() - if(!isliving(target)) //if the target isn't alive, so is a wall or something - explosion(target, 0, 1, 2, 4) - else - explosion(target, 0, 0, 2, 4) - return 1 - -/obj/item/projectile/temp - name = "freeze beam" - icon_state = "ice_2" - damage = 0 - damage_type = BURN - nodamage = 1 - flag = "energy" - var/temperature = 100 - - -/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)//These two could likely check temp protection on the mob - ..() - if(isliving(target)) - var/mob/M = target - M.bodytemperature = temperature - return 1 - -/obj/item/projectile/temp/hot - name = "heat beam" - temperature = 400 - -/obj/item/projectile/meteor - name = "meteor" - icon = 'icons/obj/meteor.dmi' - icon_state = "small1" - damage = 0 - damage_type = BRUTE - nodamage = 1 - flag = "bullet" - -/obj/item/projectile/meteor/Collide(atom/A) - if(A == firer) - forceMove(A.loc) - return - A.ex_act(EXPLODE_HEAVY) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) - for(var/mob/M in urange(10, src)) - if(!M.stat) - shake_camera(M, 3, 1) - qdel(src) - -/obj/item/projectile/energy/floramut - name = "alpha somatoray" - icon_state = "energy" - damage = 0 - damage_type = TOX - nodamage = 1 - flag = "energy" - -/obj/item/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(C.dna.species.id == "pod") - C.randmuti() - C.randmut() - C.updateappearance() - C.domutcheck() - -/obj/item/projectile/energy/florayield - name = "beta somatoray" - icon_state = "energy2" - damage = 0 - damage_type = TOX - nodamage = 1 - flag = "energy" - -/obj/item/projectile/beam/mindflayer - name = "flayer ray" - -/obj/item/projectile/beam/mindflayer/on_hit(atom/target, blocked = FALSE) - . = ..() - if(ishuman(target)) - var/mob/living/carbon/human/M = target - M.adjustBrainLoss(20) - M.hallucination += 20 - -/obj/item/projectile/beam/wormhole - name = "bluespace beam" - icon_state = "spark" - hitsound = "sparks" - damage = 3 - var/obj/item/gun/energy/wormhole_projector/gun - color = "#33CCFF" - -/obj/item/projectile/beam/wormhole/orange - name = "orange bluespace beam" - color = "#FF6600" - -/obj/item/projectile/beam/wormhole/New(var/obj/item/ammo_casing/energy/wormhole/casing) - if(casing) - gun = casing.gun - -/obj/item/ammo_casing/energy/wormhole/New(var/obj/item/gun/energy/wormhole_projector/wh) - gun = wh - -/obj/item/projectile/beam/wormhole/on_hit(atom/target) - if(ismob(target)) - var/turf/portal_destination = pick(orange(6, src)) - do_teleport(target, portal_destination) - return ..() - if(!gun) - qdel(src) - gun.create_portal(src, get_turf(src)) - -/obj/item/projectile/plasma - name = "plasma blast" - icon_state = "plasmacutter" - damage_type = BRUTE - damage = 20 - range = 4 - dismemberment = 20 - impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser - var/pressure_decrease_active = FALSE - var/pressure_decrease = 0.25 - var/mine_range = 3 //mines this many additional tiles of rock - tracer_type = /obj/effect/projectile/tracer/plasma_cutter - muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter - impact_type = /obj/effect/projectile/impact/plasma_cutter - -/obj/item/projectile/plasma/Initialize() - . = ..() - if(!lavaland_equipment_pressure_check(get_turf(src))) - name = "weakened [name]" - damage = damage * pressure_decrease - pressure_decrease_active = TRUE - -/obj/item/projectile/plasma/on_hit(atom/target) - . = ..() - if(ismineralturf(target)) - var/turf/closed/mineral/M = target - M.gets_drilled(firer) - if(mine_range) - mine_range-- - range++ - if(range > 0) - return -1 - -/obj/item/projectile/plasma/adv - damage = 28 - range = 5 - mine_range = 5 - -/obj/item/projectile/plasma/adv/mech - damage = 40 - range = 9 - mine_range = 3 - -/obj/item/projectile/plasma/turret - //Between normal and advanced for damage, made a beam so not the turret does not destroy glass - name = "plasma beam" - damage = 24 - range = 7 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - - -/obj/item/projectile/gravityrepulse - name = "repulsion bolt" - icon = 'icons/effects/effects.dmi' - icon_state = "chronofield" - hitsound = 'sound/weapons/wave.ogg' - damage = 0 - damage_type = BRUTE - nodamage = 1 - color = "#33CCFF" - var/turf/T - var/power = 4 - var/list/thrown_items = list() - -/obj/item/projectile/gravityrepulse/Initialize() - . = ..() - var/obj/item/ammo_casing/energy/gravityrepulse/C = loc - if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items - power = min(C.gun.power, 15) - -/obj/item/projectile/gravityrepulse/on_hit() - . = ..() - T = get_turf(src) - for(var/atom/movable/A in range(T, power)) - if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) - continue - var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src))) - A.throw_at(throwtarget,power+1,1) - thrown_items[A] = A - for(var/turf/F in range(T,power)) - new /obj/effect/temp_visual/gravpush(F) - -/obj/item/projectile/gravityattract - name = "attraction bolt" - icon = 'icons/effects/effects.dmi' - icon_state = "chronofield" - hitsound = 'sound/weapons/wave.ogg' - damage = 0 - damage_type = BRUTE - nodamage = 1 - color = "#FF6600" - var/turf/T - var/power = 4 - var/list/thrown_items = list() - -/obj/item/projectile/gravityattract/Initialize() - . = ..() - var/obj/item/ammo_casing/energy/gravityattract/C = loc - if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items - power = min(C.gun.power, 15) - -/obj/item/projectile/gravityattract/on_hit() - . = ..() - T = get_turf(src) - for(var/atom/movable/A in range(T, power)) - if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) - continue - A.throw_at(T, power+1, 1) - thrown_items[A] = A - for(var/turf/F in range(T,power)) - new /obj/effect/temp_visual/gravpush(F) - -/obj/item/projectile/gravitychaos - name = "gravitational blast" - icon = 'icons/effects/effects.dmi' - icon_state = "chronofield" - hitsound = 'sound/weapons/wave.ogg' - damage = 0 - damage_type = BRUTE - nodamage = 1 - color = "#101010" - var/turf/T - var/power = 4 - var/list/thrown_items = list() - -/obj/item/projectile/gravitychaos/Initialize() - . = ..() - var/obj/item/ammo_casing/energy/gravitychaos/C = loc - if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items - power = min(C.gun.power, 15) - -/obj/item/projectile/gravitychaos/on_hit() - . = ..() - T = get_turf(src) - for(var/atom/movable/A in range(T, power)) - if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A]) - continue - A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1) - thrown_items[A] = A - for(var/turf/Z in range(T,power)) - new /obj/effect/temp_visual/gravpush(Z) - -/obj/effect/ebeam/curse_arm - name = "curse arm" - layer = LARGE_MOB_LAYER - -/obj/item/projectile/curse_hand - name = "curse hand" - icon_state = "cursehand" - hitsound = 'sound/effects/curse4.ogg' - layer = LARGE_MOB_LAYER - damage_type = BURN - damage = 10 - knockdown = 20 - speed = 2 - range = 16 - forcedodge = TRUE - var/datum/beam/arm - var/handedness = 0 - -/obj/item/projectile/curse_hand/Initialize(mapload) - . = ..() - handedness = prob(50) - update_icon() - -/obj/item/projectile/curse_hand/update_icon() - icon_state = "[icon_state][handedness]" - -/obj/item/projectile/curse_hand/fire(setAngle) - if(starting) - arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm) - ..() - -/obj/item/projectile/curse_hand/prehit(atom/target) - if(target == original) - forcedodge = FALSE - else if(!isturf(target)) - return FALSE - return ..() - -/obj/item/projectile/curse_hand/Destroy() - if(arm) - arm.End() - arm = null - if(forcedodge) - playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1) - var/turf/T = get_step(src, dir) - new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness) - for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting) - qdel(G) - new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir) - var/datum/beam/D = starting.Beam(T, icon_state = "curse[handedness]", time = 32, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm, beam_sleep_time = 1) - for(var/b in D.elements) - var/obj/effect/ebeam/B = b - animate(B, alpha = 0, time = 32) - return ..() - -/obj/item/projectile/hallucination - name = "bullet" - icon = null - icon_state = null - hitsound = "" - suppressed = TRUE - ricochets_max = 0 - ricochet_chance = 0 - damage = 0 - nodamage = TRUE - projectile_type = /obj/item/projectile/hallucination - log_override = TRUE - var/hal_icon_state - var/image/fake_icon - var/mob/living/carbon/hal_target - var/hal_fire_sound - var/hal_hitsound - var/hal_hitsound_wall - var/hal_impact_effect - var/hal_impact_effect_wall - var/hit_duration - var/hit_duration_wall - -/obj/item/projectile/hallucination/fire() - ..() - fake_icon = image('icons/obj/projectiles.dmi', src, hal_icon_state, ABOVE_MOB_LAYER) - if(hal_target.client) - hal_target.client.images += fake_icon - -/obj/item/projectile/hallucination/Destroy() - if(hal_target.client) - hal_target.client.images -= fake_icon - QDEL_NULL(fake_icon) - return ..() - -/obj/item/projectile/hallucination/Collide(atom/A) - if(!ismob(A)) - if(hal_hitsound_wall) - hal_target.playsound_local(loc, hal_hitsound_wall, 40, 1) - if(hal_impact_effect_wall) - spawn_hit(A, TRUE) - else if(A == hal_target) - if(hal_hitsound) - hal_target.playsound_local(A, hal_hitsound, 100, 1) - target_on_hit(A) - qdel(src) - return TRUE - -/obj/item/projectile/hallucination/proc/target_on_hit(mob/M) - if(M == hal_target) - to_chat(hal_target, "[M] is hit by \a [src] in the chest!") - hal_apply_effect() - else if(M in view(hal_target)) - to_chat(hal_target, "[M] is hit by \a [src] in the chest!!") - if(damage_type == BRUTE) - var/splatter_dir = dir - if(starting) - splatter_dir = get_dir(starting, get_turf(M)) - spawn_blood(M, splatter_dir) - else if(hal_impact_effect) - spawn_hit(M, FALSE) - -/obj/item/projectile/hallucination/proc/spawn_blood(mob/M, set_dir) - set waitfor = 0 - if(!hal_target.client) - return - - var/splatter_icon_state - if(set_dir in GLOB.diagonals) - splatter_icon_state = "splatter[pick(1, 2, 6)]" - else - splatter_icon_state = "splatter[pick(3, 4, 5)]" - - var/image/blood = image('icons/effects/blood.dmi', M, splatter_icon_state, ABOVE_MOB_LAYER) - 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 = ABOVE_MOB_LAYER - 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 = ABOVE_MOB_LAYER - if(SOUTHWEST) - target_pixel_x = -16 - target_pixel_y = -16 - layer = ABOVE_MOB_LAYER - hal_target.client.images += blood - animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5) - addtimer(CALLBACK(src, .proc/cleanup_blood), 5) - -/obj/item/projectile/hallucination/proc/cleanup_blood(image/blood) - hal_target.client.images -= blood - qdel(blood) - -/obj/item/projectile/hallucination/proc/spawn_hit(atom/A, is_wall) - set waitfor = 0 - if(!hal_target.client) - return - - var/image/hit_effect = image('icons/effects/blood.dmi', A, is_wall ? hal_impact_effect_wall : hal_impact_effect, ABOVE_MOB_LAYER) - hit_effect.pixel_x = A.pixel_x + rand(-4,4) - hit_effect.pixel_y = A.pixel_y + rand(-4,4) - hal_target.client.images += hit_effect - sleep(is_wall ? hit_duration_wall : hit_duration) - hal_target.client.images -= hit_effect - qdel(hit_effect) - - -/obj/item/projectile/hallucination/proc/hal_apply_effect() - return - -/obj/item/projectile/hallucination/bullet - name = "bullet" - hal_icon_state = "bullet" - hal_fire_sound = "gunshot" - hal_hitsound = 'sound/weapons/pierce.ogg' - hal_hitsound_wall = "ricochet" - hal_impact_effect = "impact_bullet" - hal_impact_effect_wall = "impact_bullet" - hit_duration = 5 - hit_duration_wall = 5 - -/obj/item/projectile/hallucination/bullet/hal_apply_effect() - hal_target.adjustStaminaLoss(60) - -/obj/item/projectile/hallucination/laser - name = "laser" - damage_type = BURN - hal_icon_state = "laser" - hal_fire_sound = 'sound/weapons/laser.ogg' - hal_hitsound = 'sound/weapons/sear.ogg' - hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' - hal_impact_effect = "impact_laser" - hal_impact_effect_wall = "impact_laser_wall" - hit_duration = 4 - hit_duration_wall = 10 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - -/obj/item/projectile/hallucination/laser/hal_apply_effect() - hal_target.adjustStaminaLoss(20) - hal_target.blur_eyes(2) - -/obj/item/projectile/hallucination/taser - name = "electrode" - damage_type = BURN - hal_icon_state = "spark" - color = "#FFFF00" - hal_fire_sound = 'sound/weapons/taser.ogg' - hal_hitsound = 'sound/weapons/taserhit.ogg' - hal_hitsound_wall = null - hal_impact_effect = null - hal_impact_effect_wall = null - -/obj/item/projectile/hallucination/taser/hal_apply_effect() - hal_target.Knockdown(100) - hal_target.stuttering += 20 - if(hal_target.dna && hal_target.dna.check_mutation(HULK)) - hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - else if((hal_target.status_flags & CANKNOCKDOWN) && !hal_target.has_trait(TRAIT_STUNIMMUNE)) - addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5) - -/obj/item/projectile/hallucination/disabler - name = "disabler beam" - damage_type = STAMINA - hal_icon_state = "omnilaser" - hal_fire_sound = 'sound/weapons/taser2.ogg' - hal_hitsound = 'sound/weapons/tap.ogg' - hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' - hal_impact_effect = "impact_laser_blue" - hal_impact_effect_wall = null - hit_duration = 4 - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - -/obj/item/projectile/hallucination/disabler/hal_apply_effect() - hal_target.adjustStaminaLoss(25) - -/obj/item/projectile/hallucination/ebow - name = "bolt" - damage_type = TOX - hal_icon_state = "cbbolt" - hal_fire_sound = 'sound/weapons/genhit.ogg' - hal_hitsound = null - hal_hitsound_wall = null - hal_impact_effect = null - hal_impact_effect_wall = null - -/obj/item/projectile/hallucination/ebow/hal_apply_effect() - hal_target.Knockdown(100) - hal_target.stuttering += 5 - hal_target.adjustStaminaLoss(8) - -/obj/item/projectile/hallucination/change - name = "bolt of change" - damage_type = BURN - hal_icon_state = "ice_1" - hal_fire_sound = 'sound/magic/staff_change.ogg' - hal_hitsound = null - hal_hitsound_wall = null - hal_impact_effect = null - hal_impact_effect_wall = null - -/obj/item/projectile/hallucination/change/hal_apply_effect() - new /datum/hallucination/self_delusion(hal_target, TRUE, wabbajack = FALSE) - -/obj/item/projectile/hallucination/death - name = "bolt of death" - damage_type = BURN - hal_icon_state = "pulse1_bl" - hal_fire_sound = 'sound/magic/wandodeath.ogg' - hal_hitsound = null - hal_hitsound_wall = null - hal_impact_effect = null - hal_impact_effect_wall = null - -/obj/item/projectile/hallucination/death/hal_apply_effect() - new /datum/hallucination/death(hal_target, TRUE) - -// Neurotoxin - -/obj/item/projectile/bullet/neurotoxin - name = "neurotoxin spit" - icon_state = "neurotoxin" - damage = 5 - damage_type = TOX - knockdown = 100 - -/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE) - if(isalien(target)) - knockdown = 0 - nodamage = TRUE - return ..() diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm new file mode 100644 index 0000000000..e5ac8126dd --- /dev/null +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -0,0 +1,55 @@ +/obj/effect/ebeam/curse_arm + name = "curse arm" + layer = LARGE_MOB_LAYER + +/obj/item/projectile/curse_hand + name = "curse hand" + icon_state = "cursehand" + hitsound = 'sound/effects/curse4.ogg' + layer = LARGE_MOB_LAYER + damage_type = BURN + damage = 10 + knockdown = 20 + speed = 2 + range = 16 + forcedodge = TRUE + var/datum/beam/arm + var/handedness = 0 + +/obj/item/projectile/curse_hand/Initialize(mapload) + . = ..() + handedness = prob(50) + update_icon() + +/obj/item/projectile/curse_hand/update_icon() + icon_state = "[icon_state][handedness]" + +/obj/item/projectile/curse_hand/fire(setAngle) + if(starting) + arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm) + ..() + +/obj/item/projectile/curse_hand/prehit(atom/target) + if(target == original) + forcedodge = FALSE + else if(!isturf(target)) + return FALSE + return ..() + +/obj/item/projectile/curse_hand/Destroy() + if(arm) + arm.End() + arm = null + if(forcedodge) + playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1) + var/turf/T = get_step(src, dir) + new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness) + for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting) + qdel(G) + new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir) + var/datum/beam/D = starting.Beam(T, icon_state = "curse[handedness]", time = 32, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm, beam_sleep_time = 1) + for(var/b in D.elements) + var/obj/effect/ebeam/B = b + animate(B, alpha = 0, time = 32) + return ..() + diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm new file mode 100644 index 0000000000..295f89148a --- /dev/null +++ b/code/modules/projectiles/projectile/special/floral.dm @@ -0,0 +1,25 @@ +/obj/item/projectile/energy/floramut + name = "alpha somatoray" + icon_state = "energy" + damage = 0 + damage_type = TOX + nodamage = 1 + flag = "energy" + +/obj/item/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(C.dna.species.id == "pod") + C.randmuti() + C.randmut() + C.updateappearance() + C.domutcheck() + +/obj/item/projectile/energy/florayield + name = "beta somatoray" + icon_state = "energy2" + damage = 0 + damage_type = TOX + nodamage = 1 + flag = "energy" diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm new file mode 100644 index 0000000000..89f753d36d --- /dev/null +++ b/code/modules/projectiles/projectile/special/gravity.dm @@ -0,0 +1,90 @@ +/obj/item/projectile/gravityrepulse + name = "repulsion bolt" + icon = 'icons/effects/effects.dmi' + icon_state = "chronofield" + hitsound = 'sound/weapons/wave.ogg' + damage = 0 + damage_type = BRUTE + nodamage = 1 + color = "#33CCFF" + var/turf/T + var/power = 4 + var/list/thrown_items = list() + +/obj/item/projectile/gravityrepulse/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravityrepulse/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items + power = min(C.gun.power, 15) + +/obj/item/projectile/gravityrepulse/on_hit() + . = ..() + T = get_turf(src) + for(var/atom/movable/A in range(T, power)) + if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) + continue + var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src))) + A.throw_at(throwtarget,power+1,1) + thrown_items[A] = A + for(var/turf/F in range(T,power)) + new /obj/effect/temp_visual/gravpush(F) + +/obj/item/projectile/gravityattract + name = "attraction bolt" + icon = 'icons/effects/effects.dmi' + icon_state = "chronofield" + hitsound = 'sound/weapons/wave.ogg' + damage = 0 + damage_type = BRUTE + nodamage = 1 + color = "#FF6600" + var/turf/T + var/power = 4 + var/list/thrown_items = list() + +/obj/item/projectile/gravityattract/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravityattract/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items + power = min(C.gun.power, 15) + +/obj/item/projectile/gravityattract/on_hit() + . = ..() + T = get_turf(src) + for(var/atom/movable/A in range(T, power)) + if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A]) + continue + A.throw_at(T, power+1, 1) + thrown_items[A] = A + for(var/turf/F in range(T,power)) + new /obj/effect/temp_visual/gravpush(F) + +/obj/item/projectile/gravitychaos + name = "gravitational blast" + icon = 'icons/effects/effects.dmi' + icon_state = "chronofield" + hitsound = 'sound/weapons/wave.ogg' + damage = 0 + damage_type = BRUTE + nodamage = 1 + color = "#101010" + var/turf/T + var/power = 4 + var/list/thrown_items = list() + +/obj/item/projectile/gravitychaos/Initialize() + . = ..() + var/obj/item/ammo_casing/energy/gravitychaos/C = loc + if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items + power = min(C.gun.power, 15) + +/obj/item/projectile/gravitychaos/on_hit() + . = ..() + T = get_turf(src) + for(var/atom/movable/A in range(T, power)) + if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A]) + continue + A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1) + thrown_items[A] = A + for(var/turf/Z in range(T,power)) + new /obj/effect/temp_visual/gravpush(Z) diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm new file mode 100644 index 0000000000..e158ed89f0 --- /dev/null +++ b/code/modules/projectiles/projectile/special/hallucination.dm @@ -0,0 +1,230 @@ +/obj/item/projectile/hallucination + name = "bullet" + icon = null + icon_state = null + hitsound = "" + suppressed = TRUE + ricochets_max = 0 + ricochet_chance = 0 + damage = 0 + nodamage = TRUE + projectile_type = /obj/item/projectile/hallucination + log_override = TRUE + var/hal_icon_state + var/image/fake_icon + var/mob/living/carbon/hal_target + var/hal_fire_sound + var/hal_hitsound + var/hal_hitsound_wall + var/hal_impact_effect + var/hal_impact_effect_wall + var/hit_duration + var/hit_duration_wall + +/obj/item/projectile/hallucination/fire() + ..() + fake_icon = image('icons/obj/projectiles.dmi', src, hal_icon_state, ABOVE_MOB_LAYER) + if(hal_target.client) + hal_target.client.images += fake_icon + +/obj/item/projectile/hallucination/Destroy() + if(hal_target.client) + hal_target.client.images -= fake_icon + QDEL_NULL(fake_icon) + return ..() + +/obj/item/projectile/hallucination/Collide(atom/A) + if(!ismob(A)) + if(hal_hitsound_wall) + hal_target.playsound_local(loc, hal_hitsound_wall, 40, 1) + if(hal_impact_effect_wall) + spawn_hit(A, TRUE) + else if(A == hal_target) + if(hal_hitsound) + hal_target.playsound_local(A, hal_hitsound, 100, 1) + target_on_hit(A) + qdel(src) + return TRUE + +/obj/item/projectile/hallucination/proc/target_on_hit(mob/M) + if(M == hal_target) + to_chat(hal_target, "[M] is hit by \a [src] in the chest!") + hal_apply_effect() + else if(M in view(hal_target)) + to_chat(hal_target, "[M] is hit by \a [src] in the chest!!") + if(damage_type == BRUTE) + var/splatter_dir = dir + if(starting) + splatter_dir = get_dir(starting, get_turf(M)) + spawn_blood(M, splatter_dir) + else if(hal_impact_effect) + spawn_hit(M, FALSE) + +/obj/item/projectile/hallucination/proc/spawn_blood(mob/M, set_dir) + set waitfor = 0 + if(!hal_target.client) + return + + var/splatter_icon_state + if(set_dir in GLOB.diagonals) + splatter_icon_state = "splatter[pick(1, 2, 6)]" + else + splatter_icon_state = "splatter[pick(3, 4, 5)]" + + var/image/blood = image('icons/effects/blood.dmi', M, splatter_icon_state, ABOVE_MOB_LAYER) + 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 = ABOVE_MOB_LAYER + 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 = ABOVE_MOB_LAYER + if(SOUTHWEST) + target_pixel_x = -16 + target_pixel_y = -16 + layer = ABOVE_MOB_LAYER + hal_target.client.images += blood + animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5) + addtimer(CALLBACK(src, .proc/cleanup_blood), 5) + +/obj/item/projectile/hallucination/proc/cleanup_blood(image/blood) + hal_target.client.images -= blood + qdel(blood) + +/obj/item/projectile/hallucination/proc/spawn_hit(atom/A, is_wall) + set waitfor = 0 + if(!hal_target.client) + return + + var/image/hit_effect = image('icons/effects/blood.dmi', A, is_wall ? hal_impact_effect_wall : hal_impact_effect, ABOVE_MOB_LAYER) + hit_effect.pixel_x = A.pixel_x + rand(-4,4) + hit_effect.pixel_y = A.pixel_y + rand(-4,4) + hal_target.client.images += hit_effect + sleep(is_wall ? hit_duration_wall : hit_duration) + hal_target.client.images -= hit_effect + qdel(hit_effect) + + +/obj/item/projectile/hallucination/proc/hal_apply_effect() + return + +/obj/item/projectile/hallucination/bullet + name = "bullet" + hal_icon_state = "bullet" + hal_fire_sound = "gunshot" + hal_hitsound = 'sound/weapons/pierce.ogg' + hal_hitsound_wall = "ricochet" + hal_impact_effect = "impact_bullet" + hal_impact_effect_wall = "impact_bullet" + hit_duration = 5 + hit_duration_wall = 5 + +/obj/item/projectile/hallucination/bullet/hal_apply_effect() + hal_target.adjustStaminaLoss(60) + +/obj/item/projectile/hallucination/laser + name = "laser" + damage_type = BURN + hal_icon_state = "laser" + hal_fire_sound = 'sound/weapons/laser.ogg' + hal_hitsound = 'sound/weapons/sear.ogg' + hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' + hal_impact_effect = "impact_laser" + hal_impact_effect_wall = "impact_laser_wall" + hit_duration = 4 + hit_duration_wall = 10 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + +/obj/item/projectile/hallucination/laser/hal_apply_effect() + hal_target.adjustStaminaLoss(20) + hal_target.blur_eyes(2) + +/obj/item/projectile/hallucination/taser + name = "electrode" + damage_type = BURN + hal_icon_state = "spark" + color = "#FFFF00" + hal_fire_sound = 'sound/weapons/taser.ogg' + hal_hitsound = 'sound/weapons/taserhit.ogg' + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/taser/hal_apply_effect() + hal_target.Knockdown(100) + hal_target.stuttering += 20 + if(hal_target.dna && hal_target.dna.check_mutation(HULK)) + hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + else if((hal_target.status_flags & CANKNOCKDOWN) && !hal_target.has_trait(TRAIT_STUNIMMUNE)) + addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5) + +/obj/item/projectile/hallucination/disabler + name = "disabler beam" + damage_type = STAMINA + hal_icon_state = "omnilaser" + hal_fire_sound = 'sound/weapons/taser2.ogg' + hal_hitsound = 'sound/weapons/tap.ogg' + hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' + hal_impact_effect = "impact_laser_blue" + hal_impact_effect_wall = null + hit_duration = 4 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + +/obj/item/projectile/hallucination/disabler/hal_apply_effect() + hal_target.adjustStaminaLoss(25) + +/obj/item/projectile/hallucination/ebow + name = "bolt" + damage_type = TOX + hal_icon_state = "cbbolt" + hal_fire_sound = 'sound/weapons/genhit.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/ebow/hal_apply_effect() + hal_target.Knockdown(100) + hal_target.stuttering += 5 + hal_target.adjustStaminaLoss(8) + +/obj/item/projectile/hallucination/change + name = "bolt of change" + damage_type = BURN + hal_icon_state = "ice_1" + hal_fire_sound = 'sound/magic/staff_change.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/change/hal_apply_effect() + new /datum/hallucination/self_delusion(hal_target, TRUE, wabbajack = FALSE) + +/obj/item/projectile/hallucination/death + name = "bolt of death" + damage_type = BURN + hal_icon_state = "pulse1_bl" + hal_fire_sound = 'sound/magic/wandodeath.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/death/hal_apply_effect() + new /datum/hallucination/death(hal_target, TRUE) diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm new file mode 100644 index 0000000000..403a1bedd7 --- /dev/null +++ b/code/modules/projectiles/projectile/special/ion.dm @@ -0,0 +1,20 @@ +/obj/item/projectile/ion + name = "ion bolt" + icon_state = "ion" + damage = 0 + damage_type = BURN + nodamage = 1 + flag = "energy" + impact_effect_type = /obj/effect/temp_visual/impact_effect/ion + +/obj/item/projectile/ion/on_hit(atom/target, blocked = FALSE) + ..() + empulse(target, 1, 1) + return TRUE + +/obj/item/projectile/ion/weak + +/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = FALSE) + ..() + empulse(target, 0, 0) + return TRUE diff --git a/code/modules/projectiles/projectile/special/meteor.dm b/code/modules/projectiles/projectile/special/meteor.dm new file mode 100644 index 0000000000..f4e60998e1 --- /dev/null +++ b/code/modules/projectiles/projectile/special/meteor.dm @@ -0,0 +1,19 @@ +/obj/item/projectile/meteor + name = "meteor" + icon = 'icons/obj/meteor.dmi' + icon_state = "small1" + damage = 0 + damage_type = BRUTE + nodamage = 1 + flag = "bullet" + +/obj/item/projectile/meteor/Collide(atom/A) + if(A == firer) + forceMove(A.loc) + return + A.ex_act(EXPLODE_HEAVY) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) + for(var/mob/M in urange(10, src)) + if(!M.stat) + shake_camera(M, 3, 1) + qdel(src) diff --git a/code/modules/projectiles/projectile/special/mindflayer.dm b/code/modules/projectiles/projectile/special/mindflayer.dm new file mode 100644 index 0000000000..eaa998f7e0 --- /dev/null +++ b/code/modules/projectiles/projectile/special/mindflayer.dm @@ -0,0 +1,9 @@ +/obj/item/projectile/beam/mindflayer + name = "flayer ray" + +/obj/item/projectile/beam/mindflayer/on_hit(atom/target, blocked = FALSE) + . = ..() + if(ishuman(target)) + var/mob/living/carbon/human/M = target + M.adjustBrainLoss(20) + M.hallucination += 20 diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm new file mode 100644 index 0000000000..46027e7bdf --- /dev/null +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -0,0 +1,12 @@ +/obj/item/projectile/bullet/neurotoxin + name = "neurotoxin spit" + icon_state = "neurotoxin" + damage = 5 + damage_type = TOX + knockdown = 100 + +/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE) + if(isalien(target)) + knockdown = 0 + nodamage = TRUE + return ..() diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm new file mode 100644 index 0000000000..aeafb6157a --- /dev/null +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -0,0 +1,49 @@ +/obj/item/projectile/plasma + name = "plasma blast" + icon_state = "plasmacutter" + damage_type = BRUTE + damage = 20 + range = 4 + dismemberment = 20 + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser + var/pressure_decrease_active = FALSE + var/pressure_decrease = 0.25 + var/mine_range = 3 //mines this many additional tiles of rock + tracer_type = /obj/effect/projectile/tracer/plasma_cutter + muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter + impact_type = /obj/effect/projectile/impact/plasma_cutter + +/obj/item/projectile/plasma/Initialize() + . = ..() + if(!lavaland_equipment_pressure_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + +/obj/item/projectile/plasma/on_hit(atom/target) + . = ..() + if(ismineralturf(target)) + var/turf/closed/mineral/M = target + M.gets_drilled(firer) + if(mine_range) + mine_range-- + range++ + if(range > 0) + return -1 + +/obj/item/projectile/plasma/adv + damage = 28 + range = 5 + mine_range = 5 + +/obj/item/projectile/plasma/adv/mech + damage = 40 + range = 9 + mine_range = 3 + +/obj/item/projectile/plasma/turret + //Between normal and advanced for damage, made a beam so not the turret does not destroy glass + name = "plasma beam" + damage = 24 + range = 7 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm new file mode 100644 index 0000000000..6518b2a4d5 --- /dev/null +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -0,0 +1,45 @@ +/obj/item/projectile/bullet/gyro + name ="explosive bolt" + icon_state= "bolter" + damage = 50 + +/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 0, 2) + return TRUE + +/obj/item/projectile/bullet/a84mm + name ="anti-armour rocket" + desc = "USE A WEEL GUN" + icon_state= "atrocket" + damage = 80 + var/anti_armour_damage = 200 + armour_penetration = 100 + dismemberment = 100 + +/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 1, 3, 1, 0, flame_range = 4) + + if(ismecha(target)) + var/obj/mecha/M = target + M.take_damage(anti_armour_damage) + if(issilicon(target)) + var/mob/living/silicon/S = target + S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25) + return TRUE + +/obj/item/projectile/bullet/srmrocket + name ="SRM-8 Rocket" + desc = "Boom." + icon_state = "missile" + damage = 30 + ricochets_max = 0 //it's a MISSILE + +/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0) + ..() + if(!isliving(target)) //if the target isn't alive, so is a wall or something + explosion(target, 0, 1, 2, 4) + else + explosion(target, 0, 0, 2, 4) + return TRUE diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm new file mode 100644 index 0000000000..7fb9c6efb2 --- /dev/null +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -0,0 +1,19 @@ +/obj/item/projectile/temp + name = "freeze beam" + icon_state = "ice_2" + damage = 0 + damage_type = BURN + nodamage = FALSE + flag = "energy" + var/temperature = 100 + +/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)//These two could likely check temp protection on the mob + ..() + if(isliving(target)) + var/mob/M = target + M.bodytemperature = temperature + return TRUE + +/obj/item/projectile/temp/hot + name = "heat beam" + temperature = 400 diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm new file mode 100644 index 0000000000..94ef5b9a23 --- /dev/null +++ b/code/modules/projectiles/projectile/special/wormhole.dm @@ -0,0 +1,25 @@ +/obj/item/projectile/beam/wormhole + name = "bluespace beam" + icon_state = "spark" + hitsound = "sparks" + damage = 3 + var/obj/item/gun/energy/wormhole_projector/gun + color = "#33CCFF" + +/obj/item/projectile/beam/wormhole/orange + name = "orange bluespace beam" + color = "#FF6600" + +/obj/item/projectile/beam/wormhole/Initialize(mapload, obj/item/ammo_casing/energy/wormhole/casing) + . = ..() + if(casing) + gun = casing.gun + +/obj/item/projectile/beam/wormhole/on_hit(atom/target) + if(ismob(target)) + var/turf/portal_destination = pick(orange(6, src)) + do_teleport(target, portal_destination) + return ..() + if(!gun) + qdel(src) + gun.create_portal(src, get_turf(src)) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 0f3ac0e1bc..2a650f3381 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -251,7 +251,7 @@ R.handle_reactions() return amount -/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = 0) +/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = FALSE, liverless = FALSE) var/list/cached_reagents = reagent_list var/list/cached_addictions = addiction_list if(C) @@ -261,6 +261,8 @@ var/datum/reagent/R = reagent if(QDELETED(R.holder)) continue + if(liverless && !R.self_consuming) //need to be metabolized + continue if(!C) C = R.holder.my_atom if(C && R) @@ -301,6 +303,9 @@ need_mob_update += R.addiction_act_stage4(C) if(40 to INFINITY) to_chat(C, "You feel like you've gotten over your need for [R.name].") + GET_COMPONENT_FROM(mood, /datum/component/mood, C) + if(mood) + mood.clear_event("[R.id]_addiction") cached_addictions.Remove(R) addiction_tick++ if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index ce4e1f7ad2..3b06b4c71e 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -16,6 +16,8 @@ var/recharged = 0 var/recharge_delay = 5 var/mutable_appearance/beaker_overlay + var/working_state = "dispenser_working" + var/nopower_state = "dispenser_nopower" var/obj/item/reagent_containers/beaker = null var/list/dispensable_reagents = list( "hydrogen", @@ -60,6 +62,7 @@ cell = new cell_type recharge() dispensable_reagents = sortList(dispensable_reagents) + update_icon() /obj/machinery/chem_dispenser/Destroy() QDEL_NULL(beaker) @@ -67,13 +70,36 @@ return ..() /obj/machinery/chem_dispenser/process() - if(recharged < 0) recharge() recharged = recharge_delay else recharged -= 1 +/obj/machinery/chem_dispenser/proc/display_beaker() + ..() + var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker") + b_o.pixel_y = -4 + b_o.pixel_x = -7 + return b_o + +obj/machinery/chem_dispenser/proc/work_animation() + if(working_state) + flick(working_state,src) + +/obj/machinery/chem_dispenser/power_change() + ..() + if(!powered() && nopower_state) + icon_state = nopower_state + else + icon_state = initial(icon_state) + +obj/machinery/chem_dispenser/update_icon() + cut_overlays() + if(beaker) + beaker_overlay = display_beaker() + add_overlay(beaker_overlay) + /obj/machinery/chem_dispenser/proc/recharge() if(stat & (BROKEN|NOPOWER)) return @@ -163,6 +189,7 @@ var/target = text2num(params["target"]) if(target in beaker.possible_transfer_amounts) amount = target + work_animation() . = TRUE if("dispense") var/reagent = params["reagent"] @@ -173,11 +200,13 @@ R.add_reagent(reagent, actual) cell.use((actual / 10) / powerefficiency) + work_animation() . = TRUE if("remove") var/amount = text2num(params["amount"]) if(beaker && amount in beaker.possible_transfer_amounts) beaker.reagents.remove_all(amount) + work_animation() . = TRUE if("eject") if(beaker) @@ -185,7 +214,7 @@ if(Adjacent(usr) && !issilicon(usr)) usr.put_in_hands(beaker) beaker = null - cut_overlays() + update_icon() . = TRUE if("dispense_recipe") var/recipe_to_use = params["recipe"] @@ -200,6 +229,7 @@ if(actual) R.add_reagent(r_id, actual) cell.use((actual / 10) / powerefficiency) + work_animation() if("clear_recipes") var/yesno = alert("Clear all recipes?",, "Yes","No") if(yesno == "Yes") @@ -226,23 +256,17 @@ /obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params) if(default_unfasten_wrench(user, I)) return - if(istype(I, /obj/item/reagent_containers) && !(I.flags_1 & ABSTRACT_1) && I.is_open_container()) var/obj/item/reagent_containers/B = I . = 1 //no afterattack if(beaker) to_chat(user, "A container is already loaded into [src]!") return - if(!user.transferItemToLoc(B, src)) return - beaker = B to_chat(user, "You add [B] to [src].") - - beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker") - beaker_overlay.pixel_x = rand(-10, 5)//randomize beaker overlay position. - add_overlay(beaker_overlay) + update_icon() else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/card/emag)) to_chat(user, "You can't load [I] into [src]!") return ..() @@ -266,6 +290,7 @@ beaker.reagents.remove_all() cell.use(total/powerefficiency) cell.emp_act(severity) + work_animation() visible_message("[src] malfunctions, spraying chemicals everywhere!") ..() @@ -278,6 +303,8 @@ recharge_delay = 20 dispensable_reagents = list() circuit = /obj/item/circuitboard/machine/chem_dispenser + working_state = "minidispenser_working" + nopower_state = "minidispenser_nopower" var/static/list/dispensable_reagent_tiers = list( list( "hydrogen", @@ -362,6 +389,29 @@ final_list += list(avoid_assoc_duplicate_keys(fuck[1],key_list) = text2num(fuck[2])) return final_list +/obj/machinery/chem_dispenser/constructable/display_beaker() + var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker") + b_o.pixel_y = -4 + b_o.pixel_x = -4 + return b_o + +/obj/machinery/chem_dispenser/drinks/display_beaker() + var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker") + switch(dir) + if(NORTH) + b_o.pixel_y = 7 + b_o.pixel_x = rand(-9, 9) + if(EAST) + b_o.pixel_x = 4 + b_o.pixel_y = rand(-5, 7) + if(WEST) + b_o.pixel_x = -5 + b_o.pixel_y = rand(-5, 7) + else//SOUTH + b_o.pixel_y = -7 + b_o.pixel_x = rand(-9, 9) + return b_o + /obj/machinery/chem_dispenser/drinks name = "soda dispenser" desc = "Contains a large reservoir of soft drinks." @@ -369,6 +419,10 @@ icon = 'icons/obj/chemical.dmi' icon_state = "soda_dispenser" amount = 10 + pixel_y = 6 + layer = WALL_OBJ_LAYER + working_state = null + nopower_state = null dispensable_reagents = list( "water", "ice", @@ -398,8 +452,6 @@ "tirizene" ) - - /obj/machinery/chem_dispenser/drinks/beer name = "booze dispenser" desc = "Contains a large reservoir of the good stuff." diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index b14d436df5..c6ca72ad4a 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -57,7 +57,7 @@ if(istype(D, /datum/disease/advance)) var/datum/disease/advance/A = D var/disease_name = SSdisease.get_disease_name(A.GetDiseaseID()) - if(disease_name == "Unknown") + if((disease_name == "Unknown") && A.mutable) this["can_rename"] = TRUE this["name"] = disease_name this["is_adv"] = TRUE @@ -180,17 +180,21 @@ if("rename_disease") var/id = get_virus_id_by_index(text2num(params["index"])) var/datum/disease/advance/A = SSdisease.archive_diseases[id] + if(!A.mutable) + return if(A) var/new_name = stripped_input(usr, "Name the disease", "New name", "", MAX_NAME_LEN) if(!new_name || ..()) return A.AssignName(new_name) - for(var/datum/disease/advance/AD in SSdisease.active_diseases) - AD.Refresh() . = TRUE if("create_culture_bottle") var/id = get_virus_id_by_index(text2num(params["index"])) - var/datum/disease/advance/A = new(FALSE, SSdisease.archive_diseases[id]) + var/datum/disease/advance/A = SSdisease.archive_diseases[id] + if(!A.mutable) + to_chat(usr, "ERROR: Cannot replicate virus strain.") + return + A = A.Copy() var/list/data = list("viruses" = list(A)) var/obj/item/reagent_containers/glass/bottle/B = new(drop_location()) B.name = "[A.name] culture bottle" diff --git a/code/modules/reagents/chemistry/machinery/scp_294.dm b/code/modules/reagents/chemistry/machinery/scp_294.dm index f7d6473358..5aa09d407b 100644 --- a/code/modules/reagents/chemistry/machinery/scp_294.dm +++ b/code/modules/reagents/chemistry/machinery/scp_294.dm @@ -14,6 +14,8 @@ icon_state = "294_bottom" amount = 10 resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + working_state = null + nopower_state = null var/static/list/shortcuts = list( "meth" = "methamphetamine", "tricord" = "tricordrazine" @@ -23,9 +25,9 @@ /obj/machinery/chem_dispenser/scp_294/Initialize() . = ..() GLOB.poi_list += src - top_overlay = mutable_appearance(icon, "294_top", layer = ABOVE_MOB_LAYER) + top_overlay = mutable_appearance(icon, "294_top", layer = ABOVE_ALL_MOB_LAYER) update_icon() - + /obj/machinery/chem_dispenser/scp_294/update_icon() cut_overlays() @@ -36,6 +38,9 @@ GLOB.poi_list -= src QDEL_NULL(top_overlay) +/obj/machinery/chem_dispenser/scp_294/display_beaker() + return + /obj/machinery/chem_dispenser/scp_294/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index 7c24f786af..56cec26dd3 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -37,10 +37,13 @@ /obj/machinery/smoke_machine/update_icon() if((!is_operational()) || (!on) || (reagents.total_volume == 0)) - icon_state = "smoke0" + if (panel_open) + icon_state = "smoke0-o" + else + icon_state = "smoke0" else icon_state = "smoke1" - . = ..() + return ..() /obj/machinery/smoke_machine/RefreshParts() var/new_volume = REAGENTS_BASE_VOLUME @@ -62,15 +65,16 @@ /obj/machinery/smoke_machine/process() ..() - update_icon() if(!is_operational()) return if(reagents.total_volume == 0) on = FALSE + update_icon() return var/turf/T = get_turf(src) var/smoke_test = locate(/obj/effect/particle_effect/smoke) in T if(on && !smoke_test) + update_icon() var/datum/effect_system/smoke_spread/chem/smoke_machine/smoke = new() smoke.set_up(reagents, setting*3, efficiency, T) smoke.start() @@ -87,6 +91,10 @@ if(default_unfasten_wrench(user, I, 40)) on = FALSE return + if(default_deconstruction_screwdriver(user, "smoke0-o", "smoke0", I)) + return + if(default_deconstruction_crowbar(I)) + return return ..() /obj/machinery/smoke_machine/deconstruct() @@ -124,6 +132,7 @@ switch(action) if("purge") reagents.clear_reagents() + update_icon() . = TRUE if("setting") var/amount = text2num(params["amount"]) @@ -132,6 +141,7 @@ . = TRUE if("power") on = !on + update_icon() if(on) message_admins("[key_name_admin(usr)] activated a smoke machine that contains [english_list(reagents.reagent_list)] at [ADMIN_COORDJMP(src)].") log_game("[key_name(usr)] activated a smoke machine that contains [english_list(reagents.reagent_list)] at [COORD(src)].") diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 4ca1efa4e7..a1a65409a1 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -31,6 +31,7 @@ var/addiction_threshold = 0 var/addiction_stage = 0 var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick. + var/self_consuming = FALSE /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() @@ -90,24 +91,39 @@ /datum/reagent/proc/overdose_start(mob/living/M) to_chat(M, "You feel like you took too much of [name]!") + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("[id]_overdose", /datum/mood_event/drugs/overdose, name) return /datum/reagent/proc/addiction_act_stage1(mob/living/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_light, name) if(prob(30)) to_chat(M, "You feel like having some [name] right about now.") return /datum/reagent/proc/addiction_act_stage2(mob/living/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_medium, name) if(prob(30)) to_chat(M, "You feel like you need [name]. You just can't get enough.") return /datum/reagent/proc/addiction_act_stage3(mob/living/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_severe, name) if(prob(30)) to_chat(M, "You have an intense craving for [name].") return /datum/reagent/proc/addiction_act_stage4(mob/living/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("[id]_overdose", /datum/mood_event/drugs/withdrawal_critical, name) if(prob(30)) to_chat(M, "You're not feeling good at all! You really need some [name].") return diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 53b98b2d4a..e8070e8906 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1,5 +1,6 @@ #define ALCOHOL_THRESHOLD_MODIFIER 0.05 //Greater numbers mean that less alcohol has greater intoxication potential #define ALCOHOL_RATE 0.005 //The rate at which alcohol affects you +#define ALCOHOL_EXPONENT 1.6 //The exponent applied to boozepwr to make higher volume alcohol atleast a little bit damaging. ////////////// I don't know who made this header before I refactored alcohols but I'm going to fucking strangle them because it was so ugly, holy Christ // ALCOHOLS // @@ -37,9 +38,12 @@ All effects don't start immediately, but rather get worse over time; the rate is if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.drunkenness < volume * boozepwr * ALCOHOL_THRESHOLD_MODIFIER) - H.drunkenness = max((H.drunkenness + (sqrt(volume) * boozepwr * ALCOHOL_RATE)), 0) //Volume, power, and server alcohol rate effect how quickly one gets drunk + var/booze_power = boozepwr + if(H.has_trait(TRAIT_ALCOHOL_TOLERANCE)) //we're an accomplished drinker + booze_power *= 0.7 + H.drunkenness = max((H.drunkenness + (sqrt(volume) * booze_power * ALCOHOL_RATE)), 0) //Volume, power, and server alcohol rate effect how quickly one gets drunk var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER) - H.applyLiverDamage((max(sqrt(volume) * boozepwr * L.alcohol_tolerance, 0))/4) + H.applyLiverDamage((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * L.alcohol_tolerance, 0))/150) return ..() || . /datum/reagent/consumable/ethanol/reaction_obj(obj/O, reac_volume) @@ -117,7 +121,8 @@ All effects don't start immediately, but rather get worse over time; the rate is M.dizziness = max(0,M.dizziness-5) M.drowsyness = max(0,M.drowsyness-3) M.AdjustSleeping(-40, FALSE) - M.Jitter(5) + if(!M.has_trait(TRAIT_ALCOHOL_TOLERANCE)) + M.Jitter(5) ..() . = 1 @@ -140,19 +145,62 @@ All effects don't start immediately, but rather get worse over time; the rate is color = "#102000" // rgb: 16, 32, 0 nutriment_factor = 1 * REAGENTS_METABOLISM boozepwr = 80 + overdose_threshold = 60 + addiction_threshold = 30 taste_description = "jitters and death" glass_icon_state = "thirteen_loko_glass" glass_name = "glass of Thirteen Loko" glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." - /datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/M) M.drowsyness = max(0,M.drowsyness-7) M.AdjustSleeping(-40) M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) - M.Jitter(5) + if(!M.has_trait(TRAIT_ALCOHOL_TOLERANCE)) + M.Jitter(5) return ..() +/datum/reagent/consumable/ethanol/thirteenloko/overdose_start(mob/living/M) + to_chat(M, "Your entire body violently jitters as you start to feel queasy. You really shouldn't have drank all of that [name]!") + M.Jitter(20) + M.Stun(15) + +/datum/reagent/consumable/ethanol/thirteenloko/overdose_process(mob/living/M) + if(prob(7) && iscarbon(M)) + var/obj/item/I = M.get_active_held_item() + if(I) + M.dropItemToGround(I) + to_chat(M, "Your hands jitter and you drop what you were holding!") + M.Jitter(10) + + if(prob(7)) + to_chat(M, "[pick("You have a really bad headache.", "Your eyes hurt.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]") + + if(prob(5) && iscarbon(M)) + if(M.has_trait(TRAIT_BLIND)) + var/obj/item/organ/eyes/eye = M.getorganslot(ORGAN_SLOT_EYES) + if(istype(eye)) + eye.Remove(M) + eye.forceMove(get_turf(M)) + to_chat(M, "You double over in pain as you feel your eyeballs liquify in your head!") + M.emote("scream") + M.adjustBruteLoss(15) + else + to_chat(M, "You scream in terror as you go blind!") + M.become_blind(EYE_DAMAGE) + M.emote("scream") + + if(prob(3) && iscarbon(M)) + M.visible_message("[M] starts having a seizure!", "You have a seizure!") + M.Unconscious(100) + M.Jitter(350) + + if(prob(1) && iscarbon(M)) + var/datum/disease/D = new /datum/disease/heart_failure + M.ForceContractDisease(D) + to_chat(M, "You're pretty sure you just felt your heart stop for a second there..") + M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0) + /datum/reagent/consumable/ethanol/vodka name = "Vodka" id = "vodka" @@ -305,7 +353,7 @@ All effects don't start immediately, but rather get worse over time; the rate is shot_glass_icon_state = "shotglassgreen" /datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/M) - if(prob(10)) + if(prob(10) && !M.has_trait(TRAIT_ALCOHOL_TOLERANCE)) M.hallucination += 4 //Reference to the urban myth ..() @@ -367,16 +415,27 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Gin and Tonic" glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." +/datum/reagent/consumable/ethanol/rum_coke + name = "Rum and Coke" + id = "rumcoke" + description = "Rum, mixed with cola." + taste_description = "cola" + boozepwr = 40 + color = "#3E1B00" + glass_icon_state = "whiskeycolaglass" + glass_name = "Rum and Coke" + glass_desc = "The classic go-to of space-fratboys." + /datum/reagent/consumable/ethanol/cuba_libre name = "Cuba Libre" id = "cubalibre" - description = "Rum, mixed with cola. Viva la revolucion." + description = "Viva la Revolucion! Viva Cuba Libre!" color = "#3E1B00" // rgb: 62, 27, 0 boozepwr = 50 - taste_description = "cola" + taste_description = "a refreshing marriage of citrus and rum" glass_icon_state = "cubalibreglass" glass_name = "Cuba Libre" - glass_desc = "A classic mix of rum and cola." + glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" /datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/M) if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries. @@ -556,7 +615,10 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/M) - M.Stun(40, 0) + if(M.has_trait(TRAIT_ALCOHOL_TOLERANCE)) + M.Stun(30, 0) //this realistically does nothing to prevent chainstunning but will cause them to recover faster once it's out of their system + else + M.Stun(40, 0) return ..() /datum/reagent/consumable/ethanol/irish_cream @@ -585,7 +647,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/manly_dorf/on_mob_add(mob/living/M) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.dna.check_mutation(DWARFISM)) + if(H.dna.check_mutation(DWARFISM) || H.has_trait(TRAIT_ALCOHOL_TOLERANCE)) to_chat(H, "Now THAT is MANLY!") boozepwr = 5 //We've had worse in the mines dorf_mode = TRUE @@ -1148,8 +1210,9 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/M) M.set_drugginess(50) - M.confused = max(M.confused+2,0) - M.Dizzy(10) + if(!M.has_trait(TRAIT_ALCOHOL_TOLERANCE)) + M.confused = max(M.confused+2,0) + M.Dizzy(10) if (!M.slurring) M.slurring = 1 M.slurring += 3 diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 7e85580342..adcf7996d6 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -3,6 +3,12 @@ id = "drug" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "bitterness" + var/trippy = TRUE //Does this drug make you trip? + +/datum/reagent/drug/on_mob_delete(mob/living/M) + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood && trippy) + mood.clear_event("[id]_high") /datum/reagent/drug/space_drugs name = "Space drugs" @@ -23,7 +29,9 @@ /datum/reagent/drug/space_drugs/overdose_start(mob/living/M) to_chat(M, "You start tripping hard!") - + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("[id]_overdose", /datum/mood_event/drugs/overdose, name) /datum/reagent/drug/space_drugs/overdose_process(mob/living/M) if(M.hallucination < volume && prob(20)) @@ -38,11 +46,15 @@ color = "#60A584" // rgb: 96, 165, 132 addiction_threshold = 30 taste_description = "smoke" + trippy = FALSE /datum/reagent/drug/nicotine/on_mob_life(mob/living/M) if(prob(1)) var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.") to_chat(M, "[smoke_message]") + GET_COMPONENT_FROM(mood, /datum/component/mood, M) + if(mood) + mood.add_event("smoked", /datum/mood_event/drugs/smoked, name) M.AdjustStun(-20, 0) M.AdjustKnockdown(-20, 0) M.AdjustUnconscious(-20, 0) @@ -57,6 +69,7 @@ taste_description = "mint" reagent_state = LIQUID color = "#80AF9C" + trippy = FALSE /datum/reagent/drug/crank name = "Crank" @@ -187,7 +200,7 @@ M.AdjustUnconscious(-40, 0) M.adjustStaminaLoss(-2, 0) M.Jitter(2) - M.adjustBrainLoss(0.25) + M.adjustBrainLoss(rand(1,4)) if(prob(5)) M.emote(pick("twitch", "shiver")) ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 3dcf29f15e..55d64ea36c 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -378,7 +378,7 @@ M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) ..() -/datum/reagent/mushroomhallucinogen +/datum/reagent/drug/mushroomhallucinogen name = "Mushroom Hallucinogen" id = "mushroomhallucinogen" description = "A strong hallucinogenic drug derived from certain species of mushroom." diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 2552bb7c8d..2f7f9eaa08 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -60,9 +60,9 @@ M.SetSleeping(0, 0) M.jitteriness = 0 M.cure_all_traumas(TRUE, TRAUMA_RESILIENCE_MAGIC) - for(var/thing in M.viruses) + for(var/thing in M.diseases) var/datum/disease/D = thing - if(D.severity == VIRUS_SEVERITY_POSITIVE) + if(D.severity == DISEASE_SEVERITY_POSITIVE) continue D.cure() ..() @@ -1192,6 +1192,7 @@ id = "corazone" description = "A medication used to treat pain, fever, and inflammation, along with heart attacks." color = "#F5F5F5" + self_consuming = TRUE /datum/reagent/medicine/muscle_stimulant name = "Muscle Stimulant" diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index f486dd1a95..0e6be47893 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -16,13 +16,15 @@ for(var/thing in data["viruses"]) var/datum/disease/D = thing - if((D.spread_flags & VIRUS_SPREAD_SPECIAL) || (D.spread_flags & VIRUS_SPREAD_NON_CONTAGIOUS)) + if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue - if((method == TOUCH || method == VAPOR) && (D.spread_flags & VIRUS_SPREAD_CONTACT_FLUIDS)) - M.ContactContractDisease(D) - else //ingest, patch or inject - M.ForceContractDisease(D) + if(isliving(M)) + var/mob/living/L = M + if((method == TOUCH || method == VAPOR) && (D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)) + L.ContactContractDisease(D) + else //ingest, patch or inject + L.ForceContractDisease(D) if(iscarbon(M)) var/mob/living/carbon/C = M @@ -97,12 +99,15 @@ taste_description = "slime" /datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume) + if(!isliving(M)) + return + var/mob/living/L = M if(islist(data) && (method == INGEST || method == INJECT)) - for(var/thing in M.viruses) + for(var/thing in L.diseases) var/datum/disease/D = thing if(D.GetDiseaseID() in data) D.cure() - M.resistances |= data + L.disease_resistances |= data /datum/reagent/vaccine/on_merge(list/data) if(istype(data)) @@ -217,13 +222,18 @@ to_chat(M, "Your blood rites falter as holy water scours your body!") for(var/datum/action/innate/cult/blood_spell/BS in BM.spells) qdel(BS) - if(data >= 30) // 12 units, 54 seconds @ metabolism 0.4 units & tick rate 1.8 sec + if(data >= 25) // 10 units, 45 seconds @ metabolism 0.4 units & tick rate 1.8 sec if(!M.stuttering) M.stuttering = 1 M.stuttering = min(M.stuttering+4, 10) M.Dizzy(5) - if(iscultist(M) && prob(5)) + if(iscultist(M) && prob(8)) M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis")) + if(prob(20)) + M.visible_message("[M] starts having a seizure!", "You have a seizure!") + M.Unconscious(120) + to_chat(M, "[pick("Your blood is your bond - you are nothing without it", "Do not forget your place", \ + "All that power, and you still fail?", "If you cannot scour this poison, I shall scour your meager life!")].") else if(is_servant_of_ratvar(M) && prob(8)) switch(pick("speech", "message", "emote")) if("speech") @@ -623,8 +633,11 @@ taste_description = "slime" /datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, reac_volume) + if(!isliving(M)) + return + var/mob/living/L = M if(method != TOUCH) - M.ForceContractDisease(new /datum/disease/transformation/slime(0)) + L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) /datum/reagent/gluttonytoxin name = "Gluttony's Blessing" @@ -635,7 +648,10 @@ taste_description = "decay" /datum/reagent/gluttonytoxin/reaction_mob(mob/M, method=TOUCH, reac_volume) - M.ForceContractDisease(new /datum/disease/transformation/morph(0)) + if(!isliving(M)) + return + var/mob/living/L = M + L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE) /datum/reagent/serotrotium name = "Serotrotium" @@ -679,6 +695,13 @@ color = "#6E3B08" // rgb: 110, 59, 8 taste_description = "metal" +/datum/reagent/copper/reaction_obj(obj/O, reac_volume) + if(istype(O, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = O + reac_volume = min(reac_volume, M.amount) + new/obj/item/stack/tile/bronze(get_turf(M), reac_volume) + M.use(reac_volume) + /datum/reagent/nitrogen name = "Nitrogen" id = "nitrogen" @@ -1096,8 +1119,11 @@ taste_description = "sludge" /datum/reagent/nanites/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) + if(!isliving(M)) + return + var/mob/living/L = M if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) - M.ForceContractDisease(new /datum/disease/transformation/robot(0)) + L.ForceContractDisease(new /datum/disease/transformation/robot(), FALSE, TRUE) /datum/reagent/xenomicrobes name = "Xenomicrobes" @@ -1108,8 +1134,11 @@ taste_description = "sludge" /datum/reagent/xenomicrobes/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) + if(!isliving(M)) + return + var/mob/living/L = M if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) - M.ForceContractDisease(new /datum/disease/transformation/xeno(0)) + L.ForceContractDisease(new /datum/disease/transformation/xeno(), FALSE, TRUE) /datum/reagent/fungalspores name = "Tubercle bacillus Cosmosis microbes" @@ -1120,8 +1149,11 @@ taste_description = "slime" /datum/reagent/fungalspores/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) + if(!isliving(M)) + return + var/mob/living/L = M if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) - M.ForceContractDisease(new /datum/disease/tuberculosis(0)) + L.ForceContractDisease(new /datum/disease/tuberculosis(), FALSE, TRUE) /datum/reagent/fluorosurfactant//foam precursor name = "Fluorosurfactant" @@ -1812,4 +1844,4 @@ var/datum/antagonist/changeling/changeling = L.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) changeling.chem_charges = max(changeling.chem_charges-2, 0) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index aba6f580ef..e77d87c5b6 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -100,16 +100,14 @@ /datum/reagent/toxin/lexorin/on_mob_life(mob/living/M) . = TRUE - var/mob/living/carbon/C - if(iscarbon(M)) - C = M - CHECK_DNA_AND_SPECIES(C) - if(NOBREATH in C.dna.species.species_traits) - . = FALSE + + if(M.has_trait(TRAIT_NOBREATH)) + . = FALSE if(.) M.adjustOxyLoss(5, 0) - if(C) + if(iscarbon(M)) + var/mob/living/carbon/C = M C.losebreath += 2 if(prob(20)) M.emote("gasp") @@ -184,7 +182,7 @@ /datum/reagent/toxin/mindbreaker name = "Mindbreaker Toxin" id = "mindbreaker" - description = "A powerful hallucinogen. Not a thing to be messed with." + description = "A powerful hallucinogen. Not a thing to be messed with. For some mental patients. it counteracts their symptoms and anchors them to reality." color = "#B31008" // rgb: 139, 166, 233 toxpwr = 0 taste_description = "sourness" @@ -810,6 +808,7 @@ toxpwr = 1 var/acidpwr = 10 //the amount of protection removed from the armour taste_description = "acid" + self_consuming = TRUE /datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume) if(!istype(C)) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index d6213a391b..054fe077c3 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -18,7 +18,7 @@ volume = vol create_reagents(volume) if(spawned_disease) - var/datum/disease/F = new spawned_disease(0) + var/datum/disease/F = new spawned_disease() var/list/data = list("viruses"= list(F)) reagents.add_reagent("blood", disease_amount, data) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 7afba472ba..5ae253022f 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -167,3 +167,10 @@ volume = 1 amount_per_transfer_from_this = 1 list_reagents = list("unstablemutationtoxin" = 1) + +/obj/item/reagent_containers/hypospray/combat/heresypurge + name = "holy water autoinjector" + desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with 5 doses of a holy water mixture." + volume = 250 + list_reagents = list("holywater" = 150, "tiresolution" = 50, "dizzysolution" = 50) + amount_per_transfer_from_this = 50 diff --git a/code/modules/reagents/reagent_containers/medspray.dm b/code/modules/reagents/reagent_containers/medspray.dm new file mode 100644 index 0000000000..2f715084ad --- /dev/null +++ b/code/modules/reagents/reagent_containers/medspray.dm @@ -0,0 +1,91 @@ +/obj/item/reagent_containers/medspray + name = "medical spray" + desc = "A medical spray bottle, designed for precision application, with an unscrewable cap." + icon = 'icons/obj/chemical.dmi' + icon_state = "medspray" + item_state = "spraycan" + lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' + flags_1 = NOBLUDGEON_1 + obj_flags = UNIQUE_RENAME + container_type = OPENCONTAINER + slot_flags = SLOT_BELT + throwforce = 0 + w_class = WEIGHT_CLASS_SMALL + throw_speed = 3 + throw_range = 7 + amount_per_transfer_from_this = 10 + volume = 60 + var/can_fill_from_container = TRUE + var/apply_type = PATCH + var/apply_method = "spray" + var/self_delay = 30 + var/squirt_mode = 0 + var/squirt_amount = 5 + +/obj/item/reagent_containers/medspray/attack_self(mob/user) + squirt_mode = !squirt_mode + if(squirt_mode) + amount_per_transfer_from_this = squirt_amount + else + amount_per_transfer_from_this = initial(amount_per_transfer_from_this) + to_chat(user, "You will now apply the medspray's contents in [squirt_mode ? "short bursts":"extended sprays"]. You'll now use [amount_per_transfer_from_this] units per use.") + +/obj/item/reagent_containers/medspray/attack(mob/M, mob/user, def_zone) + if(!reagents || !reagents.total_volume) + to_chat(user, "[src] is empty!") + return + + if(M == user) + M.visible_message("[user] attempts to [apply_method] [src] on themselves.") + if(self_delay) + if(!do_mob(user, M, self_delay)) + return + if(!reagents || !reagents.total_volume) + return + to_chat(M, "You [apply_method] yourself with [src].") + + else + add_logs(user, M, "attempted to apply", src, reagents.log_list()) + M.visible_message("[user] attempts to [apply_method] [src] on [M].", \ + "[user] attempts to [apply_method] [src] on [M].") + if(!do_mob(user, M)) + return + if(!reagents || !reagents.total_volume) + return + M.visible_message("[user] [apply_method]s [M] down with [src].", \ + "[user] [apply_method]s [M] down with [src].") + + if(!reagents || !reagents.total_volume) + return + + else + add_logs(user, M, "applied", src, reagents.log_list()) + playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6) + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(M, apply_type, fraction) + reagents.trans_to(M, amount_per_transfer_from_this) + return + +/obj/item/reagent_containers/medspray/styptic + name = "medical spray (styptic powder)" + desc = "A medical spray bottle, designed for precision application, with an unscrewable cap. This one contains styptic powder, for treating cuts and bruises." + icon_state = "brutespray" + list_reagents = list("styptic_powder" = 60) + +/obj/item/reagent_containers/medspray/silver_sulf + name = "medical spray (silver sulfadiazine)" + desc = "A medical spray bottle, designed for precision application, with an unscrewable cap. This one contains silver sulfadiazine, useful for treating burns." + icon_state = "burnspray" + list_reagents = list("silver_sulfadiazine" = 60) + +/obj/item/reagent_containers/medspray/synthflesh + name = "medical spray (synthflesh)" + desc = "A medical spray bottle, designed for precision application, with an unscrewable cap. This one contains synthflesh, an apex brute and burn healing agent." + icon_state = "synthspray" + list_reagents = list("synthflesh" = 60) + +/obj/item/reagent_containers/medspray/sterilizine + name = "sterilizer spray" + desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery." + list_reagents = list("sterilizine" = 60) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 68507d673a..4b2e3f128c 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -147,11 +147,14 @@ /obj/item/reagent_containers/spray/cleaner name = "space cleaner" desc = "BLAM!-brand non-foaming space cleaner!" - list_reagents = list("cleaner" = 250) + volume = 100 + list_reagents = list("cleaner" = 100) + amount_per_transfer_from_this = 2 + stream_amount = 5 /obj/item/reagent_containers/spray/cleaner/suicide_act(mob/user) user.visible_message("[user] is putting the nozzle of \the [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!") - if(do_mob(user,user,30)) + if(do_mob(user,user,30)) if(reagents.total_volume >= amount_per_transfer_from_this)//if not empty user.visible_message("[user] pulls the trigger!") src.spray(user) @@ -171,19 +174,6 @@ list_reagents = list("spraytan" = 50) -/obj/item/reagent_containers/spray/medical - name = "medical spray" - icon = 'icons/obj/chemical.dmi' - icon_state = "medspray" - volume = 100 - - -/obj/item/reagent_containers/spray/medical/sterilizer - name = "sterilizer spray" - desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery." - list_reagents = list("sterilizine" = 100) - - //pepperspray /obj/item/reagent_containers/spray/pepper name = "pepperspray" diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm deleted file mode 100644 index a35c261120..0000000000 --- a/code/modules/research/circuitprinter.dm +++ /dev/null @@ -1,125 +0,0 @@ -/*///////////////Circuit Imprinter (By Darem)//////////////////////// - Used to print new circuit boards (for computers and similar systems) and AI modules. Each circuit board pattern are stored in -a /datum/desgin on the linked R&D console. You can then print them out in a fasion similar to a regular lathe. However, instead of -using metal and glass, it uses glass and reagents (usually sulfuric acis). - -*/ -/obj/machinery/rnd/circuit_imprinter - name = "circuit imprinter" - desc = "Manufactures circuit boards for the construction of machines." - icon_state = "circuit_imprinter" - container_type = OPENCONTAINER - circuit = /obj/item/circuitboard/machine/circuit_imprinter - - var/efficiency_coeff - - var/datum/component/material_container/materials //Store for hyper speed! - - var/list/categories = list( - "AI Modules", - "Computer Boards", - "Teleportation Machinery", - "Medical Machinery", - "Engineering Machinery", - "Exosuit Modules", - "Hydroponics Machinery", - "Subspace Telecomms", - "Research Machinery", - "Misc. Machinery", - "Computer Parts" - ) - -/obj/machinery/rnd/circuit_imprinter/Initialize() - materials = AddComponent(/datum/component/material_container, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE), 0, - FALSE, list(/obj/item/stack, /obj/item/stack/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) - materials.precise_insertion = TRUE - create_reagents(0) - RefreshParts() - return ..() - -/obj/machinery/rnd/circuit_imprinter/RefreshParts() - reagents.maximum_volume = 0 - for(var/obj/item/reagent_containers/glass/G in component_parts) - reagents.maximum_volume += G.volume - G.reagents.trans_to(src, G.reagents.total_volume) - - GET_COMPONENT(materials, /datum/component/material_container) - materials.max_amount = 0 - for(var/obj/item/stock_parts/matter_bin/M in component_parts) - materials.max_amount += M.rating * 75000 - - var/T = 0 - for(var/obj/item/stock_parts/manipulator/M in component_parts) - T += M.rating - efficiency_coeff = 2 ** (T - 1) //Only 1 manipulator here, you're making runtimes Razharas - -/obj/machinery/rnd/circuit_imprinter/blob_act(obj/structure/blob/B) - if (prob(50)) - qdel(src) - -/obj/machinery/rnd/circuit_imprinter/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material - var/list/all_materials = being_built.reagents_list + being_built.materials - - GET_COMPONENT(materials, /datum/component/material_container) - var/A = materials.amount(M) - if(!A) - A = reagents.get_reagent_amount(M) - - return round(A / max(1, (all_materials[M]/efficiency_coeff))) - -//we eject the materials upon deconstruction. -/obj/machinery/rnd/circuit_imprinter/on_deconstruction() - for(var/obj/item/reagent_containers/glass/G in component_parts) - reagents.trans_to(G, G.reagents.maximum_volume) - GET_COMPONENT(materials, /datum/component/material_container) - materials.retrieve_all() - ..() - - -/obj/machinery/rnd/circuit_imprinter/disconnect_console() - linked_console.linked_imprinter = null - ..() - -/obj/machinery/rnd/circuit_imprinter/proc/user_try_print_id(id) - if((!linked_console && requires_console) || !id) - return FALSE - var/datum/design/D = (linked_console || requires_console)? linked_console.stored_research.researched_designs[id] : get_techweb_design_by_id(id) - if(!istype(D)) - return FALSE - - var/power = 1000 - for(var/M in D.materials) - power += round(D.materials[M] / 5) - power = max(4000, power) - use_power(power) - - var/list/efficient_mats = list() - for(var/MAT in D.materials) - efficient_mats[MAT] = D.materials[MAT]/efficiency_coeff - - if(!materials.has_materials(efficient_mats)) - say("Not enough materials to complete prototype.") - return FALSE - for(var/R in D.reagents_list) - if(!reagents.has_reagent(R, D.reagents_list[R]/efficiency_coeff)) - say("Not enough reagents to complete prototype.") - return FALSE - - busy = TRUE - flick("circuit_imprinter_ani", src) - materials.use_amount(efficient_mats) - for(var/R in D.reagents_list) - reagents.remove_reagent(R, D.reagents_list[R]/efficiency_coeff) - - var/P = D.build_path - addtimer(CALLBACK(src, .proc/reset_busy), 16) - addtimer(CALLBACK(src, .proc/do_print, P, efficient_mats, D.dangerous_construction), 16) - return TRUE - -/obj/machinery/rnd/circuit_imprinter/proc/do_print(path, list/matlist, notify_admins) - if(notify_admins && usr) - investigate_log("[key_name(usr)] built [path] at a circuit imprinter.", INVESTIGATE_RESEARCH) - message_admins("[ADMIN_LOOKUPFLW(usr)] has built [path] at a circuit imprinter.") - var/obj/item/I = new path(get_turf(src)) - I.materials = matlist.Copy() - SSblackbox.record_feedback("nested tally", "circuit_printed", 1, list("[type]", "[path]")) diff --git a/code/modules/research/departmental_circuit_imprinter.dm b/code/modules/research/departmental_circuit_imprinter.dm deleted file mode 100644 index 01c4a6a22c..0000000000 --- a/code/modules/research/departmental_circuit_imprinter.dm +++ /dev/null @@ -1,200 +0,0 @@ -/obj/machinery/rnd/circuit_imprinter/department - name = "Department Circuit Imprinter" - desc = "A special circuit imprinter with a built in interface meant for departmental usage, with built in ExoSync recievers allowing it to print designs researched that match its ROM-encoded department type. Features a bluespace materials reciever for recieving materials without the hassle of running to mining!" - icon_state = "circuit_imprinter" - container_type = OPENCONTAINER - circuit = /obj/item/circuitboard/machine/circuit_imprinter/department - requires_console = FALSE - - var/list/datum/design/cached_designs - var/list/datum/design/matching_designs - var/department_tag = "Unidentified" //used for material distribution among other things. - var/datum/techweb/stored_research - var/datum/techweb/host_research - var/screen = DEPPRINTER_SCREEN_PRIMARY - -/obj/machinery/rnd/circuit_imprinter/department/science - allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SCIENCE - department_tag = "Science" - -/obj/machinery/rnd/circuit_imprinter/department/Initialize() - . = ..() - stored_research = new - cached_designs = list() - host_research = SSresearch.science_tech - matching_designs = list() - update_research() - -/obj/machinery/rnd/circuit_imprinter/department/Destroy() - QDEL_NULL(stored_research) - return ..() - -/obj/machinery/rnd/circuit_imprinter/department/user_try_print_id(id, amount) - var/datum/design/D = get_techweb_design_by_id(id) - if(!D || !(D.departmental_flags & allowed_department_flags)) - say("Warning: Printing failed. Please update the research data with the on-screen button!") - return FALSE - . = ..() - -/obj/machinery/rnd/circuit_imprinter/department/attack_hand(mob/user) - if(..()) - return - interact(user) - -/obj/machinery/rnd/circuit_imprinter/department/interact(mob/user) - user.set_machine(src) - - var/datum/browser/popup = new(user, "rndconsole", name, 460, 550) - popup.set_content(generate_ui()) - popup.open() - -/obj/machinery/rnd/circuit_imprinter/department/proc/search(string) - matching_designs.Cut() - for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] - if(!(D.build_type & IMPRINTER) || !(D.departmental_flags & allowed_department_flags)) - continue - if(findtext(D.name,string)) - matching_designs.Add(D) - -/obj/machinery/rnd/circuit_imprinter/department/proc/update_research() - host_research.copy_research_to(stored_research, TRUE) - update_designs() - -/obj/machinery/rnd/circuit_imprinter/department/proc/update_designs() - cached_designs.Cut() - for(var/i in stored_research.researched_designs) - var/datum/design/d = stored_research.researched_designs[i] - if((d.departmental_flags & allowed_department_flags) && (d.build_type & IMPRINTER)) - cached_designs |= d - -/obj/machinery/rnd/circuit_imprinter/department/proc/generate_ui() - var/list/ui = list() - ui += ui_header() - switch(screen) - if(DEPPRINTER_SCREEN_MATERIALS) - ui += ui_materials() - if(DEPPRINTER_SCREEN_CHEMICALS) - ui += ui_chemicals() - if(DEPPRINTER_SCREEN_SEARCH) - ui += ui_search() - else - ui += ui_department_imprinter() - for(var/i in 1 to length(ui)) - if(!findtextEx(ui[i], RDSCREEN_NOBREAK)) - ui[i] += "
" - ui[i] = replacetextEx(ui[i], RDSCREEN_NOBREAK, "") - return ui.Join("") - -/obj/machinery/rnd/circuit_imprinter/department/proc/ui_search() //Legacy code - var/list/l = list() - l += "

Search Results:

" - l += "
\ - \ - \ - \ - \ -

" - var/coeff = efficiency_coeff - for(var/datum/design/D in matching_designs) - var/temp_materials - var/check_materials = TRUE - var/all_materials = D.materials + D.reagents_list - for(var/M in all_materials) - temp_materials += " | " - if (!check_mat(D, M)) - check_materials = FALSE - temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]" - else - temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]" - if (check_materials) - l += "[D.name][temp_materials]" - else - l += "[D.name][temp_materials]" - l += "" - return l - -/obj/machinery/rnd/circuit_imprinter/department/proc/ui_department_imprinter() - var/list/l = list() - var/coeff = efficiency_coeff - l += "
\ - \ - \ - \ - \ -

" - for(var/datum/design/D in cached_designs) - var/temp_materials - var/check_materials = TRUE - var/all_materials = D.materials + D.reagents_list - for(var/M in all_materials) - temp_materials += " | " - if (!check_mat(D, M)) - check_materials = FALSE - temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]" - else - temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]" - if (check_materials) - l += "[D.name][temp_materials]" - else - l += "[D.name][temp_materials]" - l += "" - return l - -/obj/machinery/rnd/circuit_imprinter/department/proc/ui_header() - var/list/l = list() - l += "
[host_research.organization] [department_tag] Department Circuit Imprinter" - l += "Security protocols: [(obj_flags & EMAGGED) ? "Disabled" : "Enabled"]" - l += "Material Amount: [materials.total_amount] / [materials.max_amount]" - l += "Chemical volume: [reagents.total_volume] / [reagents.maximum_volume]" - l += "Synchronize Research" - l += "Main Screen
[RDSCREEN_NOBREAK]" - return l - -/obj/machinery/rnd/circuit_imprinter/department/proc/ui_materials() - var/list/l = list() - l += "

Material Storage:

" - for(var/mat_id in materials.materials) - var/datum/material/M = materials.materials[mat_id] - l += "* [M.amount] of [M.name]: " - if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "Eject [RDSCREEN_NOBREAK]" - if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) l += "5x [RDSCREEN_NOBREAK]" - if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "All[RDSCREEN_NOBREAK]" - l += "" - l += "
[RDSCREEN_NOBREAK]" - return l - -/obj/machinery/rnd/circuit_imprinter/department/proc/ui_chemicals() - var/list/l = list() - l += "
Disposal All Chemicals in Storage" - l += "

Chemical Storage:

" - for(var/datum/reagent/R in reagents.reagent_list) - l += "[R.name]: [R.volume]" - l += "Purge" - l += "
" - return l - -/obj/machinery/rnd/circuit_imprinter/department/Topic(raw, ls) - if(..()) - return - add_fingerprint(usr) - usr.set_machine(src) - if(ls["switch_screen"]) - screen = text2num(ls["switch_screen"]) - if(ls["imprint"]) //Causes the circuit_imprinter to build something. - if(busy) - say("Warning: Fabricators busy!") - else - user_try_print_id(ls["imprint"]) - if(ls["search"]) //Search for designs with name matching pattern - search(ls["to_search"]) - screen = DEPPRINTER_SCREEN_SEARCH - if(ls["sync_research"]) - update_research() - say("Synchronizing research with host technology database.") - if(ls["dispose"]) //Causes the protolathe to dispose of a single reagent (all of it) - reagents.del_reagent(ls["dispose"]) - if(ls["disposeall"]) //Causes the protolathe to dispose of all it's reagents. - reagents.clear_reagents() - if(ls["ejectsheet"]) //Causes the protolathe to eject a sheet of material - materials.retrieve_sheets(text2num(ls["eject_amt"]), ls["ejectsheet"]) diff --git a/code/modules/research/departmental_lathe.dm b/code/modules/research/departmental_lathe.dm deleted file mode 100644 index ab893e7853..0000000000 --- a/code/modules/research/departmental_lathe.dm +++ /dev/null @@ -1,244 +0,0 @@ -/obj/machinery/rnd/protolathe/department - name = "department protolathe" - desc = "A special protolathe with a built in interface meant for departmental usage, with built in ExoSync recievers allowing it to print designs researched that match its ROM-encoded department type. Features a bluespace materials reciever for recieving materials without the hassle of running to mining!" - icon_state = "protolathe" - container_type = OPENCONTAINER - circuit = /obj/item/circuitboard/machine/protolathe/department - requires_console = FALSE - - var/list/datum/design/cached_designs - var/list/datum/design/matching_designs - var/department_tag = "Unidentified" //used for material distribution among other things. - var/datum/techweb/stored_research - var/datum/techweb/host_research - var/screen = DEPLATHE_SCREEN_PRIMARY - -/obj/machinery/rnd/protolathe/department/engineering - allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_ENGINEERING - department_tag = "Engineering" - circuit = /obj/item/circuitboard/machine/protolathe/department/engineering - -/obj/machinery/rnd/protolathe/department/service - allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SERVICE - department_tag = "Service" - circuit = /obj/item/circuitboard/machine/protolathe/department/service - -/obj/machinery/rnd/protolathe/department/medical - allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_MEDICAL - department_tag = "Medical" - circuit = /obj/item/circuitboard/machine/protolathe/department/medical - -/obj/machinery/rnd/protolathe/department/cargo - allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_CARGO - department_tag = "Cargo" - circuit = /obj/item/circuitboard/machine/protolathe/department/cargo - -/obj/machinery/rnd/protolathe/department/science - allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SCIENCE - department_tag = "Science" - circuit = /obj/item/circuitboard/machine/protolathe/department/science - -/obj/machinery/rnd/protolathe/department/security - allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SECURITY - department_tag = "Security" - circuit = /obj/item/circuitboard/machine/protolathe/department/security - -/obj/machinery/rnd/protolathe/department/Initialize() - . = ..() - matching_designs = list() - cached_designs = list() - stored_research = new - host_research = SSresearch.science_tech - update_research() - -/obj/machinery/rnd/protolathe/department/Destroy() - QDEL_NULL(stored_research) - return ..() - -/obj/machinery/rnd/protolathe/department/user_try_print_id(id, amount) - var/datum/design/D = get_techweb_design_by_id(id) - if(!D || !(D.departmental_flags & allowed_department_flags)) - say("Warning: Printing failed. Please update the research data with the on-screen button!") - return FALSE - . = ..() - -/obj/machinery/rnd/protolathe/department/attack_hand(mob/user) - if(..()) - return - interact(user) - -/obj/machinery/rnd/protolathe/department/interact(mob/user) - user.set_machine(src) - var/datum/browser/popup = new(user, "rndconsole", name, 460, 550) - popup.set_content(generate_ui()) - popup.open() - -/obj/machinery/rnd/protolathe/department/proc/search(string) - matching_designs.Cut() - for(var/v in stored_research.researched_designs) - var/datum/design/D = stored_research.researched_designs[v] - if(!(D.build_type & PROTOLATHE) || !(D.departmental_flags & allowed_department_flags)) - continue - if(findtext(D.name,string)) - matching_designs.Add(D) - -/obj/machinery/rnd/protolathe/department/proc/update_research() - host_research.copy_research_to(stored_research, TRUE) - update_designs() - -/obj/machinery/rnd/protolathe/department/proc/update_designs() - cached_designs.Cut() - for(var/i in stored_research.researched_designs) - var/datum/design/d = stored_research.researched_designs[i] - if((d.departmental_flags & allowed_department_flags) && (d.build_type & PROTOLATHE)) - cached_designs |= d - -/obj/machinery/rnd/protolathe/department/proc/generate_ui() - var/list/ui = list() - ui += ui_header() - switch(screen) - if(DEPLATHE_SCREEN_MATERIALS) - ui += ui_materials() - if(DEPLATHE_SCREEN_CHEMICALS) - ui += ui_chemicals() - if(DEPLATHE_SCREEN_SEARCH) - ui += ui_search() - else - ui += ui_department_lathe() - for(var/i in 1 to length(ui)) - if(!findtextEx(ui[i], RDSCREEN_NOBREAK)) - ui[i] += "
" - ui[i] = replacetextEx(ui[i], RDSCREEN_NOBREAK, "") - return ui.Join("") - -/obj/machinery/rnd/protolathe/department/proc/ui_search() //Legacy code - var/list/l = list() - var/coeff = efficiency_coeff - l += "

Search Results:

" - l += "
\ - \ - \ - \ - \ -

" - for(var/datum/design/D in matching_designs) - var/temp_material - var/c = 50 - var/t - var/all_materials = D.materials + D.reagents_list - for(var/M in all_materials) - t = check_mat(D, M) - temp_material += " | " - if (t < 1) - temp_material += "[all_materials[M]*coeff] [CallMaterialName(M)]" - else - temp_material += " [all_materials[M]*coeff] [CallMaterialName(M)]" - c = min(c,t) - - if (c >= 1) - l += "[D.name][RDSCREEN_NOBREAK]" - if(c >= 5) - l += "x5[RDSCREEN_NOBREAK]" - if(c >= 10) - l += "x10[RDSCREEN_NOBREAK]" - l += "[temp_material][RDSCREEN_NOBREAK]" - else - l += "[D.name][temp_material][RDSCREEN_NOBREAK]" - l += "" - l += "" - return l - -/obj/machinery/rnd/protolathe/department/proc/ui_department_lathe() - var/list/l = list() - var/coeff = efficiency_coeff - l += "
\ - \ - \ - \ - \ -

" - for(var/datum/design/D in cached_designs) - var/temp_material - var/c = 50 - var/t - var/all_materials = D.materials + D.reagents_list - for(var/M in all_materials) - t = check_mat(D, M) - temp_material += " | " - if (t < 1) - temp_material += "[all_materials[M]*coeff] [CallMaterialName(M)]" - else - temp_material += " [all_materials[M]*coeff] [CallMaterialName(M)]" - c = min(c,t) - - if (c >= 1) - l += "[D.name][RDSCREEN_NOBREAK]" - if(c >= 5) - l += "x5[RDSCREEN_NOBREAK]" - if(c >= 10) - l += "x10[RDSCREEN_NOBREAK]" - l += "[temp_material][RDSCREEN_NOBREAK]" - else - l += "[D.name][temp_material][RDSCREEN_NOBREAK]" - l += "" - l += "" - return l - -/obj/machinery/rnd/protolathe/department/proc/ui_header() - var/list/l = list() - l += "
[host_research.organization] [department_tag] Department Lathe" - l += "Security protocols: [(obj_flags & EMAGGED) ? "Disabled" : "Enabled"]" - l += "Material Amount: [materials.total_amount] / [materials.max_amount]" - l += "Chemical volume: [reagents.total_volume] / [reagents.maximum_volume]" - l += "Synchronize Research" - l += "Main Screen
[RDSCREEN_NOBREAK]" - return l - -/obj/machinery/rnd/protolathe/department/proc/ui_materials() - var/list/l = list() - l += "

Material Storage:

" - for(var/mat_id in materials.materials) - var/datum/material/M = materials.materials[mat_id] - l += "* [M.amount] of [M.name]: " - if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "Eject [RDSCREEN_NOBREAK]" - if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) l += "5x [RDSCREEN_NOBREAK]" - if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "All[RDSCREEN_NOBREAK]" - l += "" - l += "
[RDSCREEN_NOBREAK]" - return l - -/obj/machinery/rnd/protolathe/department/proc/ui_chemicals() - var/list/l = list() - l += "
Disposal All Chemicals in Storage" - l += "

Chemical Storage:

" - for(var/datum/reagent/R in reagents.reagent_list) - l += "[R.name]: [R.volume]" - l += "Purge" - l += "
" - return l - -/obj/machinery/rnd/protolathe/department/Topic(raw, ls) - if(..()) - return - add_fingerprint(usr) - usr.set_machine(src) - if(ls["switch_screen"]) - screen = text2num(ls["switch_screen"]) - if(ls["build"]) //Causes the Protolathe to build something. - if(busy) - say("Warning: Fabricators busy!") - else - user_try_print_id(ls["build"], ls["amount"]) - if(ls["search"]) //Search for designs with name matching pattern - search(ls["to_search"]) - screen = DEPLATHE_SCREEN_SEARCH - if(ls["sync_research"]) - update_research() - say("Synchronizing research with host technology database.") - if(ls["dispose"]) //Causes the protolathe to dispose of a single reagent (all of it) - reagents.del_reagent(ls["dispose"]) - if(ls["disposeall"]) //Causes the protolathe to dispose of all it's reagents. - reagents.clear_reagents() - if(ls["ejectsheet"]) //Causes the protolathe to eject a sheet of material - materials.retrieve_sheets(text2num(ls["eject_amt"]), ls["ejectsheet"]) - updateUsrDialog() diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 25e2c8115c..52f06a0acc 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -423,6 +423,14 @@ build_path = /obj/item/device/healthanalyzer category = list("initial", "Medical") +/datum/design/pillbottle + name = "Pill Bottle" + id = "pillbottle" + build_type = AUTOLATHE + materials = list(MAT_METAL = 20, MAT_GLASS = 100) + build_path = /obj/item/storage/pill_bottle + category = list("initial", "Medical") + /datum/design/beanbag_slug name = "Beanbag Slug" id = "beanbag_slug" diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm index f5170066e2..799df94c0c 100644 --- a/code/modules/research/designs/bluespace_designs.dm +++ b/code/modules/research/designs/bluespace_designs.dm @@ -9,7 +9,7 @@ id = "beacon" build_type = PROTOLATHE materials = list(MAT_METAL = 150, MAT_GLASS = 100) - build_path = /obj/item/device/radio/beacon + build_path = /obj/item/device/beacon category = list("Bluespace Designs") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SECURITY diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 189c06dd36..6205a214b7 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -257,6 +257,16 @@ category = list("Electronics") departmental_flags = DEPARTMENTAL_FLAG_SERVICE +/datum/design/roastingstick + name = "Advanced roasting stick" + desc = "A roasting stick for cooking sausages in exotic ovens." + id = "roastingstick" + build_type = PROTOLATHE + materials = list(MAT_METAL=1000, MAT_GLASS=500, MAT_BLUESPACE = 250) + build_path = /obj/item/melee/roastingstick + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + ///////////////////////////////////////// ////////////Janitor Designs////////////// ///////////////////////////////////////// diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm new file mode 100644 index 0000000000..ac5d1b225a --- /dev/null +++ b/code/modules/research/machinery/_production.dm @@ -0,0 +1,333 @@ +/obj/machinery/rnd/production + name = "technology fabricator" + desc = "Makes researched and prototype items with materials and energy." + container_type = OPENCONTAINER + + var/consoleless_interface = FALSE //Whether it can be used without a console. + var/efficiency_coeff = 1 //Materials needed / coeff = actual. + var/list/categories = list() + var/datum/component/material_container/materials //Store for hyper speed! + var/allowed_department_flags = ALL + var/production_animation //What's flick()'d on print. + var/allowed_buildtypes = NONE + var/list/datum/design/cached_designs + var/list/datum/design/matching_designs + var/department_tag = "Unidentified" //used for material distribution among other things. + var/datum/techweb/stored_research + var/datum/techweb/host_research + + var/screen = RESEARCH_FABRICATOR_SCREEN_MAIN + var/selected_category + +/obj/machinery/rnd/production/Initialize() + . = ..() + create_reagents(0) + materials = AddComponent(/datum/component/material_container, + list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0, + FALSE, list(/obj/item/stack), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) + materials.precise_insertion = TRUE + RefreshParts() + matching_designs = list() + cached_designs = list() + stored_research = new + host_research = SSresearch.science_tech + update_research() + +/obj/machinery/rnd/production/proc/update_research() + host_research.copy_research_to(stored_research, TRUE) + update_designs() + +/obj/machinery/rnd/production/proc/update_designs() + cached_designs.Cut() + for(var/i in stored_research.researched_designs) + var/datum/design/d = stored_research.researched_designs[i] + if((d.departmental_flags & allowed_department_flags) && (d.build_type & allowed_buildtypes)) + cached_designs |= d + +/obj/machinery/rnd/production/RefreshParts() + calculate_efficiency() + +/obj/machinery/rnd/production/attack_hand(mob/user) + interact(user) //remove this snowflake shit when the refactor of storage components or some other pr that unsnowflakes attack_hand on machinery is in + +/obj/machinery/rnd/production/interact(mob/user) + if(!consoleless_interface) + return ..() + user.set_machine(src) + var/datum/browser/popup = new(user, "rndconsole", name, 460, 550) + popup.set_content(generate_ui()) + popup.open() + +/obj/machinery/rnd/production/Destroy() + QDEL_NULL(stored_research) + return ..() + +/obj/machinery/rnd/production/proc/calculate_efficiency() + efficiency_coeff = 1 + if(reagents) //If reagents/materials aren't initialized, don't bother, we'll be doing this again after reagents init anyways. + reagents.maximum_volume = 0 + for(var/obj/item/reagent_containers/glass/G in component_parts) + reagents.maximum_volume += G.volume + G.reagents.trans_to(src, G.reagents.total_volume) + if(materials) + materials.max_amount = 0 + for(var/obj/item/stock_parts/matter_bin/M in component_parts) + materials.max_amount += M.rating * 75000 + var/total_rating = 0 + for(var/obj/item/stock_parts/manipulator/M in component_parts) + total_rating += M.rating + total_rating = max(1, total_rating) + efficiency_coeff = total_rating + +//we eject the materials upon deconstruction. +/obj/machinery/rnd/production/on_deconstruction() + for(var/obj/item/reagent_containers/glass/G in component_parts) + reagents.trans_to(G, G.reagents.maximum_volume) + materials.retrieve_all() + return ..() + +/obj/machinery/rnd/production/proc/do_print(path, amount, list/matlist, notify_admins) + if(notify_admins) + investigate_log("[key_name(usr)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH) + message_admins("[ADMIN_LOOKUPFLW(usr)] has built [amount] of [path] at a [src]([type]).") + for(var/i in 1 to amount) + var/obj/item/I = new path(get_turf(src)) + if(!istype(I, /obj/item/stack/sheet) && !istype(I, /obj/item/stack/ore/bluespace_crystal)) + I.materials = matlist.Copy() + SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) + +/obj/machinery/rnd/production/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material + var/list/all_materials = being_built.reagents_list + being_built.materials + + var/A = materials.amount(M) + if(!A) + A = reagents.get_reagent_amount(M) + + return round(A / max(1, (all_materials[M]/efficiency_coeff))) + +/obj/machinery/rnd/production/proc/user_try_print_id(id, amount) + if((!istype(linked_console) && requires_console) || !id) + return FALSE + if(istext(amount)) + amount = text2num(amount) + if(isnull(amount)) + amount = 1 + var/datum/design/D = (linked_console || requires_console)? linked_console.stored_research.researched_designs[id] : get_techweb_design_by_id(id) + if(!istype(D)) + return FALSE + if(!(D.departmental_flags & allowed_department_flags)) + say("Warning: Printing failed: This fabricator does not have the necessary keys to decrypt design schematics. Please update the research data with the on-screen button and contact Nanotrasen Support!") + return FALSE + if(D.build_type && !(D.build_type & allowed_buildtypes)) + say("This machine does not have the necessary manipulation systems for this design. Please contact Nanotrasen Support!") + return FALSE + var/power = 1000 + amount = CLAMP(amount, 1, 50) + for(var/M in D.materials) + power += round(D.materials[M] * amount / 35) + power = min(3000, power) + use_power(power) + var/list/efficient_mats = list() + for(var/MAT in D.materials) + efficient_mats[MAT] = D.materials[MAT]/efficiency_coeff + if(!materials.has_materials(efficient_mats, amount)) + say("Not enough materials to complete prototype[amount > 1? "s" : ""].") + return FALSE + for(var/R in D.reagents_list) + if(!reagents.has_reagent(R, D.reagents_list[R]*amount/efficiency_coeff)) + say("Not enough reagents to complete prototype[amount > 1? "s" : ""].") + return FALSE + materials.use_amount(efficient_mats, amount) + for(var/R in D.reagents_list) + reagents.remove_reagent(R, D.reagents_list[R]*amount/efficiency_coeff) + busy = TRUE + if(production_animation) + flick(production_animation, src) + var/timecoeff = D.lathe_time_factor / efficiency_coeff + addtimer(CALLBACK(src, .proc/reset_busy), (30 * timecoeff * amount) ** 0.5) + addtimer(CALLBACK(src, .proc/do_print, D.build_path, amount, efficient_mats, D.dangerous_construction), (32 * timecoeff * amount) ** 0.8) + return TRUE + +/obj/machinery/rnd/production/proc/search(string) + matching_designs.Cut() + for(var/v in stored_research.researched_designs) + var/datum/design/D = stored_research.researched_designs[v] + if(!(D.build_type & allowed_buildtypes) || !(D.departmental_flags & allowed_department_flags)) + continue + if(findtext(D.name,string)) + matching_designs.Add(D) + +/obj/machinery/rnd/production/proc/generate_ui() + var/list/ui = list() + ui += ui_header() + switch(screen) + if(RESEARCH_FABRICATOR_SCREEN_MATERIALS) + ui += ui_screen_materials() + if(RESEARCH_FABRICATOR_SCREEN_CHEMICALS) + ui += ui_screen_chemicals() + if(RESEARCH_FABRICATOR_SCREEN_SEARCH) + ui += ui_screen_search() + if(RESEARCH_FABRICATOR_SCREEN_CATEGORYVIEW) + ui += ui_screen_category_view() + else + ui += ui_screen_main() + for(var/i in 1 to length(ui)) + if(!findtextEx(ui[i], RDSCREEN_NOBREAK)) + ui[i] += "
" + ui[i] = replacetextEx(ui[i], RDSCREEN_NOBREAK, "") + return ui.Join("") + +/obj/machinery/rnd/production/proc/ui_header() + var/list/l = list() + l += "
[host_research.organization] [department_tag] Department Lathe" + l += "Security protocols: [(obj_flags & EMAGGED)? "Disabled" : "Enabled"]" + l += "Material Amount: [materials.total_amount] / [materials.max_amount]" + l += "Chemical volume: [reagents.total_volume] / [reagents.maximum_volume]" + l += "Synchronize Research" + l += "Main Screen
[RDSCREEN_NOBREAK]" + return l + +/obj/machinery/rnd/production/proc/ui_screen_materials() + var/list/l = list() + l += "

Material Storage:

" + for(var/mat_id in materials.materials) + var/datum/material/M = materials.materials[mat_id] + l += "* [M.amount] of [M.name]: " + if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "Eject [RDSCREEN_NOBREAK]" + if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) l += "5x [RDSCREEN_NOBREAK]" + if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "All[RDSCREEN_NOBREAK]" + l += "" + l += "
[RDSCREEN_NOBREAK]" + return l + +/obj/machinery/rnd/production/proc/ui_screen_chemicals() + var/list/l = list() + l += "
Disposal All Chemicals in Storage" + l += "

Chemical Storage:

" + for(var/datum/reagent/R in reagents.reagent_list) + l += "[R.name]: [R.volume]" + l += "Purge" + l += "
" + return l + +/obj/machinery/rnd/production/proc/ui_screen_search() + var/list/l = list() + var/coeff = efficiency_coeff + l += "

Search Results:

" + l += "
\ + \ + \ + \ + \ +

" + for(var/datum/design/D in matching_designs) + l += design_menu_entry(D, coeff) + l += "" + return l + +/obj/machinery/rnd/production/proc/design_menu_entry(datum/design/D, coeff) + if(!istype(D)) + return + if(!coeff) + coeff = efficiency_coeff + var/list/l = list() + var/temp_material + var/c = 50 + var/t + var/all_materials = D.materials + D.reagents_list + for(var/M in all_materials) + t = check_mat(D, M) + temp_material += " | " + if (t < 1) + temp_material += "[all_materials[M]/coeff] [CallMaterialName(M)]" + else + temp_material += " [all_materials[M]/coeff] [CallMaterialName(M)]" + c = min(c,t) + + if (c >= 1) + l += "[D.name][RDSCREEN_NOBREAK]" + if(c >= 5) + l += "x5[RDSCREEN_NOBREAK]" + if(c >= 10) + l += "x10[RDSCREEN_NOBREAK]" + l += "[temp_material][RDSCREEN_NOBREAK]" + else + l += "[D.name][temp_material][RDSCREEN_NOBREAK]" + l += "" + return l + +/obj/machinery/rnd/production/Topic(raw, ls) + if(..()) + return + add_fingerprint(usr) + usr.set_machine(src) + if(ls["switch_screen"]) + screen = text2num(ls["switch_screen"]) + if(ls["build"]) //Causes the Protolathe to build something. + if(busy) + say("Warning: Fabricators busy!") + else + user_try_print_id(ls["build"], ls["amount"]) + if(ls["search"]) //Search for designs with name matching pattern + search(ls["to_search"]) + screen = RESEARCH_FABRICATOR_SCREEN_SEARCH + if(ls["sync_research"]) + update_research() + say("Synchronizing research with host technology database.") + if(ls["category"]) + selected_category = ls["category"] + if(ls["dispose"]) //Causes the protolathe to dispose of a single reagent (all of it) + reagents.del_reagent(ls["dispose"]) + if(ls["disposeall"]) //Causes the protolathe to dispose of all it's reagents. + reagents.clear_reagents() + if(ls["ejectsheet"]) //Causes the protolathe to eject a sheet of material + materials.retrieve_sheets(text2num(ls["eject_amt"]), ls["ejectsheet"]) + updateUsrDialog() + +/obj/machinery/rnd/production/proc/ui_screen_main() + var/list/l = list() + l += "
\ + \ + \ + \ + \ + \ +

" + + l += list_categories(categories, RESEARCH_FABRICATOR_SCREEN_CATEGORYVIEW) + + return l + +/obj/machinery/rnd/production/proc/ui_screen_category_view() + if(!selected_category) + return ui_screen_main() + var/list/l = list() + l += "

Browsing [selected_category]:

" + var/coeff = efficiency_coeff + for(var/v in stored_research.researched_designs) + var/datum/design/D = stored_research.researched_designs[v] + if(!(selected_category in D.category)|| !(D.build_type & allowed_buildtypes)) + continue + if(!(D.departmental_flags & allowed_department_flags)) + continue + l += design_menu_entry(D, coeff) + l += "
" + return l + +/obj/machinery/rnd/production/proc/list_categories(list/categories, menu_num) + if(!categories) + return + + var/line_length = 1 + var/list/l = "" + + for(var/C in categories) + if(line_length > 2) + l += "" + line_length = 1 + + l += "" + line_length++ + + l += "
[C]
" + return l diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm new file mode 100644 index 0000000000..e51b1c5cf5 --- /dev/null +++ b/code/modules/research/machinery/circuit_imprinter.dm @@ -0,0 +1,25 @@ +/obj/machinery/rnd/production/circuit_imprinter + name = "circuit imprinter" + desc = "Manufactures circuit boards for the construction of machines." + icon_state = "circuit_imprinter" + container_type = OPENCONTAINER + circuit = /obj/item/circuitboard/machine/circuit_imprinter + categories = list( + "AI Modules", + "Computer Boards", + "Teleportation Machinery", + "Medical Machinery", + "Engineering Machinery", + "Exosuit Modules", + "Hydroponics Machinery", + "Subspace Telecomms", + "Research Machinery", + "Misc. Machinery", + "Computer Parts" + ) + production_animation = "circuit_imprinter_ani" + allowed_buildtypes = IMPRINTER + +/obj/machinery/rnd/production/circuit_imprinter/disconnect_console() + linked_console.linked_imprinter = null + ..() \ No newline at end of file diff --git a/code/modules/research/machinery/departmental_circuit_imprinter.dm b/code/modules/research/machinery/departmental_circuit_imprinter.dm new file mode 100644 index 0000000000..e1acdd5cc2 --- /dev/null +++ b/code/modules/research/machinery/departmental_circuit_imprinter.dm @@ -0,0 +1,13 @@ +/obj/machinery/rnd/production/circuit_imprinter/department + name = "Department Circuit Imprinter" + desc = "A special circuit imprinter with a built in interface meant for departmental usage, with built in ExoSync recievers allowing it to print designs researched that match its ROM-encoded department type. Features a bluespace materials reciever for recieving materials without the hassle of running to mining!" + icon_state = "circuit_imprinter" + container_type = OPENCONTAINER + circuit = /obj/item/circuitboard/machine/circuit_imprinter/department + requires_console = FALSE + consoleless_interface = TRUE + +/obj/machinery/rnd/production/circuit_imprinter/department/science + name = "department protolathe (Science)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SCIENCE + department_tag = "Science" \ No newline at end of file diff --git a/code/modules/research/machinery/departmental_protolathe.dm b/code/modules/research/machinery/departmental_protolathe.dm new file mode 100644 index 0000000000..1c315ab815 --- /dev/null +++ b/code/modules/research/machinery/departmental_protolathe.dm @@ -0,0 +1,44 @@ +/obj/machinery/rnd/production/protolathe/department + name = "department protolathe" + desc = "A special protolathe with a built in interface meant for departmental usage, with built in ExoSync recievers allowing it to print designs researched that match its ROM-encoded department type. Features a bluespace materials reciever for recieving materials without the hassle of running to mining!" + icon_state = "protolathe" + container_type = OPENCONTAINER + circuit = /obj/item/circuitboard/machine/protolathe/department + requires_console = FALSE + consoleless_interface = TRUE + +/obj/machinery/rnd/production/protolathe/department/engineering + name = "department protolathe (Engineering)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_ENGINEERING + department_tag = "Engineering" + circuit = /obj/item/circuitboard/machine/protolathe/department/engineering + +/obj/machinery/rnd/production/protolathe/department/service + name = "department protolathe (Service)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SERVICE + department_tag = "Service" + circuit = /obj/item/circuitboard/machine/protolathe/department/service + +/obj/machinery/rnd/production/protolathe/department/medical + name = "department protolathe (Medical)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_MEDICAL + department_tag = "Medical" + circuit = /obj/item/circuitboard/machine/protolathe/department/medical + +/obj/machinery/rnd/production/protolathe/department/cargo + name = "department protolathe (Cargo)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_CARGO + department_tag = "Cargo" + circuit = /obj/item/circuitboard/machine/protolathe/department/cargo + +/obj/machinery/rnd/production/protolathe/department/science + name = "department protolathe (Science)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SCIENCE + department_tag = "Science" + circuit = /obj/item/circuitboard/machine/protolathe/department/science + +/obj/machinery/rnd/production/protolathe/department/security + name = "department protolathe (Security)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SECURITY + department_tag = "Security" + circuit = /obj/item/circuitboard/machine/protolathe/department/security \ No newline at end of file diff --git a/code/modules/research/machinery/departmental_techfab.dm b/code/modules/research/machinery/departmental_techfab.dm new file mode 100644 index 0000000000..cf0e30596f --- /dev/null +++ b/code/modules/research/machinery/departmental_techfab.dm @@ -0,0 +1,42 @@ +/obj/machinery/rnd/production/techfab/department + name = "department techfab" + desc = "An advanced fabricator designed to print out the latest prototypes and circuits researched from Science. Contains hardware to sync to research networks. This one is department-locked and only possesses a limited set of decryption keys." + icon_state = "protolathe" + container_type = OPENCONTAINER + circuit = /obj/item/circuitboard/machine/techfab/department + +/obj/machinery/rnd/production/techfab/department/engineering + name = "department techfab (Engineering)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_ENGINEERING + department_tag = "Engineering" + circuit = /obj/item/circuitboard/machine/techfab/department/engineering + +/obj/machinery/rnd/production/techfab/department/service + name = "department techfab (Service)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SERVICE + department_tag = "Service" + circuit = /obj/item/circuitboard/machine/techfab/department/service + +/obj/machinery/rnd/production/techfab/department/medical + name = "department techfab (Medical)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_MEDICAL + department_tag = "Medical" + circuit = /obj/item/circuitboard/machine/techfab/department/medical + +/obj/machinery/rnd/production/techfab/department/cargo + name = "department techfab (Cargo)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_CARGO + department_tag = "Cargo" + circuit = /obj/item/circuitboard/machine/techfab/department/cargo + +/obj/machinery/rnd/production/techfab/department/science + name = "department techfab (Science)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SCIENCE + department_tag = "Science" + circuit = /obj/item/circuitboard/machine/techfab/department/science + +/obj/machinery/rnd/production/techfab/department/security + name = "department techfab (Security)" + allowed_department_flags = DEPARTMENTAL_FLAG_ALL|DEPARTMENTAL_FLAG_SECURITY + department_tag = "Security" + circuit = /obj/item/circuitboard/machine/techfab/department/security \ No newline at end of file diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm new file mode 100644 index 0000000000..ef74fec666 --- /dev/null +++ b/code/modules/research/machinery/protolathe.dm @@ -0,0 +1,25 @@ +/obj/machinery/rnd/production/protolathe + name = "protolathe" + desc = "Converts raw materials into useful objects." + icon_state = "protolathe" + container_type = OPENCONTAINER + circuit = /obj/item/circuitboard/machine/protolathe + categories = list( + "Power Designs", + "Medical Designs", + "Bluespace Designs", + "Stock Parts", + "Equipment", + "Mining Designs", + "Electronics", + "Weapons", + "Ammo", + "Firing Pins", + "Computer Parts" + ) + production_animation = "protolathe_n" + allowed_buildtypes = PROTOLATHE + +/obj/machinery/rnd/production/protolathe/disconnect_console() + linked_console.linked_lathe = null + ..() \ No newline at end of file diff --git a/code/modules/research/machinery/techfab.dm b/code/modules/research/machinery/techfab.dm new file mode 100644 index 0000000000..40b407ac61 --- /dev/null +++ b/code/modules/research/machinery/techfab.dm @@ -0,0 +1,35 @@ +/obj/machinery/rnd/production/techfab + name = "technology fabricator" + desc = "Produces researched prototypes with raw materials and energy." + icon_state = "protolathe" + container_type = OPENCONTAINER + circuit = /obj/item/circuitboard/machine/techfab + categories = list( + "Power Designs", + "Medical Designs", + "Bluespace Designs", + "Stock Parts", + "Equipment", + "Mining Designs", + "Electronics", + "Weapons", + "Ammo", + "Firing Pins", + "Computer Parts", + "AI Modules", + "Computer Boards", + "Teleportation Machinery", + "Medical Machinery", + "Engineering Machinery", + "Exosuit Modules", + "Hydroponics Machinery", + "Subspace Telecomms", + "Research Machinery", + "Misc. Machinery", + "Computer Parts" + ) + console_link = FALSE + production_animation = "protolathe_n" + requires_console = FALSE + consoleless_interface = TRUE + allowed_buildtypes = PROTOLATHE | IMPRINTER \ No newline at end of file diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm deleted file mode 100644 index 12630cafbe..0000000000 --- a/code/modules/research/protolathe.dm +++ /dev/null @@ -1,134 +0,0 @@ -/* -Protolathe - -Similar to an autolathe, you load glass and metal sheets (but not other objects) into it to be used as raw materials for the stuff -it creates. All the menus and other manipulation commands are in the R&D console. - -Note: Must be placed west/left of and R&D console to function. - -*/ -/obj/machinery/rnd/protolathe - name = "protolathe" - desc = "Converts raw materials into useful objects." - icon_state = "protolathe" - container_type = OPENCONTAINER - circuit = /obj/item/circuitboard/machine/protolathe - - var/efficiency_coeff - var/list/categories = list( - "Power Designs", - "Medical Designs", - "Bluespace Designs", - "Stock Parts", - "Equipment", - "Mining Designs", - "Electronics", - "Weapons", - "Ammo", - "Firing Pins", - "Computer Parts" - ) - - var/datum/component/material_container/materials //Store for hyper speed! - -/obj/machinery/rnd/protolathe/Initialize() - create_reagents(0) - materials = AddComponent(/datum/component/material_container, - list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0, - FALSE, list(/obj/item/stack, /obj/item/stack/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) - materials.precise_insertion = TRUE - RefreshParts() - return ..() - -/obj/machinery/rnd/protolathe/RefreshParts() - reagents.maximum_volume = 0 - for(var/obj/item/reagent_containers/glass/G in component_parts) - reagents.maximum_volume += G.volume - G.reagents.trans_to(src, G.reagents.total_volume) - - GET_COMPONENT(materials, /datum/component/material_container) - materials.max_amount = 0 - for(var/obj/item/stock_parts/matter_bin/M in component_parts) - materials.max_amount += M.rating * 75000 - - var/T = 1.2 - for(var/obj/item/stock_parts/manipulator/M in component_parts) - T -= M.rating/10 - efficiency_coeff = min(max(0, T), 1) - -/obj/machinery/rnd/protolathe/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material - var/list/all_materials = being_built.reagents_list + being_built.materials - - GET_COMPONENT(materials, /datum/component/material_container) - var/A = materials.amount(M) - if(!A) - A = reagents.get_reagent_amount(M) - - return round(A / max(1, (all_materials[M]*efficiency_coeff))) - -//we eject the materials upon deconstruction. -/obj/machinery/rnd/protolathe/on_deconstruction() - for(var/obj/item/reagent_containers/glass/G in component_parts) - reagents.trans_to(G, G.reagents.maximum_volume) - GET_COMPONENT(materials, /datum/component/material_container) - materials.retrieve_all() - ..() - - -/obj/machinery/rnd/protolathe/disconnect_console() - linked_console.linked_lathe = null - ..() - -/obj/machinery/rnd/protolathe/proc/user_try_print_id(id, amount) - if((!istype(linked_console) && requires_console) || !id) - return FALSE - if(istext(amount)) - amount = text2num(amount) - if(isnull(amount)) - amount = 1 - var/datum/design/D = (linked_console || requires_console)? linked_console.stored_research.researched_designs[id] : get_techweb_design_by_id(id) - if(!istype(D)) - return FALSE - if(D.make_reagents.len) - return FALSE - - var/power = 1000 - amount = CLAMP(amount, 1, 10) - for(var/M in D.materials) - power += round(D.materials[M] * amount / 5) - power = max(3000, power) - use_power(power) - - var/list/efficient_mats = list() - for(var/MAT in D.materials) - efficient_mats[MAT] = D.materials[MAT]*efficiency_coeff - - if(!materials.has_materials(efficient_mats, amount)) - say("Not enough materials to complete prototype[amount > 1? "s" : ""].") - return FALSE - for(var/R in D.reagents_list) - if(!reagents.has_reagent(R, D.reagents_list[R]*efficiency_coeff)) - say("Not enough reagents to complete prototype[amount > 1? "s" : ""].") - return FALSE - - materials.use_amount(efficient_mats, amount) - for(var/R in D.reagents_list) - reagents.remove_reagent(R, D.reagents_list[R]*efficiency_coeff) - - busy = TRUE - flick("protolathe_n", src) - var/timecoeff = efficiency_coeff * D.lathe_time_factor - - addtimer(CALLBACK(src, .proc/reset_busy), (32 * timecoeff * amount) ** 0.8) - addtimer(CALLBACK(src, .proc/do_print, D.build_path, amount, efficient_mats, D.dangerous_construction), (32 * timecoeff * amount) ** 0.8) - return TRUE - -/obj/machinery/rnd/protolathe/proc/do_print(path, amount, list/matlist, notify_admins) - if(notify_admins && usr) - investigate_log("[key_name(usr)] built [amount] of [path] at a protolathe.", INVESTIGATE_RESEARCH) - message_admins("[ADMIN_LOOKUPFLW(usr)] has built [amount] of [path] at a protolathe") - for(var/i in 1 to amount) - var/obj/item/I = new path(get_turf(src)) - if(!istype(I, /obj/item/stack/sheet) && !istype(I, /obj/item/stack/ore/bluespace_crystal)) - I.materials = matlist.Copy() - SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 42cf5a529b..c4628c70ef 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -27,8 +27,8 @@ doesn't have toxins access. circuit = /obj/item/circuitboard/computer/rdconsole var/obj/machinery/rnd/destructive_analyzer/linked_destroy //Linked Destructive Analyzer - var/obj/machinery/rnd/protolathe/linked_lathe //Linked Protolathe - var/obj/machinery/rnd/circuit_imprinter/linked_imprinter //Linked Circuit Imprinter + var/obj/machinery/rnd/production/protolathe/linked_lathe //Linked Protolathe + var/obj/machinery/rnd/production/circuit_imprinter/linked_imprinter //Linked Circuit Imprinter req_access = list(ACCESS_TOX) //lA AND SETTING MANIPULATION REQUIRES SCIENTIST ACCESS. @@ -70,16 +70,16 @@ doesn't have toxins access. if(linked_destroy == null) linked_destroy = D D.linked_console = src - else if(istype(D, /obj/machinery/rnd/protolathe)) + else if(istype(D, /obj/machinery/rnd/production/protolathe)) if(linked_lathe == null) - var/obj/machinery/rnd/protolathe/P = D + var/obj/machinery/rnd/production/protolathe/P = D if(!P.console_link) continue linked_lathe = D D.linked_console = src - else if(istype(D, /obj/machinery/rnd/circuit_imprinter)) + else if(istype(D, /obj/machinery/rnd/production/circuit_imprinter)) if(linked_imprinter == null) - var/obj/machinery/rnd/circuit_imprinter/C = D + var/obj/machinery/rnd/production/circuit_imprinter/C = D if(!C.console_link) continue linked_imprinter = D @@ -720,11 +720,11 @@ doesn't have toxins access. if(D.build_type) var/lathes = list() if(D.build_type & IMPRINTER) - lathes += "[machine_icon(/obj/machinery/rnd/circuit_imprinter)][RDSCREEN_NOBREAK]" + lathes += "[machine_icon(/obj/machinery/rnd/production/circuit_imprinter)][RDSCREEN_NOBREAK]" if (linked_imprinter && D.id in stored_research.researched_designs) l += "Imprint" if(D.build_type & PROTOLATHE) - lathes += "[machine_icon(/obj/machinery/rnd/protolathe)][RDSCREEN_NOBREAK]" + lathes += "[machine_icon(/obj/machinery/rnd/production/protolathe)][RDSCREEN_NOBREAK]" if (linked_lathe && D.id in stored_research.researched_designs) l += "Construct" if(D.build_type & AUTOLATHE) diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 707e3e1e46..0a8659c795 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -16,7 +16,6 @@ var/shocked = FALSE var/obj/machinery/computer/rdconsole/linked_console var/obj/item/loaded_item = null //the item loaded inside the machine (currently only used by experimentor and destructive analyzer) - var/allowed_department_flags = ALL /obj/machinery/rnd/proc/reset_busy() busy = FALSE @@ -47,8 +46,6 @@ if(panel_open) wires.interact(user) - - /obj/machinery/rnd/attackby(obj/item/O, mob/user, params) if (shocked) if(shock(user,50)) @@ -114,6 +111,6 @@ else var/obj/item/stack/S = type_inserted stack_name = initial(S.name) - use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * amount_inserted / 100))) + use_power(min(1000, (amount_inserted / 100))) add_overlay("protolathe_[stack_name]") addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index afdbcb4d4d..2fc41e1638 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -93,7 +93,7 @@ prereq_ids = list("base") design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "weldingmask", "mesons", "thermomachine", "tesla_coil", "grounding_rod", "apc_control", "cell_charger") - research_cost = 2500 + research_cost = 7500 export_price = 5000 /datum/techweb_node/adv_engi @@ -111,7 +111,7 @@ description = "Finely-tooled manufacturing techniques allowing for picometer-perfect precision levels." prereq_ids = list("engineering", "datatheory") design_ids = list("pico_mani", "super_matter_bin") - research_cost = 2500 + research_cost = 7500 export_price = 5000 /datum/techweb_node/adv_power @@ -129,7 +129,7 @@ display_name = "Basic Bluespace Theory" description = "Basic studies into the mysterious alternate dimension known as bluespace." prereq_ids = list("base") - design_ids = list("beacon", "xenobioconsole") + design_ids = list("beacon") //CIT CHANGE removed xenobioconsole from here. research_cost = 2500 export_price = 5000 @@ -140,7 +140,7 @@ prereq_ids = list("practical_bluespace", "high_efficiency") design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "tele_station", "tele_hub", "quantumpad", "launchpad", "launchpad_console", "teleconsole", "bag_holding", "bluespace_crystal", "wormholeprojector", "bluespace_pod") - research_cost = 2500 + research_cost = 15000 export_price = 5000 /datum/techweb_node/practical_bluespace @@ -148,8 +148,8 @@ display_name = "Applied Bluespace Research" description = "Using bluespace to make things faster and better." prereq_ids = list("bluespace_basic", "engineering") - design_ids = list("bs_rped","minerbag_holding", "telesci_gps", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning") - research_cost = 2500 + design_ids = list("bs_rped","minerbag_holding", "telesci_gps", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning", "roastingstick", "xenobioconsole") //CIT CHANGE added xenobioconsole here + research_cost = 5000 export_price = 5000 @@ -291,7 +291,7 @@ description = "Determining whether reversing the polarity will actually help in a given situation." prereq_ids = list("emp_basic") design_ids = list("ultra_micro_laser") - research_cost = 2500 + research_cost = 3000 export_price = 5000 /datum/techweb_node/emp_super @@ -300,7 +300,7 @@ description = "Even better electromagnetic technology." prereq_ids = list("emp_adv") design_ids = list("quadultra_micro_laser") - research_cost = 2500 + research_cost = 3000 export_price = 5000 /////////////////////////Clown tech///////////////////////// diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index e8937b5dae..f240e0b6af 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -350,7 +350,7 @@ switch(activation_type) if(SLIME_ACTIVATE_MINOR) to_chat(user, "You feel something wrong inside you...") - user.ForceContractDisease(new /datum/disease/transformation/slime(0)) + user.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) return 100 if(SLIME_ACTIVATE_MAJOR) diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm index 603af76f1a..bcbe74d896 100644 --- a/code/modules/ruins/spaceruin_code/caravanambush.dm +++ b/code/modules/ruins/spaceruin_code/caravanambush.dm @@ -53,6 +53,14 @@ shuttleId = "caravantrade1" possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;caravantrade1_custom;caravantrade1_ambush" +/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Initialize() + . = ..() + GLOB.jam_on_wardec += src + +/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Destroy() + GLOB.jam_on_wardec -= src + return ..() + /obj/machinery/computer/camera_advanced/shuttle_docker/caravan/trade1 name = "Small Freighter Navigation Computer" desc = "Used to designate a precise transit location for the Small Freighter." @@ -163,4 +171,4 @@ jumpto_ports = list("caravansyndicate3_ambush" = 1, "caravansyndicate3_listeningpost" = 1) view_range = 10 x_offset = -1 - y_offset = -3 \ No newline at end of file + y_offset = -3 diff --git a/code/modules/ruins/spaceruin_code/cloning_lab.dm b/code/modules/ruins/spaceruin_code/cloning_lab.dm new file mode 100644 index 0000000000..1e372f1fa4 --- /dev/null +++ b/code/modules/ruins/spaceruin_code/cloning_lab.dm @@ -0,0 +1,35 @@ +/obj/item/paper/fluff/ruins/exp_cloning/manual + name = "paper - 'H-11 Cloning Apparatus Manual" + info = {"

Getting Started

+ Congratulations, you are testing the H-11 experimental cloning device!
+ Using the H-11 is almost as simple as brain surgery! Simply insert the target humanoid into the scanning chamber and select the clone option to initiate cloning!
+ That's all there is to it!
+ Notice, cloning system cannot scan inorganic life or small primates. Scan may fail if subject has suffered extreme brain damage.
+

The provided CLONEPOD SYSTEM will produce the desired clone. Standard clone maturation times are roughly 90 seconds. + The cloning pod may be unlocked early after initial maturation is complete.


+ Please note that resulting clones will have a DEVELOPMENTAL DEFECT as a result of genetic drift. We hope to reduce this through further testing.
+ Clones may also experience memory loss and radical changes in personality as a result of the cloning process.

+
+ This technology produced under license from Thinktronic Systems, LTD."} + +/obj/item/paper/fluff/ruins/exp_cloning/log + name = "experiment log" + info = {"

Day 1

+ We are very excited to be part of the first crew of the SC Irmanda!
+ This ship is made to test an innovative FTL technology. I had some concerns at first, \ + but the engineers assure me that it is safe and there is absolutely no risk of the external wings breaking off from the acceleration.
+ We've been tasked with testing the latest model of the Thinktronic Cloning Pod. We'll stay in dock for a week before launching, but we're going to get started right away. \ + If the engine is as fast as they say, we might not have the time to run all the routine tests on the cloned subject!
+
+

Day 2

+ We cloned an unknown corpse that was given to us by the medical crew. The genetic replication is good enough to let the subject survive outside of the pod, \ + but the cellular damage remains a concern for his long-term survival. For safety we will be keeping him in quarantine.
+ We left him some books, but clearly we were too optimistic about his mental faculties. His brain seems to suffer from the same cloning decay that was caused by \ + the previous models. We will run further tests to see if there are improvements.
+

Day 4

+ It seems we'll be launching even sooner than expected! Apparently the press is starting to lose interest, so we have to cut short the pre-flight checks \ + and give them something to talk about. Hopefully this will end up with increased funding...
+ The crew has all been invited to the main hall, where we have seats for the initial FTL acceleration. Unfortunately the clone cannot leave the quarantine room \ + without risking infection, so we will strap him into the bed and hope for the best. We can grow another clone if anything goes wrong, anyway. +
+ Professor Galen Linkovich"} \ No newline at end of file diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index 61c3f8833f..7e45854628 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -42,7 +42,6 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) SSshuttle.emergency.modTimer(2) GLOB.security_level = SEC_LEVEL_BLUE sound_to_playing_players('sound/misc/voybluealert.ogg') // Citadel change - Makes alerts play a sound - for(var/obj/machinery/firealarm/FA in GLOB.machines) if(is_station_level(FA.z)) FA.update_icon() @@ -73,7 +72,6 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) SSshuttle.emergency.modTimer(0.5) GLOB.security_level = SEC_LEVEL_DELTA sound_to_playing_players('sound/misc/deltakalaxon.ogg') // Citadel change - Makes alerts play a sound - for(var/obj/machinery/firealarm/FA in GLOB.machines) if(is_station_level(FA.z)) FA.update_icon() diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm index b12662c02d..1d9b0f769b 100644 --- a/code/modules/shuttle/docking.dm +++ b/code/modules/shuttle/docking.dm @@ -135,7 +135,7 @@ var/atom/movable/moving_atom = old_contents[k] if(moving_atom.loc != oldT) //fix for multi-tile objects continue - move_mode = moving_atom.beforeShuttleMove(newT, rotation, move_mode) //atoms + move_mode = moving_atom.beforeShuttleMove(newT, rotation, move_mode, src) //atoms move_mode = oldT.fromShuttleMove(newT, underlying_turf_type, baseturf_cache, move_mode) //turfs move_mode = newT.toShuttleMove(oldT, move_mode , src) //turfs diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index e657cfde37..29c0de1b27 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -17,6 +17,7 @@ var/see_hidden = FALSE var/designate_time = 0 var/turf/designating_target_loc + var/jammed = FALSE /obj/machinery/computer/camera_advanced/shuttle_docker/Initialize() . = ..() @@ -26,6 +27,12 @@ . = ..() GLOB.navigation_computers -= src +/obj/machinery/computer/camera_advanced/shuttle_docker/attack_hand(mob/user) + if(jammed) + to_chat(user, "The Syndicate is jamming the console!") + return + return ..() + /obj/machinery/computer/camera_advanced/shuttle_docker/GrantActions(mob/living/user) if(jumpto_ports.len) jump_action = new /datum/action/innate/camera_jump/shuttle_docker @@ -199,7 +206,7 @@ /obj/machinery/computer/camera_advanced/shuttle_docker/proc/checkLandingTurf(turf/T, list/overlappers) // Too close to the map edge is never allowed - if(!T || T.x == 1 || T.y == 1 || T.x == world.maxx || T.y == world.maxy) + if(!T || T.x <= 10 || T.y <= 10 || T.x >= world.maxx - 10 || T.y >= world.maxy - 10) return SHUTTLE_DOCKER_BLOCKED // If it's one of our shuttle areas assume it's ok to be there if(shuttle_port.shuttle_areas[T.loc]) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 7b196b8289..ec596e31a1 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -82,7 +82,7 @@ All ShuttleMove procs go here // Called on every atom in shuttle turf contents before anything has been moved // returns the new move_mode (based on the old) // WARNING: Do not leave turf contents in beforeShuttleMove or dock() will runtime -/atom/movable/proc/beforeShuttleMove(turf/newT, rotation, move_mode) +/atom/movable/proc/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) return move_mode // Called on atoms to move the atom to the new location @@ -154,7 +154,7 @@ All ShuttleMove procs go here /************************************Machinery move procs************************************/ -/obj/machinery/door/airlock/beforeShuttleMove(turf/newT, rotation, move_mode) +/obj/machinery/door/airlock/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() shuttledocked = 0 for(var/obj/machinery/door/airlock/A in range(1, src)) @@ -168,7 +168,7 @@ All ShuttleMove procs go here for(var/obj/machinery/door/airlock/A in range(1, src)) A.shuttledocked = 1 -/obj/machinery/camera/beforeShuttleMove(turf/newT, rotation, move_mode) +/obj/machinery/camera/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) . |= MOVE_CONTENTS @@ -192,7 +192,7 @@ All ShuttleMove procs go here if(is_mining_level(z)) //Avoids double logging and landing on other Z-levels due to badminnery SSblackbox.record_feedback("associative", "colonies_dropped", 1, list("x" = x, "y" = y, "z" = z)) -/obj/machinery/gravity_generator/main/beforeShuttleMove(turf/newT, rotation, move_mode) +/obj/machinery/gravity_generator/main/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() on = FALSE update_list() @@ -203,7 +203,7 @@ All ShuttleMove procs go here on = TRUE update_list() -/obj/machinery/thruster/beforeShuttleMove(turf/newT, rotation, move_mode) +/obj/machinery/thruster/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) . |= MOVE_CONTENTS @@ -242,7 +242,7 @@ All ShuttleMove procs go here var/turf/T = loc hide(T.intact) -/obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode) +/obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() GLOB.navbeacons["[z]"] -= src GLOB.deliverybeacons -= src @@ -307,12 +307,12 @@ All ShuttleMove procs go here /************************************Structure move procs************************************/ -/obj/structure/grille/beforeShuttleMove(turf/newT, rotation, move_mode) +/obj/structure/grille/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) . |= MOVE_CONTENTS -/obj/structure/lattice/beforeShuttleMove(turf/newT, rotation, move_mode) +/obj/structure/lattice/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) . |= MOVE_CONTENTS @@ -327,7 +327,7 @@ All ShuttleMove procs go here if(level==1) hide(T.intact) -/obj/structure/shuttle/beforeShuttleMove(turf/newT, rotation, move_mode) +/obj/structure/shuttle/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) . |= MOVE_CONTENTS @@ -338,6 +338,11 @@ All ShuttleMove procs go here /atom/movable/lighting_object/onShuttleMove() return FALSE +/obj/docking_port/mobile/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) + . = ..() + if(moving_dock == src) + . |= MOVE_CONTENTS + /obj/docking_port/stationary/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) if(!moving_dock.can_move_docking_ports || old_dock == src) return FALSE diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 6a8fd7b3a1..844d6c020f 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -521,7 +521,7 @@ if(SHUTTLE_CALL) var/error = initiate_docking(destination, preferred_direction) if(error && error & (DOCKING_NULL_DESTINATION | DOCKING_NULL_SOURCE)) - var/msg = "A mobile dock in transit exited initiate_docking() with an error. This is most likely a mapping problem: Error: [error], ([src]) ([previous])" + var/msg = "A mobile dock in transit exited initiate_docking() with an error. This is most likely a mapping problem: Error: [error], ([src]) ([previous][ADMIN_JMP(previous)] -> [destination][ADMIN_JMP(destination)])" WARNING(msg) message_admins(msg) mode = SHUTTLE_IDLE diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 213e2d8b17..be17c0d641 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -5,7 +5,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/structure/spider/spiderling, /obj/item/disk/nuclear, /obj/machinery/nuclearbomb, - /obj/item/device/radio/beacon, + /obj/item/device/beacon, /obj/singularity, /obj/machinery/teleport/station, /obj/machinery/teleport/hub, @@ -17,7 +17,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/effect/clockwork/spatial_gateway, /obj/structure/destructible/clockwork/powered/clockwork_obelisk, /obj/item/device/warp_cube, - /obj/machinery/rnd/protolathe, //print tracking beacons, send shuttle + /obj/machinery/rnd/production/protolathe, //print tracking beacons, send shuttle /obj/machinery/autolathe, //same /obj/item/projectile/beam/wormhole, /obj/effect/portal, diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm index 79c2fda7ed..6264588a3a 100644 --- a/code/modules/shuttle/white_ship.dm +++ b/code/modules/shuttle/white_ship.dm @@ -18,3 +18,10 @@ y_offset = -10 designate_time = 100 +/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Initialize() + . = ..() + GLOB.jam_on_wardec += src + +/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Destroy() + GLOB.jam_on_wardec -= src + return ..() diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 997c83249a..6980cba8e2 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -69,7 +69,7 @@ P.preparePixelProjectile(target, user) for(var/V in projectile_var_overrides) if(P.vars[V]) - P.vars[V] = projectile_var_overrides[V] + P.vv_edit_var(V, projectile_var_overrides[V]) P.fire() return TRUE diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm index 306c3fcef6..18bfb54935 100644 --- a/code/modules/spells/spell_types/conjure.dm +++ b/code/modules/spells/spell_types/conjure.dm @@ -36,8 +36,8 @@ var/atom/summoned_object = new summoned_object_type(spawn_place) for(var/varName in newVars) - if(varName in summoned_object.vars) - summoned_object.vars[varName] = newVars[varName] + if(varName in newVars) + summoned_object.vv_edit_var(varName, newVars[varName]) summoned_object.admin_spawned = TRUE if(summon_lifespan) QDEL_IN(summoned_object, summon_lifespan) diff --git a/code/modules/spells/spell_types/emplosion.dm b/code/modules/spells/spell_types/emplosion.dm index e6393e8584..8c45c06379 100644 --- a/code/modules/spells/spell_types/emplosion.dm +++ b/code/modules/spells/spell_types/emplosion.dm @@ -15,4 +15,4 @@ continue empulse(target.loc, emp_heavy, emp_light) - return + return \ No newline at end of file diff --git a/code/modules/spells/spell_types/inflict_handler.dm b/code/modules/spells/spell_types/inflict_handler.dm index a1ba69b426..da0af7a601 100644 --- a/code/modules/spells/spell_types/inflict_handler.dm +++ b/code/modules/spells/spell_types/inflict_handler.dm @@ -49,4 +49,4 @@ target.blur_eyes(amt_eye_blurry) //summoning if(summon_type) - new summon_type(target.loc, target) + new summon_type(target.loc, target) \ No newline at end of file diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm index 28960fce31..d51f89be18 100644 --- a/code/modules/spells/spell_types/mime.dm +++ b/code/modules/spells/spell_types/mime.dm @@ -56,10 +56,15 @@ /obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr) for(var/mob/living/carbon/human/H in targets) H.mind.miming=!H.mind.miming + GET_COMPONENT_FROM(mood, /datum/component/mood, H) if(H.mind.miming) to_chat(H, "You make a vow of silence.") + if(mood) + mood.clear_event("vow") else to_chat(H, "You break your vow of silence.") + if(mood) + mood.add_event("vow", /datum/mood_event/broken_vow) // These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors. diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm index ab7702fcce..d568aa67f4 100644 --- a/code/modules/spells/spell_types/summonitem.dm +++ b/code/modules/spells/spell_types/summonitem.dm @@ -83,6 +83,9 @@ to_chat(C, "The [item_to_retrieve] that was embedded in your [L] has mysteriously vanished. How fortunate!") if(!C.has_embedded_objects()) C.clear_alert("embeddedobject") + GET_COMPONENT_FROM(mood, /datum/component/mood, C) + if(mood) + mood.clear_event("embedded") break else diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index b71413200a..cdef94127e 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -14,7 +14,7 @@ /datum/station_goal/bluespace_cannon/on_report() //Unlock BSA parts - var/datum/supply_pack/misc/bsa/P = SSshuttle.supply_packs[/datum/supply_pack/misc/bsa] + var/datum/supply_pack/engineering/bsa/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/bsa] P.special_enabled = TRUE /datum/station_goal/bluespace_cannon/check_completion() diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index a90b3598ce..a43e435977 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -44,10 +44,10 @@ /datum/station_goal/dna_vault/on_report() - var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/misc/dna_vault] + var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/dna_vault] P.special_enabled = TRUE - P = SSshuttle.supply_packs[/datum/supply_pack/misc/dna_probes] + P = SSshuttle.supply_packs[/datum/supply_pack/engineering/dna_probes] P.special_enabled = TRUE /datum/station_goal/dna_vault/check_completion() @@ -256,24 +256,25 @@ var/obj/item/organ/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS] L.tox_breath_dam_min = 0 L.tox_breath_dam_max = 0 - S.species_traits |= VIRUSIMMUNE + H.add_trait(TRAIT_VIRUSIMMUNE, "dna_vault") if(VAULT_NOBREATH) to_chat(H, "Your lungs feel great.") - S.species_traits |= NOBREATH + H.add_trait(TRAIT_NOBREATH, "dna_vault") if(VAULT_FIREPROOF) to_chat(H, "You feel fireproof.") S.burnmod = 0.5 - S.heatmod = 0 + H.add_trait(TRAIT_RESISTHEAT, "dna_vault") + H.add_trait(TRAIT_NOFIRE, "dna_vault") if(VAULT_STUNTIME) to_chat(H, "Nothing can keep you down for long.") S.stunmod = 0.5 if(VAULT_ARMOUR) to_chat(H, "You feel tough.") S.armor = 30 - + H.add_trait(TRAIT_PIERCEIMMUNE, "dna_vault") if(VAULT_SPEED) to_chat(H, "Your legs feel faster.") - S.speedmod = -1 + H.add_trait(TRAIT_GOTTAGOFAST, "dna_vault") if(VAULT_QUICK) to_chat(H, "Your arms move as fast as lightning.") H.next_move_modifier = 0.5 diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 265dd96532..815ecfe579 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -15,10 +15,10 @@ /datum/station_goal/station_shield/on_report() //Unlock - var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/misc/shield_sat] + var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat] P.special_enabled = TRUE - P = SSshuttle.supply_packs[/datum/supply_pack/misc/shield_sat_control] + P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat_control] P.special_enabled = TRUE /datum/station_goal/station_shield/check_completion() diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm index f661373acd..da42e4fdb9 100644 --- a/code/modules/surgery/advanced/viral_bonding.dm +++ b/code/modules/surgery/advanced/viral_bonding.dm @@ -17,7 +17,7 @@ /datum/surgery/advanced/viral_bonding/can_start(mob/user, mob/living/carbon/target) if(!..()) return FALSE - if(!LAZYLEN(target.viruses)) + if(!LAZYLEN(target.diseases)) return FALSE return TRUE @@ -38,7 +38,7 @@ /datum/surgery_step/viral_bond/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[target]'s bone marrow begins pulsing slowly.", "[target]'s bone marrow begins pulsing slowly. The viral bonding is complete.") - for(var/X in target.viruses) + for(var/X in target.diseases) var/datum/disease/D = X D.carrier = TRUE return TRUE \ No newline at end of file diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index c178d7f72f..133c22510e 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -62,7 +62,7 @@ /obj/item/bodypart/attack(mob/living/carbon/C, mob/user) if(ishuman(C)) var/mob/living/carbon/human/H = C - if(EASYLIMBATTACHMENT in H.dna.species.species_traits) + if(C.has_trait(TRAIT_LIMBATTACHMENT)) if(!H.get_bodypart(body_zone) && !animal_origin) if(H == user) H.visible_message("[H] jams [src] into [H.p_their()] empty socket!",\ diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 10f2d182fe..2cf8389a6b 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -6,21 +6,22 @@ //Dismember a limb /obj/item/bodypart/proc/dismember(dam_type = BRUTE) if(!owner) - return 0 + return FALSE var/mob/living/carbon/C = owner if(!dismemberable) - return 0 + return FALSE if(C.status_flags & GODMODE) - return 0 - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(NODISMEMBER in H.dna.species.species_traits) // species don't allow dismemberment - return 0 + return FALSE + if(C.has_trait(TRAIT_NODISMEMBER)) + return FALSE var/obj/item/bodypart/affecting = C.get_bodypart("chest") affecting.receive_damage(CLAMP(brute_dam/2, 15, 50), CLAMP(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage C.visible_message("[C]'s [src.name] has been violently dismembered!") C.emote("scream") + GET_COMPONENT_FROM(mood, /datum/component/mood, C) + if(mood) + mood.add_event("dismembered", /datum/mood_event/dismembered) drop_limb() if(dam_type == BURN) @@ -46,14 +47,12 @@ /obj/item/bodypart/chest/dismember() if(!owner) - return 0 + return FALSE var/mob/living/carbon/C = owner if(!dismemberable) - return 0 - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(NODISMEMBER in H.dna.species.species_traits) // species don't allow dismemberment - return 0 + return FALSE + if(C.has_trait(TRAIT_NODISMEMBER)) + return FALSE var/organ_spilled = 0 var/turf/T = get_turf(C) @@ -105,6 +104,9 @@ I.forceMove(src) if(!C.has_embedded_objects()) C.clear_alert("embeddedobject") + GET_COMPONENT_FROM(mood, /datum/component/mood, C) + if(mood) + mood.add_event("embedded") if(!special) if(C.dna) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 7ac387b4d8..2c90496eb6 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -121,6 +121,9 @@ I.forceMove(T) clear_alert("embeddedobject") + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood) + mood.clear_event("embedded") /mob/living/carbon/proc/has_embedded_objects() . = 0 diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index 35a2d851e3..4494148082 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -14,7 +14,7 @@ name = "appendix" /obj/item/organ/appendix/Remove(mob/living/carbon/M, special = 0) - for(var/datum/disease/appendicitis/A in M.viruses) + for(var/datum/disease/appendicitis/A in M.diseases) A.cure() inflamed = 1 update_icon() @@ -23,7 +23,7 @@ /obj/item/organ/appendix/Insert(mob/living/carbon/M, special = 0) ..() if(inflamed) - M.AddDisease(new /datum/disease/appendicitis) + M.ForceContractDisease(new /datum/disease/appendicitis(), FALSE, TRUE) /obj/item/organ/appendix/prepare_eat() var/obj/S = ..() diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index d9bcbc09d4..b840d82670 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -26,6 +26,8 @@ HMN.regenerate_icons() else eye_color = HMN.eye_color + if(HMN.has_trait(TRAIT_NIGHT_VISION) && !lighting_alpha) + lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT M.update_tint() owner.update_sight() @@ -75,6 +77,10 @@ desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." icon_state = "burning_eyes" +/obj/item/organ/eyes/night_vision/mushroom + name = "fung-eye" + desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." + ///Robotic /obj/item/organ/eyes/robotic @@ -128,12 +134,14 @@ eye.on = TRUE eye.forceMove(M) eye.update_brightness(M) + M.become_blind("flashlight_eyes") /obj/item/organ/eyes/robotic/flashlight/Remove(var/mob/living/carbon/M, var/special = 0) eye.on = FALSE eye.update_brightness(M) eye.forceMove(src) + M.cure_blind("flashlight_eyes") ..() // Welding shield implant diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index f492d99b8e..737ffbe6e8 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -68,17 +68,15 @@ /obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) if((H.status_flags & GODMODE)) return - - var/species_traits = list() - if(H && H.dna && H.dna.species && H.dna.species.species_traits) - species_traits = H.dna.species.species_traits + if(H.has_trait(TRAIT_NOBREATH)) + return if(!breath || (breath.total_moles() == 0)) if(H.reagents.has_reagent(crit_stabilizing_reagent)) return if(H.health >= HEALTH_THRESHOLD_CRIT) H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - else if(!(NOCRITDAMAGE in species_traits)) + else if(!H.has_trait(TRAIT_NOCRITDAMAGE)) H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) H.failed_last_breath = TRUE @@ -313,11 +311,7 @@ /obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures var/breath_temperature = breath.temperature - var/species_traits = list() - if(H && H.dna && H.dna.species && H.dna.species.species_traits) - species_traits = H.dna.species.species_traits - - if(!(GLOB.mutations_list[COLDRES] in H.dna.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE + if(!H.has_trait(TRAIT_RESISTCOLD)) // COLD DAMAGE var/cold_modifier = H.dna.species.coldmod if(breath_temperature < cold_level_3_threshold) H.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type) @@ -329,7 +323,7 @@ if(prob(20)) to_chat(H, "You feel [cold_message] in your [name]!") - if(!(RESISTHOT in species_traits)) // HEAT DAMAGE + if(!H.has_trait(TRAIT_RESISTHEAT)) // HEAT DAMAGE var/heat_modifier = H.dna.species.heatmod if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold) H.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index fcaf89c61c..fe613af015 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -110,7 +110,7 @@ var/breathes = TRUE var/blooded = TRUE if(dna && dna.species) - if(NOBREATH in dna.species.species_traits) + if(has_trait(TRAIT_NOBREATH, SPECIES_TRAIT)) breathes = FALSE if(NOBLOOD in dna.species.species_traits) blooded = FALSE diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 1422c20c7b..d54f94b0be 100755 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -36,21 +36,32 @@ H.blur_eyes(3) //We need to add more shit down here H.adjust_disgust(-0.5 * disgust_metabolism) - + GET_COMPONENT_FROM(mood, /datum/component/mood, H) switch(H.disgust) if(0 to DISGUST_LEVEL_GROSS) H.clear_alert("disgust") + if(mood) + mood.clear_event("disgust") if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS) H.throw_alert("disgust", /obj/screen/alert/gross) + if(mood) + mood.add_event("disgust", /datum/mood_event/disgust/gross) if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED) H.throw_alert("disgust", /obj/screen/alert/verygross) + if(mood) + mood.add_event("disgust", /datum/mood_event/disgust/verygross) if(DISGUST_LEVEL_DISGUSTED to INFINITY) H.throw_alert("disgust", /obj/screen/alert/disgusted) + if(mood) + mood.add_event("disgust", /datum/mood_event/disgust/disgusted) /obj/item/organ/stomach/Remove(mob/living/carbon/M, special = 0) var/mob/living/carbon/human/H = owner if(istype(H)) H.clear_alert("disgust") + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(mood) + mood.clear_event("disgust") ..() diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 577541e6c4..8f3fad38f8 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -30,6 +30,9 @@ L.embedded_objects -= I if(!H.has_embedded_objects()) H.clear_alert("embeddedobject") + GET_COMPONENT_FROM(mood, /datum/component/mood, H) + if(mood) + mood.clear_event("embedded") if(objects > 0) user.visible_message("[user] successfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name].") diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 47d35108a1..862991c4b8 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -1,7 +1,8 @@ //include unit test files in this module in this ifdef - +// CITADEL EDIT add vore_tests.dm #ifdef UNIT_TESTS #include "unit_test.dm" #include "reagent_recipe_collisions.dm" #include "reagent_id_typos.dm" +//#include "vore_tests.dm" #endif diff --git a/code/modules/unit_tests/vore_tests.dm b/code/modules/unit_tests/vore_tests.dm new file mode 100644 index 0000000000..6549aa9ce7 --- /dev/null +++ b/code/modules/unit_tests/vore_tests.dm @@ -0,0 +1,218 @@ +/datum/unit_test + var/static/default_mobloc = null + +/datum/unit_test/proc/create_test_mob(var/turf/mobloc = null, var/mobtype = /mob/living/carbon/human, var/with_mind = FALSE) + if(isnull(mobloc)) + if(!default_mobloc) + for(var/turf/simulated/floor/tiled/T in world) + var/pressure = T.zone.air.return_pressure() + if(90 < pressure && pressure < 120) // Find a turf between 90 and 120 + default_mobloc = T + break + mobloc = default_mobloc + if(!mobloc) + Fail("Unable to find a location to create test mob") + return FALSE + + var/mob/living/carbon/human/H = new mobtype(mobloc) + + if(with_mind) + H.mind_initialize("TestKey[rand(0,10000)]") + + return H + +/datum/unit_test/space_suffocation + name = "MOB: human mob suffocates in space" + + var/startOxyloss + var/endOxyloss + var/mob/living/carbon/human/H + async = 1 + +/datum/unit_test/space_suffocation/Run() + var/turf/open/space/T = locate() + + H = new(T) + startOxyloss = H.getOxyLoss() + + return 1 + +/datum/unit_test/space_suffocation/check_result() + if(H.life_tick < 10) + return 0 + + endOxyloss = H.getOxyLoss() + + if(!startOxyloss < endOxyloss) + Fail("Human mob is not taking oxygen damage in space. (Before: [startOxyloss]; after: [endOxyloss])") + + qdel(H) + return 1 + +/datum/unit_test/belly_nonsuffocation + name = "MOB: human mob does not suffocate in a belly" + var/startLifeTick + var/startOxyloss + var/endOxyloss + var/mob/living/carbon/human/pred + var/mob/living/carbon/human/prey + +/datum/unit_test/belly_nonsuffocation/Run() + pred = create_test_mob() + if(!istype(pred)) + return FALSE + prey = create_test_mob(pred.loc) + if(!istype(prey)) + return FALSE + + return TRUE + +/datum/unit_test/belly_nonsuffocation/check_result() + // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn()) + if(!pred.vore_organs || !pred.vore_organs.len) + return FALSE + + // Now that pred belly exists, we can eat the prey. + if(!pred.vore_selected) + Fail("[pred] has no vore_selected.") + return TRUE + + // Attempt to eat the prey + if(prey.loc != pred.vore_selected) + pred.vore_selected.nom_mob(prey) + + if(prey.loc != pred.vore_selected) + Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]") + return TRUE + + // Okay, we succeeded in eating them, now lets wait a bit + startLifeTick = pred.life_tick + startOxyloss = prey.getOxyLoss() + return FALSE + + if(pred.life_tick < (startLifeTick + 10)) + return FALSE // Wait for them to breathe a few times + + // Alright lets check it! + endOxyloss = prey.getOxyLoss() + if(startOxyloss < endOxyloss) + Fail("Prey takes oxygen damage in a pred's belly! (Before: [startOxyloss]; after: [endOxyloss])") + qdel(prey) + qdel(pred) + return TRUE +//////////////////////////////////////////////////////////////// +/datum/unit_test/belly_spacesafe + name = "MOB: human mob protected from space in a belly" + var/startLifeTick + var/startOxyloss + var/startBruteloss + var/endOxyloss + var/endBruteloss + var/mob/living/carbon/human/pred + var/mob/living/carbon/human/prey + +/datum/unit_test/belly_spacesafe/Run() + pred = create_test_mob() + if(!istype(pred)) + return FALSE + prey = create_test_mob(pred.loc) + if(!istype(prey)) + return FALSE + + return TRUE + +/datum/unit_test/belly_spacesafe/check_result() + // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn()) + if(!pred.vore_organs || !pred.vore_organs.len) + return FALSE + + // Now that pred belly exists, we can eat the prey. + if(!pred.vore_selected) + Fail("[pred] has no vore_selected.") + return TRUE + + // Attempt to eat the prey + if(prey.loc != pred.vore_selected) + pred.vore_selected.nom_mob(prey) + + if(prey.loc != pred.vore_selected) + Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]") + return TRUE + else + var/turf/T = locate(/turf/open/space) + if(!T) + Fail("could not find a space turf for testing") + return TRUE + else + pred.forceMove(T) + + // Okay, we succeeded in eating them, now lets wait a bit + startLifeTick = pred.life_tick + startOxyloss = prey.getOxyLoss() + startBruteloss = prey.getBruteloss() + return FALSE + + if(pred.life_tick < (startLifeTick + 10)) + return FALSE // Wait for them to breathe a few times + + // Alright lets check it! + endOxyloss = prey.getOxyLoss() + endBruteloss = prey.getBruteLoss() + if(startBruteloss < endBruteloss) + Fail("Prey takes brute damage in space! (Before: [startBruteloss]; after: [endBruteloss])") + qdel(prey) + qdel(pred) + return TRUE +//////////////////////////////////////////////////////////////// +/datum/unit_test/belly_damage + name = "MOB: human mob takes damage from digestion" + var/startLifeTick + var/startBruteBurn + var/endBruteBurn + var/mob/living/carbon/human/pred + var/mob/living/carbon/human/prey + +/datum/unit_test/belly_damage/Run() + pred = create_test_mob() + if(!istype(pred)) + return FALSE + prey = create_test_mob(pred.loc) + if(!istype(prey)) + return FALSE + + return TRUE + +/datum/unit_test/belly_damage/check_result() + // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn()) + if(!pred.vore_organs || !pred.vore_organs.len) + return FALSE + + // Now that pred belly exists, we can eat the prey. + if(!pred.vore_selected) + Fail("[pred] has no vore_selected.") + return TRUE + + // Attempt to eat the prey + if(prey.loc != pred.vore_selected) + pred.vore_selected.nom_mob(prey) + + if(prey.loc != pred.vore_selected) + Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]") + return TRUE + + // Okay, we succeeded in eating them, now lets wait a bit + pred.vore_selected.digest_mode = DM_DIGEST + startLifeTick = pred.life_tick + startBruteBurn = prey.getBruteLoss() + prey.getFireLoss() + return FALSE + + if(pred.life_tick < (startLifeTick + 10)) + return FALSE // Wait a few ticks for damage to happen + + // Alright lets check it! + endBruteBurn = prey.getBruteLoss() + prey.getFireLoss() + if(startBruteBurn >= endBruteBurn) + Fail("Prey doesn't take damage in digesting belly! (Before: [startBruteBurn]; after: [endBruteBurn])") + qdel(prey) + qdel(pred) + return TRUE diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm deleted file mode 100644 index d175f51e02..0000000000 --- a/code/modules/vore/eating/belly_vr.dm +++ /dev/null @@ -1,467 +0,0 @@ -// -// The belly object is what holds onto a mob while they're inside a predator. -// It takes care of altering the pred's decription, digesting the prey, relaying struggles etc. -// - -// If you change what variables are on this, then you need to update the copy() proc. - -// -// Parent type of all the various "belly" varieties. -// -/datum/belly - var/name // Name of this location - var/inside_flavor // Flavor text description of inside sight/sound/smells/feels. - var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone - var/vore_verb = "ingest" // Verb for eating with this in messages - var/human_prey_swallow_time = 10 SECONDS // Time in deciseconds to swallow /mob/living/carbon/human - var/nonhuman_prey_swallow_time = 5 SECONDS // Time in deciseconds to swallow anything else - var/emoteTime = 30 SECONDS // How long between stomach emotes at prey - var/digest_brute = 0 // Brute damage per tick in digestion mode - var/digest_burn = 1 // Burn damage per tick in digestion mode - var/digest_tickrate = 9 // Modulus this of air controller tick number to iterate gurgles on - var/immutable = FALSE // Prevents this belly from being deleted - var/escapable = FALSE // Belly can be resisted out of at any time - var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly - var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles -// var/silenced = FALSE // Will the heartbeat/fleshy internal loop play? - var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles. - - var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off. - var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting - var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location - var/autotransferwait = 10 // Time between trying to transfer. - var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. - - var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest. - var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes - var/tmp/mob/living/owner // The mob whose belly this is. - var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly! - var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages) - var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote - var/swallow_time = 10 SECONDS // for mob transfering automation - var/vore_capacity = 1 // The capacity (in people) this person can hold - - // Don't forget to watch your commas at the end of each line if you change these. - var/list/struggle_messages_outside = list( - "%pred's %belly wobbles with a squirming meal.", - "%pred's %belly jostles with movement.", - "%pred's %belly briefly swells outward as someone pushes from inside.", - "%pred's %belly fidgets with a trapped victim.", - "%pred's %belly jiggles with motion from inside.", - "%pred's %belly sloshes around.", - "%pred's %belly gushes softly.", - "%pred's %belly lets out a wet squelch.") - - var/list/struggle_messages_inside = list( - "Your useless squirming only causes %pred's slimy %belly to squelch over your body.", - "Your struggles only cause %pred's %belly to gush softly around you.", - "Your movement only causes %pred's %belly to slosh around you.", - "Your motion causes %pred's %belly to jiggle.", - "You fidget around inside of %pred's %belly.", - "You shove against the walls of %pred's %belly, making it briefly swell outward.", - "You jostle %pred's %belly with movement.", - "You squirm inside of %pred's %belly, making it wobble around.") - - var/list/digest_messages_owner = list( - "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.", - "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.", - "Your %belly lets out a rumble as it melts %prey into sludge.", - "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.", - "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.", - "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.", - "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.", - "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.", - "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.", - "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.") - - var/list/digest_messages_prey = list( - "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.", - "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.", - "%pred's %belly lets out a rumble as it melts you into sludge.", - "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.", - "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.", - "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.", - "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.", - "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.", - "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.", - "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.") - - var/list/examine_messages = list( - "They have something solid in their %belly!", - "It looks like they have something in their %belly!") - - //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into - //a carbon's belly if someone really wanted. No UI for carbons to adjust this. - //List has indexes that are the digestion mode strings, and keys that are lists of strings. - var/list/emote_lists = list() - -// Constructor that sets the owning mob -/datum/belly/New(var/mob/living/owning_mob) - owner = owning_mob - -// Toggle digestion on/off and notify user of the new setting. -// If multiple digestion modes are avaliable (i.e. unbirth) then user should be prompted. -/datum/belly/proc/toggle_digestion() - return - -// Checks if any mobs are present inside the belly -// return True if the belly is empty. -/datum/belly/proc/is_empty() - return internal_contents.len == 0 - -// Release all contents of this belly into the owning mob's location. -// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in. -// Returns the number of mobs so released. -/datum/belly/proc/release_all_contents() - if (internal_contents.len == 0) - return 0 - for (var/atom/movable/M in internal_contents) - M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner. - for(var/mob/living/W in M) - W.stop_sound_channel(CHANNEL_PREYLOOP) - internal_contents.Remove(M) // Remove from the belly contents - - var/datum/belly/B = check_belly(owner) // This makes sure that the mob behaves properly if released into another mob - if(B) - B.internal_contents.Add(M) - - owner.visible_message("[owner] expels everything from their [lowertext(name)]!") - return TRUE - -// Release a specific atom from the contents of this belly into the owning mob's location. -// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in. -// Returns the number of atoms so released. -/datum/belly/proc/release_specific_contents(var/atom/movable/M) - if (!(M in internal_contents)) - return FALSE // They weren't in this belly anyway - - M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner. - for(var/mob/living/W in M) - W.stop_sound_channel(CHANNEL_PREYLOOP) - src.internal_contents.Remove(M) // Remove from the belly contents - - var/datum/belly/B = check_belly(owner) - if(B) - B.internal_contents.Add(M) - - owner.visible_message("[owner] expels [M] from their [lowertext(name)]!") -// owner.regenerate_icons() - return TRUE - -// Actually perform the mechanics of devouring the tasty prey. -// The purpose of this method is to avoid duplicate code, and ensure that all necessary -// steps are taken. -/datum/belly/proc/nom_mob(var/mob/prey, var/mob/user) - var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE) - - prey.forceMove(owner) - internal_contents.Add(prey) - prey.playsound_local(get_turf(prey),preyloop,40,0, channel = CHANNEL_PREYLOOP) - - // Handle prey messages - if(inside_flavor) - to_chat(prey, "[src.inside_flavor]") - if(isliving(prey)) - var/mob/living/M = prey - if(can_taste && M.get_taste_message(0)) - to_chat(owner, "[M] tastes of [M.get_taste_message(0)].") - - // Setup the autotransfer checks if needed - if(transferlocation && autotransferchance > 0) - addtimer(CALLBACK(src, /datum/belly/.proc/check_autotransfer, prey), autotransferwait) - -/datum/belly/proc/check_autotransfer(var/mob/prey) - // Some sanity checks - if(transferlocation && (autotransferchance > 0) && (prey in internal_contents)) - if(prob(autotransferchance)) - // Double check transferlocation isn't insane - if(verify_transferlocation()) - transfer_contents(prey, transferlocation) - else - // Didn't transfer, so wait before retrying - addtimer(CALLBACK(src, /datum/belly/.proc/check_autotransfer, prey), autotransferwait) - -/datum/belly/proc/verify_transferlocation() - for(var/I in owner.vore_organs) - var/datum/belly/B = owner.vore_organs[I] - if(B == transferlocation) - return TRUE - - for(var/I in owner.vore_organs) - var/datum/belly/B = owner.vore_organs[I] - if(B.name == transferlocation.name) - transferlocation = B - return TRUE - return FALSE - -// Get the line that should show up in Examine message if the owner of this belly -// is examined. By making this a proc, we not only take advantage of polymorphism, -// but can easily make the message vary based on how many people are inside, etc. -// Returns a string which shoul be appended to the Examine output. -/datum/belly/proc/get_examine_msg() - if(internal_contents.len && examine_messages.len) - var/formatted_message - var/raw_message = pick(examine_messages) - - formatted_message = replacetext(raw_message,"%belly",lowertext(name)) - formatted_message = replacetext(formatted_message,"%pred",owner) - formatted_message = replacetext(formatted_message,"%prey",english_list(internal_contents)) - - return("[formatted_message]
") - -// The next function gets the messages set on the belly, in human-readable format. -// This is useful in customization boxes and such. The delimiter right now is \n\n so -// in message boxes, this looks nice and is easily delimited. -/datum/belly/proc/get_messages(var/type, var/delim = "\n\n") - ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em") - var/list/raw_messages - - switch(type) - if("smo") - raw_messages = struggle_messages_outside - if("smi") - raw_messages = struggle_messages_inside - if("dmo") - raw_messages = digest_messages_owner - if("dmp") - raw_messages = digest_messages_prey - if("em") - raw_messages = examine_messages - - var/messages = list2text(raw_messages,delim) - return messages - -// The next function sets the messages on the belly, from human-readable var -// replacement strings and linebreaks as delimiters (two \n\n by default). -// They also sanitize the messages. -/datum/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n") - ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em") - - var/list/raw_list = text2list(html_encode(raw_text),delim) - if(raw_list.len > 10) - raw_list.Cut(11) - - for(var/i = 1, i <= raw_list.len, i++) - if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size - raw_list.Cut(i,i) - else - raw_list[i] = readd_quotes(raw_list[i]) - //Also fix % sign for var replacement - raw_list[i] = replacetext(raw_list[i],"%","%") - - ASSERT(raw_list.len <= 10) //Sanity - - switch(type) - if("smo") - struggle_messages_outside = raw_list - if("smi") - struggle_messages_inside = raw_list - if("dmo") - digest_messages_owner = raw_list - if("dmp") - digest_messages_prey = raw_list - if("em") - examine_messages = raw_list - - return - -// Handle the death of a mob via digestion. -// Called from the process_Life() methods of bellies that digest prey. -// Default implementation calls M.death() and removes from internal contents. -// Indigestable items are removed, and M is deleted. -/datum/belly/proc/digestion_death(var/mob/living/M) - is_full = TRUE - internal_contents.Remove(M) - M.stop_sound_channel(CHANNEL_PREYLOOP) - // If digested prey is also a pred... anyone inside their bellies gets moved up. - if(is_vore_predator(M)) - for(var/bellytype in M.vore_organs) - var/datum/belly/belly = M.vore_organs[bellytype] - for (var/obj/thing in belly.internal_contents) - thing.loc = owner - internal_contents.Add(thing) - for (var/mob/subprey in belly.internal_contents) - subprey.loc = owner - internal_contents.Add(subprey) - to_chat(subprey, "As [M] melts away around you, you find yourself in [owner]'s [name]") - - //Drop all items into the belly - for(var/obj/item/W in M) - if(!M.dropItemToGround(W)) - qdel(W) - - message_admins("[key_name(owner)] digested [key_name(M)].") - log_attack("[key_name(owner)] digested [key_name(M)].") - - // Delete the digested mob - qdel(M) - -//Handle a mob struggling -// Called from /mob/living/carbon/relaymove() -/datum/belly/proc/relay_resist(var/mob/living/R) - if (!(R in internal_contents)) - return // User is not in this belly, or struggle too soon. - - R.setClickCooldown(50) - var/sound/prey_struggle = sound(get_sfx("prey_struggle")) - - if(owner.stat) //If owner is stat (dead, KO) we can actually escape - to_chat(R, "You attempt to climb out of \the [name]. (This will take around [escapetime/10] seconds.)") - to_chat(owner, "Someone is attempting to climb out of your [name]!") - - if(do_after(R, escapetime, owner)) - if((owner.stat || escapable) && (R in internal_contents)) //Can still escape? - release_specific_contents(R) - return - else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail. - return - else //Belly became inescapable or mob revived - to_chat(R, "Your attempt to escape [name] has failed!") - to_chat(owner, "The attempt to escape from your [name] has failed!") - return - return - var/struggle_outer_message = pick(struggle_messages_outside) - var/struggle_user_message = pick(struggle_messages_inside) - - struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner) - struggle_outer_message = replacetext(struggle_outer_message,"%prey",R) - struggle_outer_message = replacetext(struggle_outer_message,"%belly",lowertext(name)) - - struggle_user_message = replacetext(struggle_user_message,"%pred",owner) - struggle_user_message = replacetext(struggle_user_message,"%prey",R) - struggle_user_message = replacetext(struggle_user_message,"%belly",lowertext(name)) - - struggle_outer_message = "" + struggle_outer_message + "" - struggle_user_message = "" + struggle_user_message + "" - - R.visible_message( "[struggle_outer_message]", "[struggle_user_message]") - playsound(get_turf(owner),"struggle_sound",35,0,-6,1,channel=151,ignore_walls = FALSE) - R.stop_sound_channel(151) - R.playsound_local(get_turf(R),prey_struggle,45,0) - - if(escapable && R.a_intent != "help") //If the stomach has escapable enabled and the person is actually trying to kick out - to_chat(R, "You attempt to climb out of \the [name].") - to_chat(owner, "Someone is attempting to climb out of your [name]!") - if(prob(escapechance)) //Let's have it check to see if the prey escapes first. - if(do_after(R, escapetime)) - if((escapable) && (R in internal_contents)) //Does the owner still have escapable enabled? - release_specific_contents(R) - to_chat(R, "You climb out of \the [name].") - to_chat(owner, "[R] climbs out of your [name]!") - for(var/mob/M in viewers(4, owner)) - M.visible_message("[R] climbs out of [owner]'s [name]!", 2) - return - else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail. - return - else //Belly became inescapable. - to_chat(R, "Your attempt to escape [name] has failed!") - to_chat(owner, "The attempt to escape from your [name] has failed!/span>") - return - - else if(prob(transferchance) && istype(transferlocation)) //Next, let's have it see if they end up getting into an even bigger mess then when they started. - var/location_ok = verify_transferlocation() - - if(!location_ok) - to_chat(owner, "Something went wrong with your belly transfer settings.") - transferlocation = null - return - - to_chat(R, "Your attempt to escape [name] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!") - to_chat(owner, "Someone slid into your [transferlocation] due to their struggling inside your [name]!") - transfer_contents(R, transferlocation) - return - - else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.) - to_chat(R, "In response to your struggling, \the [name] begins to get more active...") - to_chat(owner, "You feel your [name] beginning to become active!") - digest_mode = DM_DIGEST - return - else //Nothing interesting happened. - to_chat(R, "But make no progress in escaping [owner]'s [name].") - to_chat(owner, "But appears to be unable to make any progress in escaping your [name].") - return - -//Transfers contents from one belly to another -/datum/belly/proc/transfer_contents(var/atom/movable/content, var/datum/belly/target, silent = 0) - if(!(content in internal_contents)) - return - internal_contents.Remove(content) - // Re-use nom_mob - target.nom_mob(content, target.owner) - if(!silent) - playsound(get_turf(owner),"[target].vore_sound",35,0,-6,1,ignore_walls = FALSE) -/* -//Handles creation of temporary 'vore chest' upon digestion -/datum/belly/proc/slimy_mass(var/obj/item/content, var/mob/living/M) - if(!content in internal_contents) - return - internal_contents += new /obj/structure/closet/crate/vore(src) - internal_contents.Remove(content) - M.transferItemToLoc(content, /obj/structure/closet/crate/vore) - if(!M.transferItemToLoc(W)) - qdel(W) - -/datum/belly/proc/regurgitate_items(var/obj/structure/closet/crate/vore/C) - */ - -// Belly copies and then returns the copy -// Needs to be updated for any var changes -/datum/belly/proc/copy(mob/new_owner) - var/datum/belly/dupe = new /datum/belly(new_owner) - - //// Non-object variables - dupe.name = name - dupe.inside_flavor = inside_flavor - dupe.vore_sound = vore_sound - dupe.vore_verb = vore_verb - dupe.human_prey_swallow_time = human_prey_swallow_time - dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time - dupe.emoteTime = emoteTime - dupe.digest_brute = digest_brute - dupe.digest_burn = digest_burn - dupe.digest_tickrate = digest_tickrate - dupe.immutable = immutable - dupe.can_taste = can_taste - dupe.escapable = escapable - dupe.escapetime = escapetime - dupe.digestchance = digestchance - dupe.escapechance = escapechance - dupe.transferchance = transferchance - dupe.transferlocation = transferlocation - dupe.autotransferchance = autotransferchance - dupe.autotransferwait = autotransferwait - - //// Object-holding variables - //struggle_messages_outside - strings - dupe.struggle_messages_outside.Cut() - for(var/I in struggle_messages_outside) - dupe.struggle_messages_outside += I - - //struggle_messages_inside - strings - dupe.struggle_messages_inside.Cut() - for(var/I in struggle_messages_inside) - dupe.struggle_messages_inside += I - - //digest_messages_owner - strings - dupe.digest_messages_owner.Cut() - for(var/I in digest_messages_owner) - dupe.digest_messages_owner += I - - //digest_messages_prey - strings - dupe.digest_messages_prey.Cut() - for(var/I in digest_messages_prey) - dupe.digest_messages_prey += I - - //examine_messages - strings - dupe.examine_messages.Cut() - for(var/I in examine_messages) - dupe.examine_messages += I - - //emote_lists - index: digest mode, key: list of strings - dupe.emote_lists.Cut() - for(var/K in emote_lists) - dupe.emote_lists[K] = list() - for(var/I in emote_lists[K]) - dupe.emote_lists[K] += I - - return dupe diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm deleted file mode 100644 index 3d00f9e0fe..0000000000 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ /dev/null @@ -1,143 +0,0 @@ -// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc) -// Called from /mob/living/Life() proc. -/datum/belly/proc/process_Life() - var/sound/prey_gurgle = sound(get_sfx("digest_prey")) - var/sound/prey_digest = sound(get_sfx("death_prey")) - -/////////////////////////// Auto-Emotes /////////////////////////// - if((digest_mode in emote_lists) && !emotePend) - emotePend = TRUE - - spawn(emoteTime) - var/list/EL = emote_lists[digest_mode] - for(var/mob/living/M in internal_contents) - M << "[pick(EL)]" - src.emotePend = FALSE - -///////////////////////////// DM_HOLD ///////////////////////////// - if(digest_mode == DM_HOLD) - return //Pretty boring, huh - -//////////////////////////// DM_DIGEST //////////////////////////// - if(digest_mode == DM_DIGEST) - for (var/mob/living/M in internal_contents) - if(prob(25)) - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_gurgle) - - //Pref protection! - if (!M.digestable) - continue - - //Person just died in guts! - if(M.stat == DEAD) - var/digest_alert_owner = pick(digest_messages_owner) - var/digest_alert_prey = pick(digest_messages_prey) - - //Replace placeholder vars - digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner) - digest_alert_owner = replacetext(digest_alert_owner,"%prey",M) - digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name)) - - digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner) - digest_alert_prey = replacetext(digest_alert_prey,"%prey",M) - digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name)) - - //Send messages - to_chat(owner, "[digest_alert_owner]") - to_chat(M, "[digest_alert_prey]") - M.visible_message("You watch as [owner]'s form loses its additions.") - - owner.nutrition += 400 // so eating dead mobs gives you *something*. - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"death_pred",45,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_digest) - digestion_death(M) - owner.update_icons() - continue - - - // Deal digestion damage (and feed the pred) - if(!(M.status_flags & GODMODE)) - M.adjustFireLoss(digest_burn) - owner.nutrition += 1 - return - -///////////////////////////// DM_HEAL ///////////////////////////// - if(digest_mode == DM_HEAL) - for (var/mob/living/M in internal_contents) - if(prob(25)) - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_gurgle) - - if(M.stat != DEAD) - if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth)) - M.adjustBruteLoss(-1) - M.adjustFireLoss(-1) - owner.nutrition -= 10 - return - -////////////////////////// DM_NOISY ///////////////////////////////// -//for when you just want people to squelch around - if(digest_mode == DM_NOISY) - for (var/mob/living/M in internal_contents) - if(prob(35)) - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_gurgle) - - -//////////////////////////DM_DRAGON ///////////////////////////////////// -//because dragons need snowflake guts - if(digest_mode == DM_DRAGON) - for (var/mob/living/M in internal_contents) - if(prob(25)) - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_gurgle) - - //No digestion protection for megafauna. - - //Person just died in guts! - if(M.stat == DEAD) - var/digest_alert_owner = pick(digest_messages_owner) - var/digest_alert_prey = pick(digest_messages_prey) - - //Replace placeholder vars - digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner) - digest_alert_owner = replacetext(digest_alert_owner,"%prey",M) - digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name)) - - digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner) - digest_alert_prey = replacetext(digest_alert_prey,"%prey",M) - digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name)) - - //Send messages - to_chat(owner, "[digest_alert_owner]") - to_chat(M, "[digest_alert_prey]") - M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal.") - - M.stop_sound_channel(CHANNEL_PRED) - playsound(get_turf(owner),"death_pred",45,0,-6,0,channel=CHANNEL_PRED) - M.stop_sound_channel(CHANNEL_PRED) - M.playsound_local(get_turf(M), null, 45, S = prey_digest) - M.spill_organs(FALSE,TRUE,TRUE) - M << sound(null, repeat = 0, wait = 0, volume = 80, channel = CHANNEL_PREYLOOP) - digestion_death(M) - owner.update_icons() - continue - - - // Deal digestion damage (and feed the pred) - if(!(M.status_flags & GODMODE)) - M.adjustFireLoss(digest_burn) - M.adjustToxLoss(4) // something something plasma based acids - M.adjustCloneLoss(3) // eventually this'll kill you if you're healing everything else, you nerds. - return \ No newline at end of file diff --git a/config/config.txt b/config/config.txt index 0440549c88..a8c9cf13de 100644 --- a/config/config.txt +++ b/config/config.txt @@ -46,6 +46,9 @@ MENTOR_LEGACY_SYSTEM ## Comment this out if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. BAN_LEGACY_SYSTEM +## Comment this out to stop locally connected clients from being given the almost full access !localhost! admin rank +ENABLE_LOCALHOST_RANK + ## Uncomment this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing ## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. ## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. @@ -70,7 +73,6 @@ BAN_LEGACY_SYSTEM ## Allows admins to bypass job playtime requirements. #USE_EXP_RESTRICTIONS_ADMIN_BYPASS - ## log OOC channel LOG_OOC diff --git a/config/game_options.txt b/config/game_options.txt index 6cdc0990ad..d056fb7569 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -223,6 +223,21 @@ BROTHER_OBJECTIVES_AMOUNT 2 ## If late-joining players have a chance to become a traitor/changeling ALLOW_LATEJOIN_ANTAGONISTS +## Comment this out to disable the antagonist reputation system. This system rewards players who participate in the game instead of greytiding by giving them slightly higher odds to +## roll antagonist in subsequent rounds until they get it. +## +## For details See the comments for /datum/game_mode/proc/antag_pick in code/game/gamemodes/game_mode.dm +# USE_ANTAG_REP + +## The maximum amount of antagonist reputation tickets a player can bank (not use at once) +ANTAG_REP_MAXIMUM 200 + +## The default amount of tickets all users use while rolling +DEFAULT_ANTAG_TICKETS 100 + +## The maximum amount of extra tickets a user may use from their ticket bank in addition to the default tickets +MAX_TICKETS_PER_ROLL 100 + ## Uncomment to allow players to see the set odds of different rounds in secret/random in the get server revision screen. This will NOT tell the current roundtype. #SHOW_GAME_TYPE_ODDS @@ -511,11 +526,14 @@ ALLOW_MISCREANTS ## Determines if players are allowed to print integrated circuits, uncomment to allow. #IC_PRINTING +## Uncomment to allow roundstart trait selection in the character setup menu. +ROUNDSTART_TRAITS + ## Enable night shifts ## -ENABLE_NIGHT_SHIFTS +#ENABLE_NIGHT_SHIFTS ## Enable randomized shift start times## -RANDOMIZE_SHIFT_TIME +#RANDOMIZE_SHIFT_TIME ## Sets shift time to server time at roundstart. Overridden by RANDOMIZE_SHIFT_TIME ## #SHIFT_TIME_REALTIME diff --git a/html/browser/common.css b/html/browser/common.css index 2f43c8c6d7..25db5313d4 100644 --- a/html/browser/common.css +++ b/html/browser/common.css @@ -337,14 +337,39 @@ div.notice transition: .4s; } +.slider.red:before { + background-color: #d6858b; +} + +.slider.locked:before { + content: url("padlock.png"); + background-color: #b4b4b4; +} + input:checked + .slider { background-color: #40628a; } +input:checked + .slider.red { + background-color: #a92621; +} + +input:checked + .slider.locked { + background-color: #707070; +} + input:focus + .slider { box-shadow: 0 0 1px #2196F3; } +input:focus + .slider.red { + box-shadow: 0 0 1px #f3212d; +} + +input:focus + .slider.locked { + box-shadow: 0 0 1px #979797; +} + input:checked + .slider:before { transform: translateX(24px); } diff --git a/html/changelogs/AutoChangeLog-pr-5323.yml b/html/changelogs/AutoChangeLog-pr-5323.yml deleted file mode 100644 index 82ae6c925b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5323.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Raeschen" -delete-after: True -changes: - - tweak: "Changed/removed some miscreant objectives" diff --git a/html/changelogs/AutoChangeLog-pr-5374.yml b/html/changelogs/AutoChangeLog-pr-5374.yml deleted file mode 100644 index 82a54f6df9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5374.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "Telecom equipment now can only be printed by engineers and scientists as intended." - - bugfix: "WT-550 AP can only be printed by sec now." - - tweak: "Removed engineering requirement for arcade machines to bring it in line with others." diff --git a/html/changelogs/AutoChangeLog-pr-5377.yml b/html/changelogs/AutoChangeLog-pr-5377.yml deleted file mode 100644 index 349cd33be9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5377.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Cyborg engineering module geiger counters now work properly again" diff --git a/html/changelogs/AutoChangeLog-pr-5378.yml b/html/changelogs/AutoChangeLog-pr-5378.yml deleted file mode 100644 index 39ee297c68..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5378.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Improvedname, Toriate" -delete-after: True -changes: - - rscadd: "Adds carrot satchel" diff --git a/html/changelogs/AutoChangeLog-pr-5379.yml b/html/changelogs/AutoChangeLog-pr-5379.yml deleted file mode 100644 index 2c634bd925..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5379.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "As it would happen, the chef does not actually have Italian genes, but rather was being influenced by a strange moustache-a." diff --git a/html/changelogs/AutoChangeLog-pr-5384.yml b/html/changelogs/AutoChangeLog-pr-5384.yml deleted file mode 100644 index 76a838dbe5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5384.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - tweak: "Input boxes for emotes are now larger. Check it out with the *subtle and *custom commands. This also applies to the M hotkey." diff --git a/html/changelogs/AutoChangeLog-pr-5385.yml b/html/changelogs/AutoChangeLog-pr-5385.yml deleted file mode 100644 index 3cb16e227b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5385.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - code_imp: "Removes grind_results from empty soda cans since they can't be ground." diff --git a/html/changelogs/AutoChangeLog-pr-5386.yml b/html/changelogs/AutoChangeLog-pr-5386.yml deleted file mode 100644 index bd2fed8838..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5386.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - spellcheck: "For consistency's sake, aluminium is now universally spelled with two 'i'." diff --git a/html/changelogs/AutoChangeLog-pr-5387.yml b/html/changelogs/AutoChangeLog-pr-5387.yml deleted file mode 100644 index d7abf266c6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5387.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Defibs can now be researched and printed." diff --git a/html/changelogs/AutoChangeLog-pr-5388.yml b/html/changelogs/AutoChangeLog-pr-5388.yml deleted file mode 100644 index 31f18743c6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5388.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - code_imp: "Changed can_synth values from 0/1 to FALSE/TRUE" diff --git a/html/changelogs/AutoChangeLog-pr-5389.yml b/html/changelogs/AutoChangeLog-pr-5389.yml deleted file mode 100644 index 884319e080..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5389.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Goliath hide plates now properly apply to explorer suits and APLUs again." diff --git a/html/changelogs/AutoChangeLog-pr-5390.yml b/html/changelogs/AutoChangeLog-pr-5390.yml deleted file mode 100644 index 8cb9140c3e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5390.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - balance: "Printed power cells must now be charged before use" diff --git a/html/changelogs/AutoChangeLog-pr-5391.yml b/html/changelogs/AutoChangeLog-pr-5391.yml deleted file mode 100644 index 497af33fd9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5391.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - balance: "Hatches are now small instead of tiny." diff --git a/html/changelogs/AutoChangeLog-pr-5397.yml b/html/changelogs/AutoChangeLog-pr-5397.yml deleted file mode 100644 index 42ac36f460..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5397.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "Fixed the limb grower having a max volume of 0." diff --git a/html/changelogs/AutoChangeLog-pr-5398.yml b/html/changelogs/AutoChangeLog-pr-5398.yml deleted file mode 100644 index 23246095b9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5398.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "The preference to lock action buttons in place is now correctly saved across rounds." diff --git a/html/changelogs/AutoChangeLog-pr-5399.yml b/html/changelogs/AutoChangeLog-pr-5399.yml deleted file mode 100644 index f31125b6e0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5399.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ordo" -delete-after: True -changes: - - tweak: "Replaced nitrogen with ethanol in morphine recipe. The recipe now has a lower yield." diff --git a/html/changelogs/AutoChangeLog-pr-5400.yml b/html/changelogs/AutoChangeLog-pr-5400.yml deleted file mode 100644 index 007a5dbb1f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5400.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "UI Changes" -delete-after: True -changes: - - tweak: "The Scan with Debugger/Device button now reads Copy Ref and no longer sends you to the circuit's page when clicked" - - tweak: "The assembly's menu is now slightly wider" - - tweak: "The advanced in \"integrated advanced medical analyser\" is now abbreviated to adv." diff --git a/html/changelogs/AutoChangeLog-pr-5404.yml b/html/changelogs/AutoChangeLog-pr-5404.yml deleted file mode 100644 index 738d191bf6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5404.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - balance: "Changed the chemical recipe for Lexorin from plasma, hydrogen, and nitrogen to plasma, hydrogen, and oxygen." - - bugfix: "These were necessary due to recipe conflicts" diff --git a/html/changelogs/AutoChangeLog-pr-5405.yml b/html/changelogs/AutoChangeLog-pr-5405.yml deleted file mode 100644 index 4684cf09d4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5405.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "Cloner UI now properly updates cloning pod status when autocloning starts cloning someone." diff --git a/html/changelogs/AutoChangeLog-pr-5408.yml b/html/changelogs/AutoChangeLog-pr-5408.yml deleted file mode 100644 index ea9647b343..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5408.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - rscadd: "Added magnetic weapons to techwebs nodes" - - tweak: "Magrifle magazine now has 24-round capacity, magpistol has 14-round capacity" - - balance: "rebalanced magrifle projectiles to deal more damage overall on a full burst, but less individually" - - bugfix: "fixed broken sprites for magrifles" diff --git a/html/changelogs/AutoChangeLog-pr-5409.yml b/html/changelogs/AutoChangeLog-pr-5409.yml deleted file mode 100644 index 9cadfc27f2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5409.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Corrected a number of missing checks when using alt-click actions. Please report any strange behavior to a coder." diff --git a/html/changelogs/AutoChangeLog-pr-5410.yml b/html/changelogs/AutoChangeLog-pr-5410.yml deleted file mode 100644 index f2ee8ca86e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5410.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - balance: "Grabbers/throwers no longer can contain/throw things equal to the assembly size." diff --git a/html/changelogs/AutoChangeLog-pr-5412.yml b/html/changelogs/AutoChangeLog-pr-5412.yml deleted file mode 100644 index 4575638349..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5412.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mokiros" -delete-after: True -changes: - - rscadd: "All-In-One Grinder can now be built with researchable curcuit and micro-manipulator." diff --git a/html/changelogs/AutoChangeLog-pr-5414.yml b/html/changelogs/AutoChangeLog-pr-5414.yml deleted file mode 100644 index 8c582750a5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5414.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "You can now smelt titanium glass and plastitanium glass" - - rscadd: "Use titanium glass and plastitanium glass to build shuttle windows and plastitanium windows" diff --git a/html/changelogs/AutoChangeLog-pr-5415.yml b/html/changelogs/AutoChangeLog-pr-5415.yml deleted file mode 100644 index 655fb49afe..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5415.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kor" -delete-after: True -changes: - - rscadd: "Mining sentience upgrades now grant minebots an ID and radio." diff --git a/html/changelogs/AutoChangeLog-pr-5416.yml b/html/changelogs/AutoChangeLog-pr-5416.yml deleted file mode 100644 index 984d50ea2d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5416.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You, Basilman, and MMMiracles" -delete-after: True -changes: - - rscadd: "Deep in space, a valuable artifact awaits" diff --git a/html/changelogs/AutoChangeLog-pr-5419.yml b/html/changelogs/AutoChangeLog-pr-5419.yml deleted file mode 100644 index a5d05ffa00..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5419.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - rscdel: "Steam engines have been removed from maintenance, engineering, atmos and teleportation areas." diff --git a/html/changelogs/AutoChangeLog-pr-5420.yml b/html/changelogs/AutoChangeLog-pr-5420.yml deleted file mode 100644 index 821c60f3b4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5420.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "Fixes duplicate air alarm on meta." diff --git a/html/changelogs/AutoChangeLog-pr-5421.yml b/html/changelogs/AutoChangeLog-pr-5421.yml deleted file mode 100644 index 1e4b3c7f9e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5421.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Prevents megafauna (and other large things like spiders and mulebots) from going into machines" diff --git a/html/changelogs/AutoChangeLog-pr-5422.yml b/html/changelogs/AutoChangeLog-pr-5422.yml deleted file mode 100644 index a004909230..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5422.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - spellcheck: "Corrected typo in NTNet Scanner circuits' name, make sure to update your blueprints." diff --git a/html/changelogs/AutoChangeLog-pr-5423.yml b/html/changelogs/AutoChangeLog-pr-5423.yml deleted file mode 100644 index a52ec62ade..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5423.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - admin: "The notify irc/discord bot chat command no longer requires admin privileges." diff --git a/html/changelogs/AutoChangeLog-pr-5427.yml b/html/changelogs/AutoChangeLog-pr-5427.yml deleted file mode 100644 index c94a419a29..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5427.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - rscadd: "The chef is now trained for working under siege" diff --git a/html/changelogs/AutoChangeLog-pr-5428.yml b/html/changelogs/AutoChangeLog-pr-5428.yml deleted file mode 100644 index 25cfb0aa6d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5428.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - rscadd: "You can now squish urinal cakes" diff --git a/html/changelogs/AutoChangeLog-pr-5432.yml b/html/changelogs/AutoChangeLog-pr-5432.yml deleted file mode 100644 index 7d159a3c40..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5432.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "RealDonaldTrump" -delete-after: True -changes: - - rscadd: "Added a QM Command Headset and Encryption key" - - tweak: "Removed the HoP's Cargo access and supply comms access." - - tweak: "The QM is immune to revolutionaries now and must be murdered, as a head of staff." - - rscdel: "Removed QM access from Shaft Miners and Cargo Techs during skeleton shifts." diff --git a/html/changelogs/AutoChangeLog-pr-5433.yml b/html/changelogs/AutoChangeLog-pr-5433.yml deleted file mode 100644 index 1fe9d351c7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5433.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - bugfix: "Your hand no longer magically squishes urinal cakes when trying to pick them up" diff --git a/html/changelogs/AutoChangeLog-pr-5434.yml b/html/changelogs/AutoChangeLog-pr-5434.yml deleted file mode 100644 index 7ee8978492..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5434.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - bugfix: "Fixes lye/plastic/charcoal conflicts when mixing." - - bugfix: "Lye is now made by combining ash with water and carbon. Plastic sheets by heating ash, sulphuric acid and oil." diff --git a/html/changelogs/AutoChangeLog-pr-5438.yml b/html/changelogs/AutoChangeLog-pr-5438.yml deleted file mode 100644 index 0a4d3390e8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5438.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "AI no longers block ark after mass_recall" - - bugfix: "Placed the dispersal logic AFTER the mass_recall on ark activation instead of infront(did nothing before basically)." diff --git a/html/changelogs/AutoChangeLog-pr-5440.yml b/html/changelogs/AutoChangeLog-pr-5440.yml deleted file mode 100644 index 0707b4f149..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5440.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - rscadd: "Added in prayer beads, code and sprites shamelessly stolen from Paradise. Chaplains can pray for people, to heal their wounds without the risk of braindamage, and cleanse their mind of unholy thoughts" diff --git a/html/changelogs/AutoChangeLog-pr-5442.yml b/html/changelogs/AutoChangeLog-pr-5442.yml deleted file mode 100644 index 1b4b8dd334..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5442.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Cell chargers can now be built and upgraded with capacitors!" - - bugfix: "Fixed empty subtype batteries not updating icons" diff --git a/html/changelogs/AutoChangeLog-pr-5445.yml b/html/changelogs/AutoChangeLog-pr-5445.yml deleted file mode 100644 index 40def083f5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5445.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - bugfix: "SCP-294 no longer looks fucked up" diff --git a/html/changelogs/AutoChangeLog-pr-5447.yml b/html/changelogs/AutoChangeLog-pr-5447.yml deleted file mode 100644 index 4cd5e4a0e0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5447.yml +++ /dev/null @@ -1,16 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - balance: "The rift created by teleporting in from space will now include a description indicating the direction of the \"origin\" teleport rune - giving the examiner a fair idea of where the \"space base\" is located." - - balance: "You can no longer manifest spirits or summon cultists while in space or Lavaland. You may still ascend as a spirit (formerly spirit sight, astral jaunt, etc.) in either of these locations." - - balance: "Juggernauts have lost 20% reflect rate on energy projectiles (now around 50% for standard lasers)." - - balance: "Wraiths and Juggernauts have -5 melee damage (20 and 25 now, respectively)." - - balance: "Construct shells now cost 50 metal through the \"twisted construction\" spell. Twisted construction is now a \"single use\" spell." - - balance: "The Concealment spell will now work on cult airlocks (including converted airlocks). The \"concealed\" airlock will appear as a generic airlock but will deny access to any non-cultist." - - balance: "The draw blood effect on blood splatters will now draw more blood from stains with low blood levels." - - tweak: "Unanchored (via ritual dagger) cult structures are no longer \"dense\", meaning you can move them through teleport runes more efficiently." - - tweak: "The button to nominate yourself for cult master now has a confirmation prompt seeking assurance that the user is prepared to be the cult's master." - - tweak: "The reveal aspect of the concealment spell is slightly smaller, albeit still slightly larger (6 range) than the concealment aspect (5 range)." - - imageadd: "Juggernauts \"gauntlet echo\" now has a more cult-themed appearance." - - bugfix: "Using a shuttle curse to push the shuttle timer above its default can no longer be \"reset\" with a recall. This also adds a block_recall(time_in_deciseconds) helper-proc to the shuttle subsystem." - - bugfix: "Using runed metal on a regular girder is no longer an option, preventing runtimes and deletions associated with the (unintended) combination." diff --git a/html/changelogs/AutoChangeLog-pr-5451.yml b/html/changelogs/AutoChangeLog-pr-5451.yml deleted file mode 100644 index 05ec2a27e2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5451.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - code_imp: "Synced with upstream. Again. For the hundredth time probably. Check the github for more details." diff --git a/html/changelogs/AutoChangeLog-pr-5453.yml b/html/changelogs/AutoChangeLog-pr-5453.yml deleted file mode 100644 index 6e9eaebe6a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5453.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "After consulting with their in-house physicists, Nanotrasen has updated their worst-case disaster training simulation \"Space Station 13\". The combustion of hydrogen isotopes now produces water vapor instead of carbon dioxide." diff --git a/html/changelogs/AutoChangeLog-pr-5456.yml b/html/changelogs/AutoChangeLog-pr-5456.yml deleted file mode 100644 index 0bbfaf59f9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5456.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Added hooray emoji!" diff --git a/html/changelogs/AutoChangeLog-pr-5463.yml b/html/changelogs/AutoChangeLog-pr-5463.yml new file mode 100644 index 0000000000..5bbaf394c5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5463.yml @@ -0,0 +1,21 @@ +author: "deathride58" +delete-after: True +changes: + - rscadd: "You can now sprint by holding shift." + - rscadd: "Added combat mode. Press C or use the UI button to toggle it on and off. The code and the sound for toggling combat mode are from Interbay. The sound is mainly a placeholder until a more fitting sound can be found." + - rscadd: "You can now use the right mouse button to perform actions while in combat mode. If something doesn't have a unique action for right clicking, it'll default to the normal left click action." + - rscadd: "You can now move around and use items while resting. The code is from Interbay" + - rscadd: "You can now use the resist button to get up from resting. This will take time depending on your health and stamina, even if you try to use the rest button instead." + - rscadd: "Reworked stamina, and introduced stamina crit. If you run out of stamina, you'll enter stamina softcrit, during which you'll be unable to attack, get up from resting, or perform various other actions. If you keep losing stamina after entering stamina softcrit, you'll enter full stamina crit, in which you'll be unable to move or interact with the environment until you're above 0% stamina again." + - rscadd: "Added a stamina buffer. Performing actions that drain the user's stamina will now drain the stamina buffer before draining actual stamina. The stamina buffer will start to regenerate after going 5 seconds without performing a stamina-draining action. When the stamina buffer regenerates, it will use up stamina, at a rate of 0.5 points of stamina per 1 point of stamina buffer." + - rscadd: "Added a rest button to the HUD" + - balance: "90% of all stuns have been removed in favor of stamina. Stuns will now simply knock the affected person down if they would have been 8 seconds or less, but will function for a \"normal\" stun with a length that's a tenth of the normal time if their normal time is longer than 8 seconds." + - balance: "Attacking with weapons will now cost stamina depending on the weapon's size. Some code from Interbay." + - balance: "Throwing things now costs stamina. Some code from Interbay." + - balance: "Default movement speed has been reduced by one tick to accommodate for sprinting. This does not require a config update." + - balance: "The slowdown you get when you're low on health has been reduced by one tick to accommodate for the shift from stun-based combat to stamina-based combat." + - balance: "Dogborg pouncing has been buffed from a knockdown of 4.5 seconds to a knockdown of 45 seconds. After the previously mentioned changes, this brings dogborg pouncing from 11.5 stamina + knockdown to 115 stamina + 4.5 second stun. **This is a temporary change to make dogborgs immune to the stun nerfs for now until a better solution can be found.**" + - balance: "Crushers now regenerate stamina upon successfully detonating a mark." + - rscadd: "Also laid down the groundwork for a psuedo z-height system. You can see a small glimpse of it by hopping on a table!" + - rscadd: "Added a couple of fancy buttons to the UI! Sprites are from Toriate." + - rscadd: "Also added a stamina meter to the UI. Sprites are from Hippiestation" diff --git a/html/changelogs/AutoChangeLog-pr-5464.yml b/html/changelogs/AutoChangeLog-pr-5464.yml deleted file mode 100644 index 2ec5074007..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5464.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Heart-shaped boxes of chocolates are now included in Valentine's Day event gifts" diff --git a/html/changelogs/AutoChangeLog-pr-5465.yml b/html/changelogs/AutoChangeLog-pr-5465.yml deleted file mode 100644 index ac80a64f1d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5465.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - bugfix: "The Cook now ONLY works under siege." diff --git a/html/changelogs/AutoChangeLog-pr-5467.yml b/html/changelogs/AutoChangeLog-pr-5467.yml deleted file mode 100644 index ba61559a87..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5467.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Frozenguy5" -delete-after: True -changes: - - bugfix: "You can craft rat kebabs now." diff --git a/html/changelogs/AutoChangeLog-pr-5469.yml b/html/changelogs/AutoChangeLog-pr-5469.yml deleted file mode 100644 index 7ae6cf54a9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5469.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Transference potions now just rename the mob that you are transferring into with your name, rather than your name plus the old name of the mob." diff --git a/html/changelogs/AutoChangeLog-pr-5470.yml b/html/changelogs/AutoChangeLog-pr-5470.yml deleted file mode 100644 index f1a9fb3df8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5470.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - tweak: "The clogged vents event has been removed for pressing ceremonial reasons" diff --git a/html/changelogs/AutoChangeLog-pr-5473.yml b/html/changelogs/AutoChangeLog-pr-5473.yml deleted file mode 100644 index e702a232cc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5473.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Chasms no longer eat shuttle docking ports, rendering them unusable and unresponsive" diff --git a/html/changelogs/AutoChangeLog-pr-5477.yml b/html/changelogs/AutoChangeLog-pr-5477.yml deleted file mode 100644 index ecafe93d22..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5477.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "Integrated circuits no longer start upgraded." - - balance: "The IC printers that are available on round start in the IC labs are no longer upgraded by default. You will need to research these as was intended" diff --git a/html/changelogs/AutoChangeLog-pr-5478.yml b/html/changelogs/AutoChangeLog-pr-5478.yml deleted file mode 100644 index 453d0ebde9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5478.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - rscadd: "Everyone who gets new mineral announcements should now have access to actually get those materials" diff --git a/html/changelogs/AutoChangeLog-pr-5484.yml b/html/changelogs/AutoChangeLog-pr-5484.yml deleted file mode 100644 index a8b6d91826..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5484.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - balance: "emags now have a 10 use endurance. Emag carefully, operatives." diff --git a/html/changelogs/AutoChangeLog-pr-5485.yml b/html/changelogs/AutoChangeLog-pr-5485.yml deleted file mode 100644 index 76b35f1eaf..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5485.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - rscadd: "Cryopods are now available for safe round exiting, no longer will you need to ahelp with 'oh fuck wrong job'. Being kicked back to lobby for a restart is still admin. You will be warned to ahelp if you're an antag role however." diff --git a/html/changelogs/AutoChangeLog-pr-5490.yml b/html/changelogs/AutoChangeLog-pr-5490.yml deleted file mode 100644 index 3f9f6aaa4f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5490.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - rscadd: "Security vendors now have a stunsword modification kit available for purchase with a coin. There might be another somewhere in there, but that would require tampering with it, and you're a good little redshirt, aren't you?" diff --git a/html/changelogs/AutoChangeLog-pr-5493.yml b/html/changelogs/AutoChangeLog-pr-5493.yml deleted file mode 100644 index 712b4b9f28..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5493.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - balance: "You no longer need an aggressive grab to table someone." diff --git a/html/changelogs/AutoChangeLog-pr-5495.yml b/html/changelogs/AutoChangeLog-pr-5495.yml deleted file mode 100644 index 80d21e35bc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5495.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kor" -delete-after: True -changes: - - rscadd: "Bluespace slime extracts now have a new chemical reaction with water, which create slime radio potions. When applied to a simple animal, that mob gains an internal radio." diff --git a/html/changelogs/AutoChangeLog-pr-5496.yml b/html/changelogs/AutoChangeLog-pr-5496.yml deleted file mode 100644 index c1e3e1c7d9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5496.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - refactor: "Map initialization now supports stations with multiple z-levels." - - bugfix: "The map reader no longer sometimes expands the world size inappropriately." - - tweak: "Pride's Mirror's destination has become less predictable." diff --git a/html/changelogs/AutoChangeLog-pr-5505.yml b/html/changelogs/AutoChangeLog-pr-5505.yml deleted file mode 100644 index 0b89b2e2e0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5505.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MMMiracles" -delete-after: True -changes: - - rscadd: "You can now produce a cryostatis variant of the shotgun dart after researching Medical Weaponry. Holds 10u and doesn't have reagents react inside it." diff --git a/html/changelogs/AutoChangeLog-pr-5506.yml b/html/changelogs/AutoChangeLog-pr-5506.yml deleted file mode 100644 index 40765e014b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5506.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscdel: "Minimap gone from crew monitoring" diff --git a/html/changelogs/AutoChangeLog-pr-5508.yml b/html/changelogs/AutoChangeLog-pr-5508.yml deleted file mode 100644 index 282af66cbb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5508.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Removing and printing integrated circuits will now attempt to place them into a free hand." - - tweak: "You can now hit an integrated circuit printer with an unsecured electronic assembly to recycle all of the parts in the assembly en masse." - - tweak: "You can now recycle empty electronic assemblies in an integrated circuit printer!" - - soundadd: "Integrated circuit printers now have sounds for printing circuits and assemblies." diff --git a/html/changelogs/AutoChangeLog-pr-5509.yml b/html/changelogs/AutoChangeLog-pr-5509.yml deleted file mode 100644 index 938597014c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5509.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Centcom now reports that thanks to extensive bioengineering, apples -and oranges now taste of apples and oranges, rather than nothing as they -did before." diff --git a/html/changelogs/AutoChangeLog-pr-5512.yml b/html/changelogs/AutoChangeLog-pr-5512.yml deleted file mode 100644 index bbabd36f85..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5512.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - bugfix: "Fixes SCP-294 losing its top sometimes" diff --git a/html/changelogs/AutoChangeLog-pr-5515.yml b/html/changelogs/AutoChangeLog-pr-5515.yml deleted file mode 100644 index eea214c057..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5515.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - balance: "returned Flightsuit armor to being less useful, also ensured they're not getting the best possible huds as well. Batteries to be done eventually." diff --git a/html/changelogs/AutoChangeLog-pr-5517.yml b/html/changelogs/AutoChangeLog-pr-5517.yml deleted file mode 100644 index b02e311eb5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5517.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "Emagging meteor shield satellites now shows you a message." - - spellcheck: "Fixed a typo when emagging RnD servers." diff --git a/html/changelogs/AutoChangeLog-pr-5518.yml b/html/changelogs/AutoChangeLog-pr-5518.yml deleted file mode 100644 index 0dff286598..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5518.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - code_imp: "replaced some item-specific movement hooks with components" diff --git a/html/changelogs/AutoChangeLog-pr-5522.yml b/html/changelogs/AutoChangeLog-pr-5522.yml deleted file mode 100644 index ff182e1d62..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5522.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - code_imp: "made powercell rigging no longer set rigged to the plasma reagent datum what the hell and makes it use TRUE/FALSE defines" diff --git a/html/changelogs/AutoChangeLog-pr-5525.yml b/html/changelogs/AutoChangeLog-pr-5525.yml deleted file mode 100644 index 8fffeb931d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5525.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "RealDonaldTrump" -delete-after: True -changes: - - rscadd: "Slimepeople (And all types, including Jelly, Xenobio Slimeperson, Stargazer and Luminescent) now have the ability to utilise the 'Alter Form' ability, allowing them to change most things about their body's form." - - rscadd: "Re-added the slime split and bodyswap ability to Xenobiological Slimepeople, only obtainable through xenobio." - - rscadd: "Slimepeople can now select tails, taur bodies and ears at roundstart. YOU WILL NEED TO SET YOUR COLOURS; otherwise you'll be rainbow coloured and not exactly slime-like. And nobody wants that." - - config: "Changed the ID for the roundstart slimepeople (Without the body swap and slime split abilities) to slimeperson. This will need set in the config on Jay's end." diff --git a/html/changelogs/AutoChangeLog-pr-5527.yml b/html/changelogs/AutoChangeLog-pr-5527.yml deleted file mode 100644 index d1d01ed199..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5527.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "The RPG loot event will no longer break circuit analyzers." diff --git a/html/changelogs/AutoChangeLog-pr-5532.yml b/html/changelogs/AutoChangeLog-pr-5532.yml deleted file mode 100644 index ef599784de..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5532.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MetroidLover" -delete-after: True -changes: - - rscadd: "Added the ability to gain smoke bomb charges by attacking the initiated ninja suit with a beaker containing smoke powder" diff --git a/html/changelogs/AutoChangeLog-pr-5534.yml b/html/changelogs/AutoChangeLog-pr-5534.yml deleted file mode 100644 index 5099a198f2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5534.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Zna12" -delete-after: True -changes: - - rscadd: "Autoylathe" - - tweak: "Tweaked the description of replica katana to show that it's not as much of a toy as i thought it was." diff --git a/html/changelogs/AutoChangeLog-pr-5535.yml b/html/changelogs/AutoChangeLog-pr-5535.yml deleted file mode 100644 index c74dec1e9d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5535.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "added a subreaction for rainbow slime cores, injecting 5u of plasma now makes them explode into random slimecores." - - rscadd: "added a slimejelly reaction to rainbow slime cores that does the above but all the cores that spawn get 5u each of plasma, water and blood injected. (aka chaos)" - - code_imp: "improved clusterbuster code with Initialize, addtimer, vars for sounds and payload spawners, etc" diff --git a/html/changelogs/AutoChangeLog-pr-5538.yml b/html/changelogs/AutoChangeLog-pr-5538.yml deleted file mode 100644 index b77960fd42..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5538.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fel and LeonDuvall" -delete-after: True -changes: - - rscadd: "You can now drink sake! Can be found in the bar, or made with rice -and sugar." diff --git a/html/changelogs/AutoChangeLog-pr-5539.yml b/html/changelogs/AutoChangeLog-pr-5539.yml deleted file mode 100644 index f0d826d2dc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5539.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TankNut" -delete-after: True -changes: - - tweak: "Corpses spawned in ruins have their suit sensors disabled" diff --git a/html/changelogs/AutoChangeLog-pr-5540.yml b/html/changelogs/AutoChangeLog-pr-5540.yml deleted file mode 100644 index 858331ade5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5540.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Modafinil" -delete-after: True -changes: - - rscadd: "Adds new medicine chem that suppresses sleep and very lightly reduces stunrates, has a very low metabolic rate which is randomized and a low overdose treshold. Overdosing is a lethal oxyloss unless treated. (With epipen urgently and with charcoal/calomel before it puts you to sleep)" diff --git a/html/changelogs/AutoChangeLog-pr-5542.yml b/html/changelogs/AutoChangeLog-pr-5542.yml deleted file mode 100644 index 941c3c2a57..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5542.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Species with RESISTHOT (golems, skeletons) can extinguish burning -items as if they were wearing fireproof gloves." diff --git a/html/changelogs/AutoChangeLog-pr-5546.yml b/html/changelogs/AutoChangeLog-pr-5546.yml deleted file mode 100644 index 0c26141b42..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5546.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "jakeramsay007" -delete-after: True -changes: - - bugfix: "Jellypeople/Slimepeople now are able to speak their Slime language, as intended when it was added." diff --git a/html/changelogs/AutoChangeLog-pr-5547.yml b/html/changelogs/AutoChangeLog-pr-5547.yml deleted file mode 100644 index b9174386ca..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5547.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "After an incident where a very eager roboticist kept expanding a borg's size leading to a structural collapse of the entire station proper safety limitations have been implemented." diff --git a/html/changelogs/AutoChangeLog-pr-5548.yml b/html/changelogs/AutoChangeLog-pr-5548.yml deleted file mode 100644 index f3695c5649..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5548.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "fixes lava and fire burning HE-pipes" diff --git a/html/changelogs/AutoChangeLog-pr-5549.yml b/html/changelogs/AutoChangeLog-pr-5549.yml deleted file mode 100644 index fddb207ee1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5549.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "removes the maintenance panel examination message on poddoors (blast doors)" diff --git a/html/changelogs/AutoChangeLog-pr-5550.yml b/html/changelogs/AutoChangeLog-pr-5550.yml deleted file mode 100644 index 9e3ae64528..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5550.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Nanotrasen has invested in better reflective materials for it's reflectors. You can now make complex laser shows again." diff --git a/html/changelogs/AutoChangeLog-pr-5554.yml b/html/changelogs/AutoChangeLog-pr-5554.yml deleted file mode 100644 index 7db22a96bd..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5554.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - admin: "Admins can use the Select Equipment verb on observers. Doing so will -humanise them and then apply the equipment." diff --git a/html/changelogs/AutoChangeLog-pr-5555.yml b/html/changelogs/AutoChangeLog-pr-5555.yml deleted file mode 100644 index 37e6f9f6f2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5555.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "You can rotate freezers and cryo again." diff --git a/html/changelogs/AutoChangeLog-pr-5558.yml b/html/changelogs/AutoChangeLog-pr-5558.yml deleted file mode 100644 index c08bcd67d9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5558.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - balance: "RnD's base research point generation rate has been decreased to 1,200 points per minute." diff --git a/html/changelogs/AutoChangeLog-pr-5563.yml b/html/changelogs/AutoChangeLog-pr-5563.yml deleted file mode 100644 index 3a2e25a193..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5563.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - rscadd: "Exosuit fabricators can now build RPED and crew pinpointer upgrades for engineering and medical borgs respectively." diff --git a/html/changelogs/AutoChangeLog-pr-5566.yml b/html/changelogs/AutoChangeLog-pr-5566.yml deleted file mode 100644 index 008d93439f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5566.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ordo" -delete-after: True -changes: - - rscadd: "Adds a few new liquors to the bar, and a few new cocktails to boot!" diff --git a/html/changelogs/AutoChangeLog-pr-5567.yml b/html/changelogs/AutoChangeLog-pr-5567.yml deleted file mode 100644 index cb5c5258b1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5567.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Crew pinpointers now fit on medical belts!" diff --git a/html/changelogs/AutoChangeLog-pr-5568.yml b/html/changelogs/AutoChangeLog-pr-5568.yml deleted file mode 100644 index 465ed69402..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5568.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - bugfix: "Actually fixes SCP 294 overlay problems" diff --git a/html/changelogs/AutoChangeLog-pr-5571.yml b/html/changelogs/AutoChangeLog-pr-5571.yml deleted file mode 100644 index dd25c0c971..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5571.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Bicycles are rideable again" diff --git a/html/changelogs/AutoChangeLog-pr-5576.yml b/html/changelogs/AutoChangeLog-pr-5576.yml deleted file mode 100644 index ea6e7f4cba..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5576.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - tweak: "Most of the light sources in the game have had their light values to be a little more realistic." diff --git a/html/changelogs/AutoChangeLog-pr-5577.yml b/html/changelogs/AutoChangeLog-pr-5577.yml deleted file mode 100644 index 7024c307cc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5577.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - tweak: "Atmosia is considerably more lethal now. Don't go into space unprotected!" - - balance: "being on fire is actually something to worry about." diff --git a/html/changelogs/AutoChangeLog-pr-5580.yml b/html/changelogs/AutoChangeLog-pr-5580.yml deleted file mode 100644 index 415bbfccbc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5580.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "New blob tiles are no longer invincible after their blob's death." - - bugfix: "Blob nodes no longer produce blob tiles even after the blob's death." diff --git a/html/changelogs/AutoChangeLog-pr-5582.yml b/html/changelogs/AutoChangeLog-pr-5582.yml deleted file mode 100644 index 581e515c04..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5582.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Improvedname" -delete-after: True -changes: - - bugfix: "Fried eggs don't require boiled eggs anymore and just normal eggs" diff --git a/html/changelogs/AutoChangeLog-pr-5586.yml b/html/changelogs/AutoChangeLog-pr-5586.yml deleted file mode 100644 index 2d254beaa0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5586.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Fixed paper bins not catching fire properly" diff --git a/html/changelogs/AutoChangeLog-pr-5590.yml b/html/changelogs/AutoChangeLog-pr-5590.yml deleted file mode 100644 index a0359447af..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5590.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - rscadd: "Added three new techweb nodes: Advanced Surgery, Experimental Surgery, and Alien Surgery(requires abductor tech)" - - rscadd: "Added several new surgical procedures, which require these techweb nodes. To enable an advanced surgery, print its relative disk from a protolathe, and load it on an Operating Computer. Advanced surgery can only be performed at operating tables." - - tweak: "You can now intentionally fail surgical procedures by initiating them with disarm intent instead of help intent." - - rscadd: "Brain traumas now have a custom resilience system. Some trauma sources can cause traumas which require more extensive treatment, such as the new Lobotomy surgery." - - rscadd: "Traitors can now purchase a Brainwashing Surgery Disk for 5 TC." diff --git a/html/changelogs/AutoChangeLog-pr-5592.yml b/html/changelogs/AutoChangeLog-pr-5592.yml deleted file mode 100644 index b131a5f963..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5592.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Mime's Bane, a toxin that prevents people from emoting while it's in their system, can now be created by mixing 1 part Mute Toxin, 1 part Nothing and 1 part Radium." diff --git a/html/changelogs/AutoChangeLog-pr-5595.yml b/html/changelogs/AutoChangeLog-pr-5595.yml deleted file mode 100644 index f3edc90a12..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5595.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Circuits integrity, charge, and overall circuit composition is displayed on diagnostic huds. If the assembly has dangerous circuits then the status icon will display exclamation points, if the assembly can communicate with something far away a wifi icon will appear next to the status icon, and if the circuit can not operate the status icon will display an 'X'." - - rscadd: "AR interface circuit which can modify the status icon if it is not displaying the exclamation points or the 'X'." - - tweak: "Locomotive circuits can no longer be added to assemblies that can't use them." - - spellcheck: "Fixed a typo in the grenade primer description." - - code_imp: "Added flags to circuits that help group subsets of circuits and regulate them." diff --git a/html/changelogs/AutoChangeLog-pr-5596.yml b/html/changelogs/AutoChangeLog-pr-5596.yml deleted file mode 100644 index 3f7c3c9388..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5596.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "fixed walls under doors breaking to space" - - tweak: "changed doors to no longer spawn on top of walls" diff --git a/html/changelogs/AutoChangeLog-pr-5597.yml b/html/changelogs/AutoChangeLog-pr-5597.yml deleted file mode 100644 index c830d7955a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5597.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "fixed ghost spawners showing up in the spawner menu when you can't use them" diff --git a/html/changelogs/AutoChangeLog-pr-5604.yml b/html/changelogs/AutoChangeLog-pr-5604.yml deleted file mode 100644 index b26d3fbea9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5604.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - tweak: "The crusher kit now includes an advanced mining scanner." - - tweak: "The resonator kit now includes webbing and a small extinguisher." - - tweak: "The minebot kit now includes a minebot passthrough kinetic accelerator module, which will cause kinetic accelerator shots to pass through minebots. The welding goggles have been replaced with a welding helmet, allowing you to wear mesons and still be able to repair the minebot without eye damage. -feature: You can now install kinetic accelerator modkits on minebots. Some exceptions may apply. Crowbar to remove modkits." - - balance: "Minebots now shoot 33% faster by default(3 seconds to 2). The minebot cooldown upgrade still produces a fire rate of 1 second." - - balance: "Minebots are now slightly less likely to sit in melee like idiots, and are now healed for 15 instead of 10 when welded." - - balance: "Sentient minebots are penalized; they cannot have armor and melee upgrades installed, and making them sentient will override those upgrades if they were installed. In addition, they move very slightly slower and have their kinetic accelerator's cooldown increased by 1 second." diff --git a/html/changelogs/AutoChangeLog-pr-5606.yml b/html/changelogs/AutoChangeLog-pr-5606.yml deleted file mode 100644 index fd2238ab98..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5606.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "The round-end report now shows information about the first person to die in that round." diff --git a/html/changelogs/AutoChangeLog-pr-5607.yml b/html/changelogs/AutoChangeLog-pr-5607.yml deleted file mode 100644 index 09a3db4529..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5607.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Admins may now spawn a debug circuit printer that can always print circuits, and has infinite metal." - - bugfix: "Buttons, number pads, and text pads in integrated circuits now correctly show their labels." - - bugfix: "Integrated hypo-injectors can now correctly draw blood." - - tweak: "The circuit analyzer output has been slightly tweaked and includes usage instructions." diff --git a/html/changelogs/AutoChangeLog-pr-5608.yml b/html/changelogs/AutoChangeLog-pr-5608.yml deleted file mode 100644 index 430d10aee3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5608.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jittai" -delete-after: True -changes: - - tweak: "Ctrl+Clicking progresses through grab cycle on living mobs (not just humans)" diff --git a/html/changelogs/AutoChangeLog-pr-5609.yml b/html/changelogs/AutoChangeLog-pr-5609.yml deleted file mode 100644 index 9cf7d4dece..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5609.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Nanotrasen psychologists have identified new phobias emerging amongst the workforce. Nanotrasen's surgeon general advises all personnel to just buck up and deal with it." diff --git a/html/changelogs/AutoChangeLog-pr-5610.yml b/html/changelogs/AutoChangeLog-pr-5610.yml deleted file mode 100644 index 2f9459d9c4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5610.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Adds special tutorial holopads for the hazard course." diff --git a/html/changelogs/AutoChangeLog-pr-5611.yml b/html/changelogs/AutoChangeLog-pr-5611.yml deleted file mode 100644 index f5a6ffa91c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5611.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "NTnet circuit fix" -delete-after: True -changes: - - bugfix: "Now NTnet circuits can recieve sender adress properly.Also, now messages could be sended to multiple recepiens." diff --git a/html/changelogs/AutoChangeLog-pr-5612.yml b/html/changelogs/AutoChangeLog-pr-5612.yml deleted file mode 100644 index 2140adcada..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5612.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kevinz000 and Naksu" -delete-after: True -changes: - - bugfix: "Ore stacks will now initialize with proper visuals and no longer show a NO SPRITE text when you gather more than 20 ores to a stack." diff --git a/html/changelogs/AutoChangeLog-pr-5613.yml b/html/changelogs/AutoChangeLog-pr-5613.yml deleted file mode 100644 index 0d6bf7c6c8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5613.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "fixed multiserver mining formula" diff --git a/html/changelogs/AutoChangeLog-pr-5615.yml b/html/changelogs/AutoChangeLog-pr-5615.yml deleted file mode 100644 index 5b78aec45f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5615.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Plastic surgery now lets you choose from a list of ten random names, so you can pick the one that you prefer." - - tweak: "Abductors performing plastic surgery can now give their target spooky subject names, with one normal name available for standard plastique." diff --git a/html/changelogs/AutoChangeLog-pr-5616.yml b/html/changelogs/AutoChangeLog-pr-5616.yml deleted file mode 100644 index 8b9cf3dd00..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5616.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - balance: "Xenos no longer have stun or stamina immunity" diff --git a/html/changelogs/AutoChangeLog-pr-5617.yml b/html/changelogs/AutoChangeLog-pr-5617.yml deleted file mode 100644 index f96e0ef3d6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5617.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - balance: "Sleeping Carp and Psychotic Brawl will now both use Knockdown() instead of Stun() for their stuns, making things a lot more consistent with the recent stun nerfs." diff --git a/html/changelogs/AutoChangeLog-pr-5618.yml b/html/changelogs/AutoChangeLog-pr-5618.yml deleted file mode 100644 index 7e25ba3dd7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5618.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "RealDonaldTrump" -delete-after: True -changes: - - tweak: "Altered the HoP to require Service experience instead of Supply" diff --git a/html/changelogs/AutoChangeLog-pr-5619.yml b/html/changelogs/AutoChangeLog-pr-5619.yml deleted file mode 100644 index 08dcfe13ae..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5619.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Added the dish drive. This machine, the future in plate disposal, can be researched from techwebs (Biological Processing) and built with a standard machine frame using two matter bins, a micro manipulator, and a glass sheet." - - rscadd: "A circuit board for the dish drive can be found in the chef's and bartender's wardrobes." - - rscadd: "You can hit a dish drive with any dish (like a plate or drinking glass), and the dish drive will convert it from matter to energy, allowing it to store an infinite amount of dishes. You can also interact with it to get things back from it." - - rscadd: "Dish drives also have an automatic \"suction\" function that sucks in all loose dishes within four tiles. This can be toggled by activating its circuit board in-hand." - - rscadd: "Dish drives automatically beam their stored dishes into any disposal unit that it can see within seven tiles every minute. You can toggle this by alt-clicking its circuit board." diff --git a/html/changelogs/AutoChangeLog-pr-5623.yml b/html/changelogs/AutoChangeLog-pr-5623.yml deleted file mode 100644 index 89b45d32e5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5623.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - bugfix: "Fixed preferences from overridding vore bellies on different characters with the last saved. Maybe. Worked on local." - - soundadd: "added a button for prey to restart their sound loop, if it cut out and they want it back on." - - soundadd: "Vore sounds respect walls, people can stop bitching about dorm room vore RP." diff --git a/html/changelogs/AutoChangeLog-pr-5630.yml b/html/changelogs/AutoChangeLog-pr-5630.yml deleted file mode 100644 index d7f24d0ad5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5630.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Flightsuits should be controllable again" diff --git a/html/changelogs/AutoChangeLog-pr-5633.yml b/html/changelogs/AutoChangeLog-pr-5633.yml deleted file mode 100644 index 8130f1cd15..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5633.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - bugfix: "Slimes of all sorts should no longer have livers" diff --git a/html/changelogs/AutoChangeLog-pr-5634.yml b/html/changelogs/AutoChangeLog-pr-5634.yml deleted file mode 100644 index c020140483..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5634.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - code_imp: "Renamed the IDs of various reagents to be more descriptive." - - spellcheck: "Fixed the descriptions of changeling adrenaling reagents." diff --git a/html/changelogs/AutoChangeLog-pr-5635.yml b/html/changelogs/AutoChangeLog-pr-5635.yml deleted file mode 100644 index d9b05dafa2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5635.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "Changed Santa event earliest start from 33 minutes & 20 seconds to 30 minutes. Changed shuttle loan earliest start from 6 minutes & 40 seconds to 7 minutes." diff --git a/html/changelogs/AutoChangeLog-pr-5636.yml b/html/changelogs/AutoChangeLog-pr-5636.yml deleted file mode 100644 index 36034f0db6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5636.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - spellcheck: "Tweaked the message you see when emagging meteor shield satellites." diff --git a/html/changelogs/AutoChangeLog-pr-5638.yml b/html/changelogs/AutoChangeLog-pr-5638.yml deleted file mode 100644 index 359dde9603..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5638.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Kevinz000 & Deathride58" -delete-after: True -changes: - - rscadd: "A separate round time has been added to status panel. This will start at 00:00:00." - - rscadd: "Night shift lighting [if enabled in the same configuration] will activate between station time 7:30 PM and 7:30 AM. This will dim all lights affected, but they will still have the same range." - - rscadd: "APCs now have an option to set night lighting mode on or off, regardless of time." diff --git a/html/changelogs/AutoChangeLog-pr-5640.yml b/html/changelogs/AutoChangeLog-pr-5640.yml deleted file mode 100644 index 1e73571181..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5640.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - code_imp: "removed unused poisoned apple variant" diff --git a/html/changelogs/AutoChangeLog-pr-5641.yml b/html/changelogs/AutoChangeLog-pr-5641.yml deleted file mode 100644 index 9e6eba0abe..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5641.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jittai / ChuckTheSheep" -delete-after: True -changes: - - imageadd: "NT has stopped buying re-boxed storebrand Donkpockets and now stocks stations with real, genuine, tasty Donkpockets!" diff --git a/html/changelogs/AutoChangeLog-pr-5642.yml b/html/changelogs/AutoChangeLog-pr-5642.yml deleted file mode 100644 index 1bf3247e67..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5642.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "Nanotrasen has begun a campaign to inform their employees that you can alt-click to disable morgue tray beeping." diff --git a/html/changelogs/AutoChangeLog-pr-5645.yml b/html/changelogs/AutoChangeLog-pr-5645.yml deleted file mode 100644 index 9478df06eb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5645.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "The clock cult's marauder limit now works properly, temporarily lower the marauder limit when one has recently been summoned." diff --git a/html/changelogs/AutoChangeLog-pr-5647.yml b/html/changelogs/AutoChangeLog-pr-5647.yml deleted file mode 100644 index 53ae908ef9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5647.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Super3222, TheMythicGhost, DaedalusGame" -delete-after: True -changes: - - rscadd: "Adds a barometer function to the standard atmos analyzer." - - imageadd: "Adds a new sprite for the atmos analyzer to resemble a barometer." diff --git a/html/changelogs/AutoChangeLog-pr-5648.yml b/html/changelogs/AutoChangeLog-pr-5648.yml deleted file mode 100644 index 2c763dd2b3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5648.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Repukan" -delete-after: True -changes: - - bugfix: "fixed windoors dropping more cable than what was used to build them." diff --git a/html/changelogs/AutoChangeLog-pr-5649.yml b/html/changelogs/AutoChangeLog-pr-5649.yml deleted file mode 100644 index b973890684..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5649.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "RealDonaldTrump" -delete-after: True -changes: - - balance: "Rebalanced cold damage on slimepeople" - - bugfix: "Transform potions no longer give more than one alter form ability" diff --git a/html/changelogs/AutoChangeLog-pr-5650.yml b/html/changelogs/AutoChangeLog-pr-5650.yml deleted file mode 100644 index 0eefedb0ab..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5650.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MetroidLover" -delete-after: True -changes: - - balance: "rebalanced Ninja event to allow it to happen earlier." diff --git a/html/changelogs/AutoChangeLog-pr-5651.yml b/html/changelogs/AutoChangeLog-pr-5651.yml deleted file mode 100644 index eeb3b0a2cb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5651.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MetroidLover" -delete-after: True -changes: - - bugfix: "fixed Ninja welcome text to no longer tell you to right click your suit." diff --git a/html/changelogs/AutoChangeLog-pr-5653.yml b/html/changelogs/AutoChangeLog-pr-5653.yml deleted file mode 100644 index 11325e5f67..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5653.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "kevinz000, Denton" -delete-after: True -changes: - - rscadd: "Nanotrasen's RnD division has integrated all stationary tachyon doppler arrays into the techweb system. Record increasingly large explosions with them and you will generate research points!" - - spellcheck: "Fixed a few typos in the RnD doppler array name/description." diff --git a/html/changelogs/AutoChangeLog-pr-5657.yml b/html/changelogs/AutoChangeLog-pr-5657.yml deleted file mode 100644 index 45f0856d0e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5657.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cebutris" -delete-after: True -changes: - - tweak: "Toxin loving species now properly take toxin damage from liver failiure" diff --git a/html/changelogs/AutoChangeLog-pr-5658.yml b/html/changelogs/AutoChangeLog-pr-5658.yml deleted file mode 100644 index 179b332095..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5658.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - code_imp: "removes input/output plates and changes autogibbers to use input dir" diff --git a/html/changelogs/AutoChangeLog-pr-5659.yml b/html/changelogs/AutoChangeLog-pr-5659.yml deleted file mode 100644 index b6ba2cee2b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5659.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "The outer airlocks of various lavaland ruins and ships now cycle lock." diff --git a/html/changelogs/AutoChangeLog-pr-5660.yml b/html/changelogs/AutoChangeLog-pr-5660.yml deleted file mode 100644 index 23fd1ab34d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5660.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "The outer airlocks of most space ruin airlocks are now cycle linked." diff --git a/html/changelogs/AutoChangeLog-pr-5661.yml b/html/changelogs/AutoChangeLog-pr-5661.yml deleted file mode 100644 index a1f53d6f16..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5661.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - admin: "Admins can now start the game as extended revs, a version of revs that doesn't end when head(rev)s are dead. Admins can also use the speedy mode, which nukes the station after 20 minutes." diff --git a/html/changelogs/AutoChangeLog-pr-5662.yml b/html/changelogs/AutoChangeLog-pr-5662.yml deleted file mode 100644 index c7851b94cb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5662.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - bugfix: "Players can no longer kill themselves by whispering inside clone pods." diff --git a/html/changelogs/AutoChangeLog-pr-5663.yml b/html/changelogs/AutoChangeLog-pr-5663.yml deleted file mode 100644 index 6bda49061b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5663.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Repukan" -delete-after: True -changes: - - rscadd: "Whiskey to the flask" - - rscdel: "Hearty Punch from the flask" diff --git a/html/changelogs/AutoChangeLog-pr-5666.yml b/html/changelogs/AutoChangeLog-pr-5666.yml deleted file mode 100644 index 0000b86190..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5666.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - tweak: "The 'neurotoxin2' toxin has been renamed to Fentanyl." diff --git a/html/changelogs/AutoChangeLog-pr-5668.yml b/html/changelogs/AutoChangeLog-pr-5668.yml deleted file mode 100644 index e8f9ae32b9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5668.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - bugfix: "Dogborgs should no longer have offset issues after attacking." - - bugfix: "Dogborg laser/disabler fluff now works again." diff --git a/html/changelogs/AutoChangeLog-pr-5669.yml b/html/changelogs/AutoChangeLog-pr-5669.yml deleted file mode 100644 index 48cf9a6be9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5669.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - tweak: "Silicons no longer have to be adjacent to morguetrays to disable the alarms on then." diff --git a/html/changelogs/AutoChangeLog-pr-5670.yml b/html/changelogs/AutoChangeLog-pr-5670.yml deleted file mode 100644 index bc9ed17cfa..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5670.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - bugfix: "Shock collars re-added to autolathes" diff --git a/html/changelogs/AutoChangeLog-pr-5672.yml b/html/changelogs/AutoChangeLog-pr-5672.yml deleted file mode 100644 index 4c9c5f0a06..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5672.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Astral" -delete-after: True -changes: - - rscadd: "Traitor CMOs and Chemists, for 12 TC, can now get a reagent dartgun, which is capable of synthesizing it's own syringes, but does so slowly, and can be easily identified as syndicate by anyone who isn't blind!" diff --git a/html/changelogs/AutoChangeLog-pr-5673.yml b/html/changelogs/AutoChangeLog-pr-5673.yml deleted file mode 100644 index 15622f81a9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5673.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "enables the RPED to construct/replace other parts commonly used in machines (igniters, beakers, bs crystals)" - - bugfix: "fixes part ratings of cells so slime cells are correctly more desirable than bluespace cells and other such nonsense" diff --git a/html/changelogs/AutoChangeLog-pr-5674.yml b/html/changelogs/AutoChangeLog-pr-5674.yml deleted file mode 100644 index f6359e0328..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5674.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "shivering symptom now works properly instead of only cooling you if you're already cold" - - bugfix: "fixed bodytemp going negative in a few cases" diff --git a/html/changelogs/AutoChangeLog-pr-5680.yml b/html/changelogs/AutoChangeLog-pr-5680.yml deleted file mode 100644 index 025217a854..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5680.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Reskinning objects now shows their possible appearances in the chat box." diff --git a/html/changelogs/AutoChangeLog-pr-5681.yml b/html/changelogs/AutoChangeLog-pr-5681.yml deleted file mode 100644 index 0334a6ccb1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5681.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Added Bastion Bourbon, which you can mix with tea, creme de menthe, triple citrus, and berry juice. When it's in your system, it will very slowly heal you as long as you're not in critical. When it's first added to your system, you heal an amount of each damage type equal to the volume taken in, with a max of 10. This is turned to a max of 20 for anyone in critical." - - rscadd: "Added Squirt Cider, which you can mix with water, tomato juice, and nutriment. It's nutritious and healthy!" diff --git a/html/changelogs/AutoChangeLog-pr-5684.yml b/html/changelogs/AutoChangeLog-pr-5684.yml deleted file mode 100644 index f460ddfb01..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5684.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "The last scientists have reported that thermonuclear blasts triggered by so called 'power gamers' have shorted the doppler array. We've readjusted the ALU and are confident that this will not happen again." diff --git a/html/changelogs/AutoChangeLog-pr-5687.yml b/html/changelogs/AutoChangeLog-pr-5687.yml deleted file mode 100644 index c5603175fb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5687.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - rscadd: "Lights will now actually glow in the dark!" diff --git a/html/changelogs/AutoChangeLog-pr-5689.yml b/html/changelogs/AutoChangeLog-pr-5689.yml deleted file mode 100644 index f6eae22630..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5689.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "Tweaked the inventory management of the black fedora to be more like the detective's" diff --git a/html/changelogs/AutoChangeLog-pr-5697.yml b/html/changelogs/AutoChangeLog-pr-5697.yml deleted file mode 100644 index 24a1d5abe2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5697.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - rscadd: "Added a syndicate exclusive .357. Replaces the original one in the uplink. All other .357s are untouched." - - imageadd: "added new sprites for crowbars, wrenches, syndicate .357, and eguns" diff --git a/html/changelogs/AutoChangeLog-pr-5698.yml b/html/changelogs/AutoChangeLog-pr-5698.yml deleted file mode 100644 index 8bdc304c7f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5698.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - balance: "You can no longer gain the same trauma more than once." - - balance: "You can no longer gain more than a certain amount of brain traumas per resilience tier. (Example: You cannot gain 4 mild traumas, but you can gain 3 mild and 1 severe)" - - tweak: "Abductors' trauma gland now gives traumas of random resilience, instead of lobotomy every time." diff --git a/html/changelogs/AutoChangeLog-pr-5701.yml b/html/changelogs/AutoChangeLog-pr-5701.yml deleted file mode 100644 index b113bf0ee0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5701.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - tweak: "Operating computers now display the chemicals required to complete a surgery step, if there are any." - - tweak: "Completing a surgery without the required chems will always result in failure, instead of a success with no effect." diff --git a/html/changelogs/AutoChangeLog-pr-5702.yml b/html/changelogs/AutoChangeLog-pr-5702.yml deleted file mode 100644 index 9ebcd306d6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5702.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - balance: "Wizard spells and items can now be resisted/ignored with anti-magic items/clothing such as null rods!" - - balance: "Revenant spells can now be resisted with \"holy\" items like null rods and bibles." - - balance: "Wizard hardsuits are now magic immune, but not holy." - - balance: "Immortality Talismans now grant both spell and holy immunity." - - tweak: "Inquisitor Hardsuits already granted spell and holy immunity, but now they do it properly instead of having a null rod embedded inside." - - tweak: "Holy Melons now grant holy immunity." diff --git a/html/changelogs/AutoChangeLog-pr-5703.yml b/html/changelogs/AutoChangeLog-pr-5703.yml deleted file mode 100644 index 1090c34dd0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5703.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - balance: "Instead of starting unable to clone circuits at all, circuit printers can now print circuits over time from roundstart. The formula for this is equal to (metal cost / 150) seconds, with a maximum of 3 minutes. You can see printing progress by using the printer's interface, and you can print normal components during this time." - - balance: "If circuit printing is disabled in the config, cloning remains unavailable." - - balance: "The upgrade disk to allow circuit printers to clone circuits has been replaced with an upgrade disk to make circuit cloning instant." - - balance: "Both circuit printer upgrade disks now cost 5000 metal and glass, down from 10000." diff --git a/html/changelogs/AutoChangeLog-pr-5704.yml b/html/changelogs/AutoChangeLog-pr-5704.yml deleted file mode 100644 index 30963a5296..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5704.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Tritium no longer produces so much radiation that it crashes the server" diff --git a/html/changelogs/AutoChangeLog-pr-5705.yml b/html/changelogs/AutoChangeLog-pr-5705.yml deleted file mode 100644 index 9a898ad295..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5705.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - code_imp: "Butchering has been refactored." - - balance: "Some items now take longer to butcher, and have a chance to harvest fewer items, like spears. Others, however, are faster, like circular saws." - - balance: "Certain creatures will always drop certain items on butchering, regardless of butchering effectiveness or chances." - - balance: "Items that are very effective at butchering may yield bonus loot from butchered creatures!" diff --git a/html/changelogs/AutoChangeLog-pr-5707.yml b/html/changelogs/AutoChangeLog-pr-5707.yml deleted file mode 100644 index b30b0458bf..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5707.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - balance: "livers don't unfail automatically every second life cycle you have to get a new one or get some corazone stat" - - balance: "increased liver damage from alcohol significantly because apparently your liver regenerates faster than you can chug unless you drink 100 liters of bacchus blessing" - - bugfix: "fixed cyber livers thinking they should fail at half durability" diff --git a/html/changelogs/AutoChangeLog-pr-5711.yml b/html/changelogs/AutoChangeLog-pr-5711.yml deleted file mode 100644 index 637e4770ca..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5711.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Plain hamburgers may now spawn as steamed hams with a very low chance." diff --git a/html/changelogs/AutoChangeLog-pr-5713.yml b/html/changelogs/AutoChangeLog-pr-5713.yml deleted file mode 100644 index 372798d263..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5713.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "Twisted Construction will now consume ALL available plasteel in a stack." - - bugfix: "Runes will no longer count the original invoker more than once." diff --git a/html/changelogs/AutoChangeLog-pr-5714.yml b/html/changelogs/AutoChangeLog-pr-5714.yml deleted file mode 100644 index 3aea8b539a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5714.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MMMiracles" -delete-after: True -changes: - - rscadd: "Added tinfoil hats, headgear that can help protect against government conspiracies and extra-terrestrials. Found in hacked autolathes." diff --git a/html/changelogs/AutoChangeLog-pr-5717.yml b/html/changelogs/AutoChangeLog-pr-5717.yml deleted file mode 100644 index 83cda7c017..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5717.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "The heart attack event will now actually make the victim acquire the heart disease" - - bugfix: "Clicking the chatbox link will let you orbit the victim" - - tweak: "The event is now significantly more sensitive to junk food. Recent consumption of multiple junk food items will triple your chances of having a heart attack (exercise will still block it)." diff --git a/html/changelogs/AutoChangeLog-pr-5719.yml b/html/changelogs/AutoChangeLog-pr-5719.yml deleted file mode 100644 index ac7d4e09a5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5719.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - rscadd: "Look sir, free crabs!" diff --git a/html/changelogs/AutoChangeLog-pr-5720.yml b/html/changelogs/AutoChangeLog-pr-5720.yml deleted file mode 100644 index 5a97f1e8d4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5720.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "selea" -delete-after: True -changes: - - bugfix: "fixed floorbot" - - bugfix: "fixed cleanbot" - - refactor: "improved pathiding in case of given minimal distance;improved sanitation" diff --git a/html/changelogs/AutoChangeLog-pr-5722.yml b/html/changelogs/AutoChangeLog-pr-5722.yml new file mode 100644 index 0000000000..e3f570caa2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5722.yml @@ -0,0 +1,6 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Hypospray mk IIs are being deployed to stations, these should provide an easier time for medical staff! They come with both inject and spray modes! Spray mode acts like a patch for applying meds" + - soundadd: "Hyposprays are fancy, you'll know when they're being used." + - server: "Due to fucky-ness, you'll need to unload, then reload the hypos at least once. just how it be." diff --git a/html/changelogs/AutoChangeLog-pr-5723.yml b/html/changelogs/AutoChangeLog-pr-5723.yml deleted file mode 100644 index f1a0c512c1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5723.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Astral" -delete-after: True -changes: - - rscadd: "blood cultists can now use a nar nar plushie as an extra invoker for runes!" diff --git a/html/changelogs/AutoChangeLog-pr-5726.yml b/html/changelogs/AutoChangeLog-pr-5726.yml deleted file mode 100644 index 5119596f74..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5726.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - rscadd: "Tesla Corona Analyzers! Study the seemingly magic Edison's Bane for supplemental research points!" diff --git a/html/changelogs/AutoChangeLog-pr-5727.yml b/html/changelogs/AutoChangeLog-pr-5727.yml deleted file mode 100644 index dc916865b0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5727.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "RealDonaldTrump" -delete-after: True -changes: - - tweak: "Removed the probability check from prayer beads for their low amount of healing, as well as lowering the time needed to heal from 15 seconds to 10 seconds. Slimepeople won't get harmed by prayer beads either." diff --git a/html/changelogs/AutoChangeLog-pr-5729.yml b/html/changelogs/AutoChangeLog-pr-5729.yml deleted file mode 100644 index 8f579124be..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5729.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - rscdel: "SNPCs have been removed." diff --git a/html/changelogs/AutoChangeLog-pr-5730.yml b/html/changelogs/AutoChangeLog-pr-5730.yml deleted file mode 100644 index 5483366e13..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5730.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - tweak: "Bath Salts now induce psychotic rage, but cause much more brain damage." diff --git a/html/changelogs/AutoChangeLog-pr-5733.yml b/html/changelogs/AutoChangeLog-pr-5733.yml deleted file mode 100644 index 26cb19420a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5733.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Medals now show the commendation text in the description." diff --git a/html/changelogs/AutoChangeLog-pr-5734.yml b/html/changelogs/AutoChangeLog-pr-5734.yml deleted file mode 100644 index 7107a79eea..0000000000 --- a/html/changelogs/AutoChangeLog-pr-5734.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - bugfix: "Cyborg defib units are now actually functional" diff --git a/html/changelogs/AutoChangeLog-pr-5787.yml b/html/changelogs/AutoChangeLog-pr-5787.yml new file mode 100644 index 0000000000..6b44ee591e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5787.yml @@ -0,0 +1,6 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Tesla Engines are now standard on all but Omega." + - bugfix: "fixed a pipe in Meta station that wasn't connected properly." + - bugfix: "fixed an exploit related to Tesla wires." diff --git a/html/changelogs/AutoChangeLog-pr-5788.yml b/html/changelogs/AutoChangeLog-pr-5788.yml new file mode 100644 index 0000000000..2f5d1bdd2d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5788.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - code_imp: "First pass on cleaning up junk defines and unused code" diff --git a/html/changelogs/AutoChangeLog-pr-5789.yml b/html/changelogs/AutoChangeLog-pr-5789.yml new file mode 100644 index 0000000000..aef3f8ad01 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5789.yml @@ -0,0 +1,12 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Added release sound effects for choosing. If having a non-belly, belly." + - rscadd: "Added a 'silent' modifier to bellies." + - rscadd: "Added a vore subsystem to handle belly processing, should be less clunky" + - balance: "rebalanced heal mode and dragon digestion." + - soundadd: "added client preference based sound toggles to both eating/release/struggle and digestion noises seperately." + - refactor: "vore prefs save to JSON now instead of .sav. much easier really. +refractor: dragon vore is working, though with this game who knows." + - server: "your prefs should automatically transfer, but it's likely you'll lose pre-loaded bellies, BACK UP EVERYTHING. (you should be doing this anyway too)" + - server: "Creating new characters will import the previous' bellies. but once you click 'save' they'll make the new JSON file will all the info. This is per slot, so if you change your character, you'll have to change belly stuff." diff --git a/html/changelogs/AutoChangeLog-pr-5803.yml b/html/changelogs/AutoChangeLog-pr-5803.yml new file mode 100644 index 0000000000..39ecfb7c9d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5803.yml @@ -0,0 +1,6 @@ +author: "Denton" +delete-after: True +changes: + - bugfix: "Pubbystation: Added a missing APC to the cargo sorting room, a light fixture to the RnD security checkpoint and removed an overlooked firelock east of the bridge." + - rscadd: "Pubbystation: Added a spare RPD to the Atmospherics department. Replaced Engineering's outdated meson goggles with modern engineering scanners. Added a GPS device to the secure storage crate." + - tweak: "Moved Pubbystation's drone shell dispenser from the experimentation lab to Robotics maint." diff --git a/html/changelogs/AutoChangeLog-pr-5806.yml b/html/changelogs/AutoChangeLog-pr-5806.yml new file mode 100644 index 0000000000..c21932b1cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5806.yml @@ -0,0 +1,4 @@ +author: "Jittai / ChuckTheSheep" +delete-after: True +changes: + - tweak: "Adjusted the space parallax's contrast to be less vibrant." diff --git a/html/changelogs/AutoChangeLog-pr-5815.yml b/html/changelogs/AutoChangeLog-pr-5815.yml new file mode 100644 index 0000000000..5054ef2a97 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5815.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Added a new mini antagonist, the sentient disease." diff --git a/html/changelogs/AutoChangeLog-pr-5817.yml b/html/changelogs/AutoChangeLog-pr-5817.yml new file mode 100644 index 0000000000..d8422bca42 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5817.yml @@ -0,0 +1,4 @@ +author: "ZeroNetAlpha" +delete-after: True +changes: + - tweak: "Tweaked Aquatic Species to give fillets when run through the chef's gibber." diff --git a/html/changelogs/AutoChangeLog-pr-5821.yml b/html/changelogs/AutoChangeLog-pr-5821.yml new file mode 100644 index 0000000000..86c02f0379 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5821.yml @@ -0,0 +1,4 @@ +author: "selea" +delete-after: True +changes: + - bugfix: "After several months of natural selection, hostile mobs started to attack assemblies with combat circuits." diff --git a/html/changelogs/AutoChangeLog-pr-5822.yml b/html/changelogs/AutoChangeLog-pr-5822.yml new file mode 100644 index 0000000000..7592b0a1dd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5822.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - bugfix: "Widescreen pref works again." diff --git a/html/changelogs/AutoChangeLog-pr-5825.yml b/html/changelogs/AutoChangeLog-pr-5825.yml new file mode 100644 index 0000000000..d16ba7b816 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5825.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - admin: "Admins can now easily spawn mobs that look like objects. Googly eyes optional!" diff --git a/html/changelogs/AutoChangeLog-pr-5827.yml b/html/changelogs/AutoChangeLog-pr-5827.yml new file mode 100644 index 0000000000..6a7fc6dba0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5827.yml @@ -0,0 +1,4 @@ +author: "Anonymous" +delete-after: True +changes: + - rscadd: "Adds nymphomania trait, which will raise your minimal arousal and boost rate of it." diff --git a/html/changelogs/AutoChangeLog-pr-5828.yml b/html/changelogs/AutoChangeLog-pr-5828.yml new file mode 100644 index 0000000000..121f22e488 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5828.yml @@ -0,0 +1,8 @@ +author: "Poojawa" +delete-after: True +changes: + - rscdel: "Removed old things in .dms we weren't using anymore" + - tweak: "subtle messages are now italic'd, so there's better context on whispering" + - tweak: "broke apart the cit_gun.dm file, they're decently spaced out now" + - tweak: "dogborg_sleeper is now standalone from dogborg_equipment because too lazy to debug why it was breaking backpacks." + - tweak: "does that thing I've been meaning to do with Xenobio. additional tools have been provided." diff --git a/html/changelogs/AutoChangeLog-pr-5830.yml b/html/changelogs/AutoChangeLog-pr-5830.yml new file mode 100644 index 0000000000..49b495e7e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5830.yml @@ -0,0 +1,5 @@ +author: "ZeroNetAlpha" +delete-after: True +changes: + - tweak: "Makes all darts deletable with nothing more than a little space cleaner." + - tweak: "Makes in-flight foam darts dissolve when hit with space cleaner, be it foam, smoke, or a janitor being a badass with a spraybottle." diff --git a/html/changelogs/AutoChangeLog-pr-5843.yml b/html/changelogs/AutoChangeLog-pr-5843.yml new file mode 100644 index 0000000000..6916b09b7f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5843.yml @@ -0,0 +1,4 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Added new trek uniforms to loadouts!" diff --git a/html/changelogs/AutoChangeLog-pr-5846.yml b/html/changelogs/AutoChangeLog-pr-5846.yml new file mode 100644 index 0000000000..37ec3fd75c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5846.yml @@ -0,0 +1,4 @@ +author: "MMMiracles" +delete-after: True +changes: + - tweak: "Thirteen Loko now has an overdose threshold of 60u, see your local CMO for potential side-effects." diff --git a/html/changelogs/AutoChangeLog-pr-5850.yml b/html/changelogs/AutoChangeLog-pr-5850.yml new file mode 100644 index 0000000000..832dfa320f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5850.yml @@ -0,0 +1,7 @@ +author: "Dax Dupont" +delete-after: True +changes: + - rscadd: "Beacons can now be toggled on and off." + - rscadd: "Mappers can now have beacons that default to off. Useful for ruins!" + - tweak: "Renaming replaces the snowflake locator frequency/code" + - refactor: "Beacons are no longer radios. Why were they radios in the first place? I don't know." diff --git a/html/changelogs/AutoChangeLog-pr-5851.yml b/html/changelogs/AutoChangeLog-pr-5851.yml new file mode 100644 index 0000000000..0970cb6464 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5851.yml @@ -0,0 +1,4 @@ +author: "Cebutris" +delete-after: True +changes: + - spellcheck: "lithenessk -> litheness" diff --git a/html/changelogs/AutoChangeLog-pr-5853.yml b/html/changelogs/AutoChangeLog-pr-5853.yml new file mode 100644 index 0000000000..e3b8223b44 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5853.yml @@ -0,0 +1,9 @@ +author: "Floyd / Qustinnus (Sprites by Ausops, Some moodlets by Ike709)" +delete-after: True +changes: + - rscadd: "Adds mood, which can be found by clicking on the face icon on your screen." + - rscadd: "Adds various moodlets which affect your mood. Try eating your favourite food, playing an arcade game, reading a book, or petting a doggo to increase your moo. Also be sure to take care of your hunger on a regular basis, like always." + - rscadd: "Adds config option to disable/enable mood." + - rscadd: "Indoor area's now have a beauty var defined by the amount of cleanables in them, (We can later expand this to something like rimworld, where structures could make rooms more beautiful). These also affect mood. (Janitor now has gameplay purpose besides slipping and removing useless decals) +remove: Removes hunger slowdown, replacing it with slowdown by being depressed" + - imageadd: "Icons for mood states and depression states" diff --git a/html/changelogs/AutoChangeLog-pr-5857.yml b/html/changelogs/AutoChangeLog-pr-5857.yml new file mode 100644 index 0000000000..c0319c5409 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5857.yml @@ -0,0 +1,7 @@ +author: "ACCount" +delete-after: True +changes: + - rscadd: "Station airlocks now support NTNet remote control. Door remotes now use NTNet." + - rscadd: "Don't worry, any non-public airlock is fully protected from unauthorized control attempts by NTNet PassKey system!" + - rscadd: "New integrated circuit component: card reader. Use it to read PassKeys from ID cards." + - bugfix: "Fixes a delay issue when airlocks are being opened/closed by signalers." diff --git a/html/changelogs/AutoChangeLog-pr-5858.yml b/html/changelogs/AutoChangeLog-pr-5858.yml new file mode 100644 index 0000000000..9be53f10fb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5858.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Sentient diseases now get two minutes to select an initial host before being assigned a random one." diff --git a/html/changelogs/AutoChangeLog-pr-5861.yml b/html/changelogs/AutoChangeLog-pr-5861.yml new file mode 100644 index 0000000000..c92e23329c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5861.yml @@ -0,0 +1,4 @@ +author: "Astral" +delete-after: True +changes: + - bugfix: "Lighting fixtures should no longer be visible in camera-less areas by cameras." diff --git a/html/changelogs/AutoChangeLog-pr-5863.yml b/html/changelogs/AutoChangeLog-pr-5863.yml new file mode 100644 index 0000000000..f59dbe3279 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5863.yml @@ -0,0 +1,6 @@ +author: "Dax Dupont" +delete-after: True +changes: + - rscadd: "Display cases can now have a list where to randomly spawn items from." + - refactor: "Moved plaque code to main type." + - refactor: "Statues now use default unwrench and the tool interaction is now completely non existent when no deconstruct flag is available." diff --git a/html/changelogs/AutoChangeLog-pr-5864.yml b/html/changelogs/AutoChangeLog-pr-5864.yml new file mode 100644 index 0000000000..2e26e19478 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5864.yml @@ -0,0 +1,8 @@ +author: "Robustin" +delete-after: True +changes: + - balance: "Harvesters now have 40hp, from 60." + - tweak: "The nuke will now detonate 2 minutes after Nar'sie is summoned, down from 2.5 minutes" + - tweak: "The \"ARM\" ending now requires 75% of the remaining souls aboard to be sacrificed before the nuke goes off, up from 60%." + - bugfix: "Drones can no longer be on the sacrifice list" + - bugfix: "Bloodsense will now show the true name of the target" diff --git a/html/changelogs/AutoChangeLog-pr-5871.yml b/html/changelogs/AutoChangeLog-pr-5871.yml new file mode 100644 index 0000000000..3d9c42ed5a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5871.yml @@ -0,0 +1,5 @@ +author: "Naksu" +delete-after: True +changes: + - tweak: "The smoke machine can now be deconstructed using a screwdriver and a crowbar" + - code_imp: "The smoke machine no longer calls update_icon every process()" diff --git a/html/changelogs/AutoChangeLog-pr-5872.yml b/html/changelogs/AutoChangeLog-pr-5872.yml new file mode 100644 index 0000000000..0615c7222c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5872.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - balance: "The white ship and miscellaneous caravan ships lose their advanced place-anywhere shuttle movement during war ops." diff --git a/html/changelogs/AutoChangeLog-pr-5873.yml b/html/changelogs/AutoChangeLog-pr-5873.yml new file mode 100644 index 0000000000..fb14c54aa6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5873.yml @@ -0,0 +1,4 @@ +author: "Mark9013100" +delete-after: True +changes: + - rscadd: "Pill bottles can now be produced in the autolathe." diff --git a/html/changelogs/AutoChangeLog-pr-5880.yml b/html/changelogs/AutoChangeLog-pr-5880.yml new file mode 100644 index 0000000000..4f1b0ce0ec --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5880.yml @@ -0,0 +1,4 @@ +author: "ninjanomnom" +delete-after: True +changes: + - bugfix: "Blowing up the wrong part of the shuttle should no longer result in the shuttle being permanently broken." diff --git a/html/changelogs/AutoChangeLog-pr-5881.yml b/html/changelogs/AutoChangeLog-pr-5881.yml new file mode 100644 index 0000000000..4aea27c4e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5881.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - rscdel: "The smoke machine can no longer be found in chemistry departments, instead it must be constructed manually. The board was added to techwebs earlier." diff --git a/html/changelogs/AutoChangeLog-pr-5882.yml b/html/changelogs/AutoChangeLog-pr-5882.yml new file mode 100644 index 0000000000..ada0ba952c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5882.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Oh hey guys, RND shows correct material values now, don't hurt me!" diff --git a/html/changelogs/AutoChangeLog-pr-5887.yml b/html/changelogs/AutoChangeLog-pr-5887.yml new file mode 100644 index 0000000000..f9e8bcae27 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5887.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Dead bodies no longer freak out about phobias" diff --git a/html/changelogs/AutoChangeLog-pr-5888.yml b/html/changelogs/AutoChangeLog-pr-5888.yml new file mode 100644 index 0000000000..57ce9196c9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5888.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Turrets can be set to shoot personnel without loyalty implants" diff --git a/html/changelogs/AutoChangeLog-pr-5889.yml b/html/changelogs/AutoChangeLog-pr-5889.yml new file mode 100644 index 0000000000..411f8d85fa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5889.yml @@ -0,0 +1,4 @@ +author: "Astral" +delete-after: True +changes: + - bugfix: "Constructed turbines will now properly connect to the powernet" diff --git a/html/changelogs/AutoChangeLog-pr-5890.yml b/html/changelogs/AutoChangeLog-pr-5890.yml new file mode 100644 index 0000000000..848e273808 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5890.yml @@ -0,0 +1,5 @@ +author: "Denton" +delete-after: True +changes: + - rscadd: "Engi-Vend machines now have welding goggles available." + - tweak: "Grouped Nano-Med/Engi-Vend items by category." diff --git a/html/changelogs/AutoChangeLog-pr-5891.yml b/html/changelogs/AutoChangeLog-pr-5891.yml new file mode 100644 index 0000000000..55dc2fc13b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5891.yml @@ -0,0 +1,4 @@ +author: "XDTM" +delete-after: True +changes: + - rscadd: "You can now place people on tables on Help Intent. Doing so takes a few seconds and makes the target Rest, instead of stunning them." diff --git a/html/changelogs/AutoChangeLog-pr-5892.yml b/html/changelogs/AutoChangeLog-pr-5892.yml new file mode 100644 index 0000000000..a6e882d262 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5892.yml @@ -0,0 +1,5 @@ +author: "The Dreamweaver (Sprites: Onule)" +delete-after: True +changes: + - rscdel: "Nanotrasen's Lavaland research team has discovered that the alien brain has disappeared from necropolis chests." + - rscadd: "In it's place they have discovered a new artifact, the Rod of Asclepius, a strange rod with a magnitude of healing properties, and an even higher magnitude of responsibility..." diff --git a/html/changelogs/AutoChangeLog-pr-5895.yml b/html/changelogs/AutoChangeLog-pr-5895.yml new file mode 100644 index 0000000000..998bd2c206 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5895.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Added wall safes to Deltastation's HoP and Captain's offices." diff --git a/html/changelogs/AutoChangeLog-pr-5896.yml b/html/changelogs/AutoChangeLog-pr-5896.yml new file mode 100644 index 0000000000..7b9d78d60f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5896.yml @@ -0,0 +1,5 @@ +author: "Xhuis" +delete-after: True +changes: + - bugfix: "Circuit slow-cloning no longer breaks with some circuits." + - code_imp: "Circuit slow-cloning is now cleaner." diff --git a/html/changelogs/AutoChangeLog-pr-5899.yml b/html/changelogs/AutoChangeLog-pr-5899.yml new file mode 100644 index 0000000000..0d28d7e89b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5899.yml @@ -0,0 +1,4 @@ +author: "Cobby" +delete-after: True +changes: + - tweak: "The Eminence scoffs at your \"consecrated\" tiles once the Justicar is freed from his imprisonment." diff --git a/html/changelogs/AutoChangeLog-pr-5900.yml b/html/changelogs/AutoChangeLog-pr-5900.yml new file mode 100644 index 0000000000..90238368d0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5900.yml @@ -0,0 +1,4 @@ +author: "ninjanomnom" +delete-after: True +changes: + - admin: "The debug message for generic shuttle errors is improved a little" diff --git a/html/changelogs/AutoChangeLog-pr-5908.yml b/html/changelogs/AutoChangeLog-pr-5908.yml new file mode 100644 index 0000000000..bcf78a9b89 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5908.yml @@ -0,0 +1,4 @@ +author: "checkraisefold" +delete-after: True +changes: + - bugfix: "Nukeops properly checks the required amount of enemies for the gamemode! This should fix downstream problems." diff --git a/html/changelogs/AutoChangeLog-pr-5909.yml b/html/changelogs/AutoChangeLog-pr-5909.yml new file mode 100644 index 0000000000..ae1d0dcb05 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5909.yml @@ -0,0 +1,4 @@ +author: "Denton" +delete-after: True +changes: + - tweak: "Various belts can now hold additional job-specific items." diff --git a/html/changelogs/AutoChangeLog-pr-5911.yml b/html/changelogs/AutoChangeLog-pr-5911.yml new file mode 100644 index 0000000000..2a8128761f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5911.yml @@ -0,0 +1,7 @@ +author: "Toriate" +delete-after: True +changes: + - rscadd: "Added ammo counters for RCDs" + - rscadd: "Added actual flashing yellow light for RCDs" + - imageadd: "added new RCD sprites including inhands" + - imagedel: "deleted old RCD iconstate, but not the inhands" diff --git a/html/changelogs/AutoChangeLog-pr-5912.yml b/html/changelogs/AutoChangeLog-pr-5912.yml new file mode 100644 index 0000000000..dfe252014f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5912.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - bugfix: "internet sounds can be stopped again" diff --git a/html/changelogs/AutoChangeLog-pr-5913.yml b/html/changelogs/AutoChangeLog-pr-5913.yml new file mode 100644 index 0000000000..96c102aefa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5913.yml @@ -0,0 +1,12 @@ +author: "Robustin" +delete-after: True +changes: + - bugfix: "One-man conversions are actually fixed this time - excess chanters var removed for a more readable and maintainable rune code." + - bugfix: "Runes should no longer become GIANT if spammed (credit to Joan for this fix)." + - bugfix: "Pylons are no longer a source of infinite rods." + - tweak: "Attempting conversion without 2 cultists present will give a more helpful warning." + - tweak: "You can no longer convert braindead individuals." + - balance: "Cult doors will no longer lose power but also cannot shock people, brittle cult doors have 30 less integrity. Therefore ordinary crew can now beat cult airlocks open without frying themselves." + - balance: "Blood magic now costs slightly more blood and takes slightly more time, the stun spell now stuns for 2 less seconds, twisted construction now costs 10 health, and the blood rite relics (halberd, bolts, beam) are all 50-100 charges cheaper." + - balance: "The deconversion time for holy water is slightly reduced, 10 units and 45 seconds (give or take), is all you should need now. Blood cultists can now have seizures while afflicted with holy water." + - balance: "Shades are now slower and have a modest reduction to their damage and health." diff --git a/html/changelogs/AutoChangeLog-pr-5914.yml b/html/changelogs/AutoChangeLog-pr-5914.yml new file mode 100644 index 0000000000..dfdc937f9b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5914.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - balance: "The space cleaner spray bottle is now much more efficient and uses much less space cleaner per spray. The amount of cleaner it can hold has been adjusted to compensate." diff --git a/html/changelogs/AutoChangeLog-pr-5915.yml b/html/changelogs/AutoChangeLog-pr-5915.yml new file mode 100644 index 0000000000..7cc5fb3dfa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5915.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "The Clockwork Justicar has decided to be merciful, and allow nonbelievers to anchor their petty machines in his city. It's only fair for them to have a fighting chance, after all." diff --git a/html/changelogs/AutoChangeLog-pr-5916.yml b/html/changelogs/AutoChangeLog-pr-5916.yml new file mode 100644 index 0000000000..4f400aeea0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5916.yml @@ -0,0 +1,4 @@ +author: "Onule" +delete-after: True +changes: + - tweak: "Mining drones have been given a visual makeover!" diff --git a/html/changelogs/AutoChangeLog-pr-5917.yml b/html/changelogs/AutoChangeLog-pr-5917.yml new file mode 100644 index 0000000000..425938df34 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5917.yml @@ -0,0 +1,4 @@ +author: "MrDoomBringer" +delete-after: True +changes: + - rscadd: "Orderable supplies in cargo now all have descriptions! The station's overall FLAVORFUL_TEXT stat has gone up by nearly 2% as a result." diff --git a/html/changelogs/AutoChangeLog-pr-5918.yml b/html/changelogs/AutoChangeLog-pr-5918.yml new file mode 100644 index 0000000000..0ee0b8d218 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5918.yml @@ -0,0 +1,4 @@ +author: "JJRcop" +delete-after: True +changes: + - bugfix: "Sanity checks for Play Internet Sound" diff --git a/html/changelogs/AutoChangeLog-pr-5920.yml b/html/changelogs/AutoChangeLog-pr-5920.yml new file mode 100644 index 0000000000..cc2a6e72dc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5920.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - rscadd: "The Nanotrasen Meteorology Division has identified the aurora caelus in your sector. If you are lucky, you may get a chance to witness it with your own eyes." diff --git a/html/changelogs/AutoChangeLog-pr-5921.yml b/html/changelogs/AutoChangeLog-pr-5921.yml new file mode 100644 index 0000000000..404a00d2bf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5921.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Fixed pacifists from being able to fire mech weapons" diff --git a/html/changelogs/AutoChangeLog-pr-5922.yml b/html/changelogs/AutoChangeLog-pr-5922.yml new file mode 100644 index 0000000000..13f274bae1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5922.yml @@ -0,0 +1,4 @@ +author: "ninjanomnom" +delete-after: True +changes: + - bugfix: "Custom shuttles being too close to the map edge was causing problems, you must now be at least 10 tiles away." diff --git a/html/changelogs/AutoChangeLog-pr-5924.yml b/html/changelogs/AutoChangeLog-pr-5924.yml new file mode 100644 index 0000000000..7ee12ffc92 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5924.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - admin: "ERT creation has been refactored to allow for easier customization and deployment via templates and settings" diff --git a/html/changelogs/AutoChangeLog-pr-5925.yml b/html/changelogs/AutoChangeLog-pr-5925.yml new file mode 100644 index 0000000000..84da455954 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5925.yml @@ -0,0 +1,4 @@ +author: "Polyphynx" +delete-after: True +changes: + - tweak: "Medical sprays can now be stored in medical belts and smartfridges." diff --git a/html/padlock.png b/html/padlock.png new file mode 100644 index 0000000000..c09b95bf51 Binary files /dev/null and b/html/padlock.png differ diff --git a/icons/effects/parallax.dmi b/icons/effects/parallax.dmi index b7a003d1bb..181b76007d 100755 Binary files a/icons/effects/parallax.dmi and b/icons/effects/parallax.dmi differ diff --git a/icons/mob/actions/actions_minor_antag.dmi b/icons/mob/actions/actions_minor_antag.dmi index 4e5806f2fb..20daacd32c 100644 Binary files a/icons/mob/actions/actions_minor_antag.dmi and b/icons/mob/actions/actions_minor_antag.dmi differ diff --git a/icons/mob/actions/actions_slime.dmi b/icons/mob/actions/actions_slime.dmi index 23fd6e3e8a..acf7a31c6e 100644 Binary files a/icons/mob/actions/actions_slime.dmi and b/icons/mob/actions/actions_slime.dmi differ diff --git a/icons/mob/aibots.dmi b/icons/mob/aibots.dmi index e02778dfc8..74137e8947 100644 Binary files a/icons/mob/aibots.dmi and b/icons/mob/aibots.dmi differ diff --git a/icons/mob/citadel_refs/borg HUDs.dmi b/icons/mob/citadel_refs/borg HUDs.dmi new file mode 100644 index 0000000000..bcbfcc1dc2 Binary files /dev/null and b/icons/mob/citadel_refs/borg HUDs.dmi differ diff --git a/icons/mob/citadel_refs/dogborg animations.dmi b/icons/mob/citadel_refs/dogborg animations.dmi new file mode 100644 index 0000000000..98c060f323 Binary files /dev/null and b/icons/mob/citadel_refs/dogborg animations.dmi differ diff --git a/icons/mob/citadel_refs/widerobot_vr.dmi b/icons/mob/citadel_refs/widerobot_vr.dmi new file mode 100644 index 0000000000..fa7285ae4c Binary files /dev/null and b/icons/mob/citadel_refs/widerobot_vr.dmi differ diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi index 8a93893b81..bda9dcea61 100644 Binary files a/icons/mob/custom_w.dmi and b/icons/mob/custom_w.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index d180eb445c..8f27d8b3bb 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 c275e66752..c27834de5c 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi index 4f256eea92..5b497afe53 100644 Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi index 4661d879c8..dbed4c43d2 100644 Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index 25594b3283..19ebe0a4be 100644 Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index fd145092a7..b757c00145 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi index fc236ac7e2..25d02d69ce 100644 Binary files a/icons/mob/screen_cyborg.dmi and b/icons/mob/screen_cyborg.dmi differ diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen_full.dmi index 76c3672627..502e9ad3f9 100644 Binary files a/icons/mob/screen_full.dmi and b/icons/mob/screen_full.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 5a088e451f..2c234e9894 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 241db46d08..a4b426ccd9 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/widerobot.dmi b/icons/mob/widerobot.dmi index 88ac16da24..81ec2ed86d 100644 Binary files a/icons/mob/widerobot.dmi and b/icons/mob/widerobot.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 367be13b3b..1022770acd 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/citadel/hypospray.dmi b/icons/obj/citadel/hypospray.dmi new file mode 100644 index 0000000000..f5e89227c7 Binary files /dev/null and b/icons/obj/citadel/hypospray.dmi differ diff --git a/icons/obj/citadel/vial.dmi b/icons/obj/citadel/vial.dmi new file mode 100644 index 0000000000..23bceb93b9 Binary files /dev/null and b/icons/obj/citadel/vial.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index e97dc22159..5e6e6e54d2 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index a494c1081c..de5f448ddd 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi index 9564d6c184..8ed3bb4eca 100644 Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 2e7a9219aa..834f430a98 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/dice.dmi b/icons/obj/dice.dmi index 0ca008e37e..1d6601aa31 100644 Binary files a/icons/obj/dice.dmi and b/icons/obj/dice.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index cd15db0552..b3774b26ab 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 9be47e5ef2..c003cf238e 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index 742c02985d..054aa47bbd 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 2787cfd8e0..8e930e1ee7 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index ce3030b6c5..829f8b9170 100644 Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index a9e81da034..64642b8a6c 100644 Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index d4e6d62f60..897508fa8c 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 7fa7bec604..1454d17a16 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 8a2b53f5f1..99850c34ba 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -68,27 +68,45 @@ window "mainwindow" left = "mapwindow" right = "infowindow" is-vert = true - splitter = 75 elem "input" type = INPUT - pos = 5,420 - size = 595x20 + pos = 3,420 + size = 517x20 anchor1 = 0,100 anchor2 = 100,100 - font-size = 10 background-color = #d3b5b5 is-default = true + border = sunken saved-params = "command" - elem "say" + elem "saybutton" type = BUTTON pos = 600,420 - size = 37x20 + size = 40x20 anchor1 = 100,100 anchor2 = none saved-params = "is-checked" text = "Chat" - command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"" - is-flat = true + command = ".winset \"saybutton.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"\"saybutton.is-checked=true ? mebutton.is-checked=false\"\"saybutton.is-checked=true ? oocbutton.is-checked=false\"" + button-type = pushbox + elem "oocbutton" + type = BUTTON + pos = 520,420 + size = 40x20 + anchor1 = 100,100 + anchor2 = none + saved-params = "is-checked" + text = "OOC" + command = ".winset \"oocbutton.is-checked=true ? input.command=\"!ooc \\\"\" : input.command=\"\"oocbutton.is-checked=true ? mebutton.is-checked=false\"\"oocbutton.is-checked=true ? saybutton.is-checked=false\"" + button-type = pushbox + elem "mebutton" + type = BUTTON + pos = 560,420 + size = 40x20 + anchor1 = 100,100 + anchor2 = none + saved-params = "is-checked" + text = "Me" + command = ".winset \"mebutton.is-checked=true ? input.command=\"!me \\\"\" : input.command=\"\"mebutton.is-checked=true ? saybutton.is-checked=false\"\"mebutton.is-checked=true ? oocbutton.is-checked=false\"" button-type = pushbox elem "asset_cache_browser" type = BROWSER @@ -249,3 +267,4 @@ window "statwindow" anchor2 = 100,100 is-default = true saved-params = "" + diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index e22c35a6c4..cdf6df2dab 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -81,6 +81,7 @@ h1.alert, h2.alert {color: #000000;} .unconscious {color: #0000ff; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} .green {color: #03ff39;} +.nicegreen {color: #14a833;} .shadowling {color: #3b2769;} .cult {color: #960000;} .cultlarge {color: #960000; font-weight: bold; font-size: 3;} diff --git a/modular_citadel/cit_medkits.dm b/modular_citadel/cit_medkits.dm index 217c69f068..c01ba07573 100644 --- a/modular_citadel/cit_medkits.dm +++ b/modular_citadel/cit_medkits.dm @@ -1,7 +1,6 @@ //help I have no idea what I'm doing /obj/item/storage/firstaid - ..() icon = 'modular_citadel/icons/firstaid.dmi' /obj/item/storage/firstaid/Initialize(mapload) @@ -9,7 +8,6 @@ icon_state = pick("[initial(icon_state)]","[initial(icon_state)]2","[initial(icon_state)]3","[initial(icon_state)]4") /obj/item/storage/firstaid/fire - ..() icon_state = "burn" /obj/item/storage/firstaid/fire/Initialize(mapload) @@ -17,7 +15,6 @@ icon_state = pick("[initial(icon_state)]","[initial(icon_state)]2","[initial(icon_state)]3","[initial(icon_state)]4") /obj/item/storage/firstaid/toxin - ..() icon_state = "toxin" /obj/item/storage/firstaid/toxin/Initialize(mapload) @@ -25,11 +22,9 @@ icon_state = pick("[initial(icon_state)]","[initial(icon_state)]2","[initial(icon_state)]3","[initial(icon_state)]4") /obj/item/storage/firstaid/o2 - ..() icon_state = "oxy" /obj/item/storage/firstaid/tactical - ..() icon_state = "tactical" /obj/item/storage/minifirstaid diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm index 818f363902..5bb1f82c10 100644 --- a/modular_citadel/cit_screenshake.dm +++ b/modular_citadel/cit_screenshake.dm @@ -46,17 +46,17 @@ /obj/item/attack(mob/living/M, mob/living/user) . = ..() - if(force && force >=15) + if(force >= 15) shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01)) if(M.client) switch (M.client.prefs.damagescreenshake) if (1) shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) if (2) - if (M.IsKnockdown()) + if (!M.canmove) shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) /obj/item/attack_obj(obj/O, mob/living/user) . = ..() - if(force && force >= 20) + if(force >= 20) shake_camera(user, ((force - 15) * 0.01 + 1), ((force - 15) * 0.01)) diff --git a/modular_citadel/cit_turfs.dm b/modular_citadel/cit_turfs.dm index 76b9a8f178..582552b83b 100644 --- a/modular_citadel/cit_turfs.dm +++ b/modular_citadel/cit_turfs.dm @@ -72,11 +72,6 @@ GLOBAL_LIST_INIT(turf_footstep_sounds, list( . = ..() CitDirtify(obj, oldloc)*/ -/mob/living/Move(atom/newloc, direct) - . = ..() - if(. && makesfootstepsounds) - CitFootstep(newloc) - //Baystation-styled tile dirtification. /turf/open/floor/proc/CitDirtify(atom/obj, atom/oldloc) if(prob(50)) diff --git a/modular_citadel/code/__HELPERS/list2list.dm b/modular_citadel/code/__HELPERS/list2list.dm new file mode 100644 index 0000000000..e812b3a1e9 --- /dev/null +++ b/modular_citadel/code/__HELPERS/list2list.dm @@ -0,0 +1,12 @@ +/proc/tg_ui_icon_to_cit_ui(ui_style) + switch(ui_style) + if('icons/mob/screen_plasmafire.dmi') + return 'modular_citadel/icons/ui/screen_plasmafire.dmi' + if('icons/mob/screen_slimecore.dmi') + return 'modular_citadel/icons/ui/screen_slimecore.dmi' + if('icons/mob/screen_operative.dmi') + return 'modular_citadel/icons/ui/screen_operative.dmi' + if('icons/mob/screen_clockwork.dmi') + return 'modular_citadel/icons/ui/screen_clockwork.dmi' + else + return 'modular_citadel/icons/ui/screen_midnight.dmi' diff --git a/modular_citadel/code/_onclick/click.dm b/modular_citadel/code/_onclick/click.dm new file mode 100644 index 0000000000..4746231c59 --- /dev/null +++ b/modular_citadel/code/_onclick/click.dm @@ -0,0 +1,74 @@ +/mob/proc/RightClickOn(atom/A, params) //mostly a copy-paste from ClickOn() + var/list/modifiers = params2list(params) + if(incapacitated(ignore_restraints = 1)) + return + + face_atom(A) + + if(next_move > world.time) // in the year 2000... + return + + if(!modifiers["catcher"] && A.IsObscured()) + return + + if(ismecha(loc)) + var/obj/mecha/M = loc + return M.click_action(A,src,params) + + if(restrained()) + changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow + RestrainedClickOn(A) + return + + if(in_throw_mode) + throw_item(A)//todo: make it plausible to lightly toss items via right-click + return + + var/obj/item/W = get_active_held_item() + + if(W == A) + if(!W.rightclick_attack_self(src)) + W.attack_self(src) + update_inv_hands() + return + + //These are always reachable. + //User itself, current loc, and user inventory + if(DirectAccess(A)) + if(W) + W.rightclick_melee_attack_chain(src, A, params) + else + if(ismob(A)) + changeNext_move(CLICK_CD_MELEE) + if(!AltUnarmedAttack(A)) + UnarmedAttack(A) + return + + //Can't reach anything else in lockers or other weirdness + if(!loc.AllowClick()) + return + + //Standard reach turf to turf or reaching inside storage + if(CanReach(A,W)) + if(W) + W.rightclick_melee_attack_chain(src, A, params) + else + if(ismob(A)) + changeNext_move(CLICK_CD_MELEE) + if(!AltUnarmedAttack(A,1)) + UnarmedAttack(A,1) + else + if(W) + if(!W.altafterattack(A, src, FALSE, params)) + W.afterattack(A, src, FALSE, params) + else + if(!AltRangedAttack(A,params)) + RangedAttack(A,params) + +/mob/proc/AltUnarmedAttack(atom/A, proximity_flag) + if(ismob(A)) + changeNext_move(CLICK_CD_MELEE) + return FALSE + +/mob/proc/AltRangedAttack(atom/A, params) + return FALSE diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm new file mode 100644 index 0000000000..5a193335f3 --- /dev/null +++ b/modular_citadel/code/_onclick/hud/screen_objects.dm @@ -0,0 +1,49 @@ +/obj/screen/mov_intent + icon = 'modular_citadel/icons/ui/screen_midnight.dmi' + +/obj/screen/sprintbutton + name = "toggle sprint" + icon = 'modular_citadel/icons/ui/screen_midnight.dmi' + icon_state = "act_sprint" + layer = ABOVE_HUD_LAYER - 0.1 + +/obj/screen/sprintbutton/Click() + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + H.togglesprint() + +/obj/screen/sprintbutton/proc/insert_witty_toggle_joke_here(mob/living/carbon/human/H) + if(!H) + return + if(H.sprinting) + icon_state = "act_sprint_on" + else + icon_state = "act_sprint" + +/obj/screen/restbutton + name = "rest" + icon = 'modular_citadel/icons/ui/screen_midnight.dmi' + icon_state = "rest" + +/obj/screen/restbutton/Click() + if(isliving(usr)) + var/mob/living/theuser = usr + theuser.lay_down() + +/obj/screen/combattoggle + name = "toggle combat mode" + icon = 'modular_citadel/icons/ui/screen_midnight.dmi' + icon_state = "combat_off" + +/obj/screen/combattoggle/Click() + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + C.toggle_combat_mode() + +/obj/screen/combattoggle/proc/rebasetointerbay(mob/living/carbon/C) + if(!C) + return + if(C.combatmode) + icon_state = "combat" + else + icon_state = "combat_off" diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/modular_citadel/code/_onclick/hud/stamina.dm new file mode 100644 index 0000000000..72cd260f8a --- /dev/null +++ b/modular_citadel/code/_onclick/hud/stamina.dm @@ -0,0 +1,73 @@ +/datum/hud/var/obj/screen/staminas/staminas +/datum/hud/var/obj/screen/staminabuffer/staminabuffer + +/obj/screen/staminas + icon = 'modular_citadel/icons/ui/screen_gen.dmi' + name = "stamina" + icon_state = "stamina0" + screen_loc = ui_stamina + mouse_opacity = 0 + +/mob/living/carbon/human/proc/staminahudamount() + if(stat == DEAD || recoveringstam) + return "staminacrit" + else + switch(hal_screwyhud) + if(1 to 2) + return "staminacrit" + if(5) + return "stamina0" + else + switch(100 - staminaloss) + if(100 to INFINITY) + return "stamina0" + if(80 to 100) + return "stamina1" + if(60 to 80) + return "stamina2" + if(40 to 60) + return "stamina3" + if(20 to 40) + return "stamina4" + if(0 to 20) + return "stamina5" + else + return "stamina6" + +//stam buffer +/obj/screen/staminabuffer + icon = 'modular_citadel/icons/ui/screen_gen.dmi' + name = "stamina buffer" + icon_state = "stambuffer0" + screen_loc = ui_stamina + layer = ABOVE_HUD_LAYER + 0.1 + mouse_opacity = 0 + +/mob/living/carbon/human/proc/staminabufferhudamount() + if(stat == DEAD || recoveringstam) + return "stambuffer7" + else + switch(hal_screwyhud) + if(1 to 2) + return "stambuffer7" + if(5) + return "stambuffer0" + else + var/percentmult = 100/stambuffer + switch(stambuffer*percentmult - bufferedstam*percentmult) + if(95 to INFINITY) + return "stambuffer0" + if(90 to 95) + return "stambuffer1" + if(80 to 90) + return "stambuffer2" + if(60 to 80) + return "stambuffer3" + if(40 to 60) + return "stambuffer4" + if(20 to 40) + return "stambuffer5" + if(5 to 20) + return "stambuffer6" + else + return "stambuffer7" diff --git a/modular_citadel/code/_onclick/item_attack.dm b/modular_citadel/code/_onclick/item_attack.dm new file mode 100644 index 0000000000..b86ddc51be --- /dev/null +++ b/modular_citadel/code/_onclick/item_attack.dm @@ -0,0 +1,25 @@ +/obj/item/proc/rightclick_melee_attack_chain(mob/user, atom/target, params) + if(!pre_altattackby(target, user, params)) //Hey, does this item have special behavior that should override all normal right-click functionality? + if(!target.altattackby(src, user, params)) //Does the target do anything special when we right-click on it? + melee_attack_chain(user, target, params) //Ugh. Lame! I'm filing a legal complaint about the discrimination against the right mouse button! + else + altafterattack(target, user, TRUE, params) + return + +/obj/item/proc/pre_altattackby(atom/A, mob/living/user, params) + return FALSE //return something other than false if you wanna override attacking completely + +/atom/proc/altattackby(obj/item/W, mob/user, params) + return FALSE //return something other than false if you wanna add special right-click behavior to objects. + +/obj/item/proc/rightclick_attack_self(mob/user) + return FALSE + +/obj/item/proc/altafterattack(atom/target, mob/user, proximity_flag, click_parameters) + return FALSE + +/obj/item/proc/getweight() + if(total_mass) + return total_mass + else + return w_class*1.25 diff --git a/modular_citadel/code/_onclick/other_mobs.dm b/modular_citadel/code/_onclick/other_mobs.dm new file mode 100644 index 0000000000..51a5c6c5c3 --- /dev/null +++ b/modular_citadel/code/_onclick/other_mobs.dm @@ -0,0 +1,29 @@ +/mob/living/carbon/human/AltUnarmedAttack(atom/A, proximity) + if(!has_active_hand()) + to_chat(src, "You look at the state of the universe and sigh.") //lets face it, people rarely ever see this message in its intended condition. + return TRUE + + if(!A.alt_attack_hand(src)) + A.attack_hand(src) + return TRUE + return TRUE + +/mob/living/carbon/human/AltRangedAttack(atom/A, params) + if(!has_active_hand()) + to_chat(src, "You ponder your life choices and sigh.") + return TRUE + + if(!incapacitated()) + switch(a_intent) + if(INTENT_HELP) + visible_message("[src] waves to [A].", "You wave to [A].") + if(INTENT_DISARM) + visible_message("[src] shoos away [A].", "You shoo away [A].") + if(INTENT_GRAB) + visible_message("[src] beckons [A] to come.", "You beckon [A] to come.") //This sounds lewder than it actually is. Fuck. + if(INTENT_HARM) + visible_message("[src] shakes [p_their()] fist at [A].", "You shake your fist at [A].") + return TRUE + +/atom/proc/alt_attack_hand(mob/user) + return FALSE diff --git a/modular_citadel/code/datums/status_effects/debuffs.dm b/modular_citadel/code/datums/status_effects/debuffs.dm new file mode 100644 index 0000000000..37669fe94c --- /dev/null +++ b/modular_citadel/code/datums/status_effects/debuffs.dm @@ -0,0 +1,13 @@ +/datum/status_effect/incapacitating/knockdown/on_creation(mob/living/new_owner, set_duration, updating_canmove) + if(iscarbon(new_owner) && isnum(set_duration)) + new_owner.resting = TRUE + new_owner.adjustStaminaLoss(set_duration*0.25) + if(set_duration > 80) + set_duration = set_duration*0.15 + . = ..() + return + else if(updating_canmove) + new_owner.update_canmove() + qdel(src) + else + . = ..() diff --git a/modular_citadel/code/datums/traits/neutral.dm b/modular_citadel/code/datums/traits/neutral.dm new file mode 100644 index 0000000000..2bb9c3a356 --- /dev/null +++ b/modular_citadel/code/datums/traits/neutral.dm @@ -0,0 +1,24 @@ +// Citadel-specific Neutral Traits + +/datum/trait/libido + name = "Nymphomania" + desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual." + value = 0 + gain_text = "You are feeling extra wild." + lose_text = "You don't feel that burning sensation anymore." + +/datum/trait/libido/add() + var/mob/living/M = trait_holder + M.min_arousal = 16 + M.arousal_rate = 3 + +/datum/trait/libido/remove() + var/mob/living/M = trait_holder + M.min_arousal = initial(M.min_arousal) + M.arousal_rate = initial(M.arousal_rate) + +/datum/trait/libido/on_process() + var/mob/living/M = trait_holder + if(M.canbearoused == FALSE) + to_chat(trait_holder, "Having high libido is useless when you can't feel arousal at all!") + qdel(src) diff --git a/code/citadel/icons/areas.dmi b/modular_citadel/code/game/area/areas.dmi similarity index 100% rename from code/citadel/icons/areas.dmi rename to modular_citadel/code/game/area/areas.dmi diff --git a/code/citadel/cit_areas.dm b/modular_citadel/code/game/area/cit_areas.dm similarity index 70% rename from code/citadel/cit_areas.dm rename to modular_citadel/code/game/area/cit_areas.dm index 42879b7408..ae36ed6df5 100644 --- a/code/citadel/cit_areas.dm +++ b/modular_citadel/code/game/area/cit_areas.dm @@ -1,6 +1,6 @@ /area/maintenance/bar name = "Maintenance Bar" - icon = 'code/citadel/icons/areas.dmi' + icon = 'modular_citadel/code/game/area/areas.dmi' icon_state = "maintbar" /area/maintenance/bar/cafe @@ -14,5 +14,5 @@ /area/crew_quarters/cryopod name = "Cryogenics" - icon = 'code/citadel/icons/areas.dmi' + icon = 'modular_citadel/code/game/area/areas.dmi' icon_state = "cryo" \ No newline at end of file diff --git a/modular_citadel/code/game/machinery/cryopod.dm b/modular_citadel/code/game/machinery/cryopod.dm index 81d336bc98..6e57b0169d 100644 --- a/modular_citadel/code/game/machinery/cryopod.dm +++ b/modular_citadel/code/game/machinery/cryopod.dm @@ -396,7 +396,7 @@ if(target == user && world.time - target.client.cryo_warned > 5 * 600)//if we haven't warned them in the last 5 minutes var/caught = FALSE if(target.mind.assigned_role in GLOB.command_positions) - alert("You're a Head of Staff![generic_plsnoleave_message]") + alert("You're a Head of Staff![generic_plsnoleave_message] Be sure to put your locker items back into your locker!") caught = TRUE if(iscultist(target) || is_servant_of_ratvar(target)) to_chat(target, "You're a Cultist![generic_plsnoleave_message]") diff --git a/code/citadel/cit_displaycases.dm b/modular_citadel/code/game/machinery/displaycases.dm similarity index 100% rename from code/citadel/cit_displaycases.dm rename to modular_citadel/code/game/machinery/displaycases.dm diff --git a/modular_citadel/code/game/machinery/firealarm.dm b/modular_citadel/code/game/machinery/firealarm.dm new file mode 100644 index 0000000000..f4da844706 --- /dev/null +++ b/modular_citadel/code/game/machinery/firealarm.dm @@ -0,0 +1,10 @@ +/obj/machinery/firealarm/alt_attack_hand(mob/user) + if(is_interactable() && !user.stat) + var/area/A = get_area(src) + if(istype(A)) + if(A.fire) + reset() + else + alarm() + return TRUE + return FALSE diff --git a/code/citadel/plasmacases.dm b/modular_citadel/code/game/machinery/plasmacases.dm similarity index 100% rename from code/citadel/plasmacases.dm rename to modular_citadel/code/game/machinery/plasmacases.dm diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm index 130c93d854..6905efd88d 100644 --- a/modular_citadel/code/game/machinery/vending.dm +++ b/modular_citadel/code/game/machinery/vending.dm @@ -1,3 +1,106 @@ /obj/machinery/vending/security contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2, /obj/item/device/ssword_kit = 1) - premium = list(/obj/item/coin/antagtoken = 1, /obj/item/device/ssword_kit = 1) \ No newline at end of file + premium = list(/obj/item/coin/antagtoken = 1, /obj/item/device/ssword_kit = 1) + +#define STANDARD_CHARGE 1 +#define CONTRABAND_CHARGE 2 +#define COIN_CHARGE 3 + +/obj/machinery/vending/kink + name = "KinkMate" + desc = "A vending machine for all your unmentionable desires." + icon = 'icons/obj/citvending.dmi' + icon_state = "kink" + product_slogans = "Kinky!;Sexy!;Check me out, big boy!" + vend_reply = "Have fun, you shameless pervert!" + products = list( + /obj/item/clothing/under/maid = 5, + /obj/item/clothing/under/stripper_pink = 5, + /obj/item/clothing/under/stripper_green = 5, + /obj/item/dildo/custom = 5 + ) + contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5, + /obj/item/clothing/neck/petcollar = 5, + /obj/item/clothing/under/mankini = 1, + /obj/item/dildo/flared/huge = 1 + ) + premium = list(/obj/item/device/electropack/shockcollar = 1) + refill_canister = /obj/item/vending_refill/kink +/* +/obj/machinery/vending/nazivend + name = "Nazivend" + desc = "A vending machine containing Nazi German supplies. A label reads: \"Remember the gorrilions lost.\"" + icon = 'icons/obj/citvending.dmi' + icon_state = "nazi" + vend_reply = "SIEG HEIL!" + product_slogans = "Das Vierte Reich wird zuruckkehren!;ENTFERNEN JUDEN!;Billiger als die Juden jemals geben!;Rader auf dem adminbus geht rund und rund.;Warten Sie, warum wir wieder hassen Juden?- *BZZT*" + products = list( + /obj/item/clothing/head/stalhelm = 20, + /obj/item/clothing/head/panzer = 20, + /obj/item/clothing/suit/soldiercoat = 20, + // /obj/item/clothing/under/soldieruniform = 20, + /obj/item/clothing/shoes/jackboots = 20 + ) + contraband = list( + /obj/item/clothing/head/naziofficer = 10, + // /obj/item/clothing/suit/officercoat = 10, + // /obj/item/clothing/under/officeruniform = 10, + /obj/item/clothing/suit/space/hardsuit/nazi = 3, + /obj/item/gun/energy/plasma/MP40k = 4 + ) + premium = list() + + refill_canister = /obj/item/vending_refill/nazi +*/ +/obj/machinery/vending/sovietvend + name = "KomradeVendtink" + desc = "Rodina-mat' zovyot!" + icon = 'icons/obj/citvending.dmi' + icon_state = "soviet" + vend_reply = "The fascist and capitalist svin'ya shall fall, komrade!" + product_slogans = "Quality worth waiting in line for!; Get Hammer and Sickled!; Sosvietsky soyuz above all!; With capitalist pigsky, you would have paid a fortunetink! ; Craftink in Motherland herself!" + products = list( + /obj/item/clothing/under/soviet = 20, + /obj/item/clothing/head/ushanka = 20, + /obj/item/clothing/shoes/jackboots = 20, + /obj/item/clothing/head/squatter_hat = 20, + /obj/item/clothing/under/squatter_outfit = 20, + /obj/item/clothing/under/russobluecamooutfit = 20, + /obj/item/clothing/head/russobluecamohat = 20 + ) + contraband = list( + /obj/item/clothing/under/syndicate/tacticool = 4, + /obj/item/clothing/mask/balaclava = 4, + /obj/item/clothing/suit/russofurcoat = 4, + /obj/item/clothing/head/russofurhat = 4, + /obj/item/clothing/suit/space/hardsuit/soviet = 3, + /obj/item/gun/energy/laser/LaserAK = 4 + ) + premium = list() + + refill_canister = /obj/item/vending_refill/soviet + + +#undef STANDARD_CHARGE +#undef CONTRABAND_CHARGE +#undef COIN_CHARGE + + +/obj/item/vending_refill/kink + machine_name = "KinkMate" + icon = 'modular_citadel/icons/vending_restock.dmi' + icon_state = "refill_kink" + charges = list(8, 5, 0)// of 20 standard, 12 contraband, 0 premium + init_charges = list(8, 5, 0) + +/obj/item/vending_refill/nazi + machine_name = "nazivend" + icon_state = "refill_nazi" + charges = list(33, 13, 0) + init_charges = list(33, 13, 0) + +/obj/item/vending_refill/soviet + machine_name = "sovietvend" + icon_state = "refill_soviet" + charges = list(47, 7, 0) + init_charges = list(47, 7, 0) diff --git a/code/citadel/cit_spawners.dm b/modular_citadel/code/game/objects/effects/spawner/spawners.dm similarity index 100% rename from code/citadel/cit_spawners.dm rename to modular_citadel/code/game/objects/effects/spawner/spawners.dm diff --git a/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/impact.dm new file mode 100644 index 0000000000..20052c3351 --- /dev/null +++ b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -0,0 +1,4 @@ +/obj/effect/projectile/impact/laser/wavemotion + name = "particle impact" + icon = 'modular_citadel/icons/obj/projectiles_impact.dmi' + icon_state = "impact_wavemotion" \ No newline at end of file diff --git a/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm new file mode 100644 index 0000000000..5114cb223e --- /dev/null +++ b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -0,0 +1,4 @@ +/obj/effect/projectile/muzzle/laser/wavemotion + name = "particle backblast" + icon = 'modular_citadel/icons/obj/projectiles_muzzle.dmi' + icon_state = "muzzle_wavemotion" \ No newline at end of file diff --git a/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm new file mode 100644 index 0000000000..8110fcabeb --- /dev/null +++ b/modular_citadel/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -0,0 +1,4 @@ +/obj/effect/projectile/tracer/laser/wavemotion + name = "particle trail" + icon = 'modular_citadel/icons/obj/projectiles_tracer.dmi' + icon_state = "tracer_wavemotion" \ No newline at end of file diff --git a/modular_citadel/code/game/objects/items.dm b/modular_citadel/code/game/objects/items.dm new file mode 100644 index 0000000000..6f44d4b005 --- /dev/null +++ b/modular_citadel/code/game/objects/items.dm @@ -0,0 +1,2 @@ +/obj/item + var/total_mass diff --git a/code/citadel/cit_genemods.dm b/modular_citadel/code/game/objects/items/devices/genemods.dm similarity index 100% rename from code/citadel/cit_genemods.dm rename to modular_citadel/code/game/objects/items/devices/genemods.dm diff --git a/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm b/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm new file mode 100644 index 0000000000..2023c6f326 --- /dev/null +++ b/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm @@ -0,0 +1,21 @@ +/obj/structure/chair/alt_attack_hand(mob/living/user) + if(Adjacent(user) && istype(user)) + if(!item_chair || !user.can_hold_items() || !has_buckled_mobs() || buckled_mobs.len > 1 || dir != user.dir || flags_1 & NODECONSTRUCT_1) + return TRUE + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + to_chat(user, "You can't do that right now!") + return TRUE + if(user.staminaloss >= STAMINA_SOFTCRIT) + to_chat(user, "You're too exhausted for that.") + return TRUE + var/mob/living/poordude = buckled_mobs[1] + if(!istype(poordude)) + return TRUE + user.visible_message("[user] pulls [src] out from under [poordude].", "You pull [src] out from under [poordude].") + var/C = new item_chair(loc) + user.put_in_hands(C) + poordude.Knockdown(20)//rip in peace + user.adjustStaminaLoss(5) + unbuckle_all_mobs(TRUE) + qdel(src) + return TRUE diff --git a/modular_citadel/code/modules/admin/holder2.dm b/modular_citadel/code/modules/admin/holder2.dm index f581de8dfc..143000a0d6 100644 --- a/modular_citadel/code/modules/admin/holder2.dm +++ b/modular_citadel/code/modules/admin/holder2.dm @@ -2,7 +2,6 @@ var/following = null /datum/admins/associate(client/C) - removeMentor(C.ckey) //safety to avoid multiple datums and other weird shit i cannot comprehend ..() if(istype(C)) C.mentor_datum_set(TRUE) diff --git a/modular_citadel/code/modules/admin/topic.dm b/modular_citadel/code/modules/admin/topic.dm index bdd8758882..26bc902bef 100644 --- a/modular_citadel/code/modules/admin/topic.dm +++ b/modular_citadel/code/modules/admin/topic.dm @@ -1,4 +1,8 @@ /datum/admins/proc/citaTopic(href, href_list) + if(href_list["makementor"]) + makeMentor(href_list["makementor"]) + else if(href_list["removementor"]) + removeMentor(href_list["removementor"]) /datum/admins/proc/makeMentor(ckey) if(!usr.client) diff --git a/code/citadel/cit_crewobjectives.dm b/modular_citadel/code/modules/antagonists/cit_crewobjectives.dm similarity index 100% rename from code/citadel/cit_crewobjectives.dm rename to modular_citadel/code/modules/antagonists/cit_crewobjectives.dm diff --git a/code/citadel/cit_miscreants.dm b/modular_citadel/code/modules/antagonists/cit_miscreants.dm similarity index 100% rename from code/citadel/cit_miscreants.dm rename to modular_citadel/code/modules/antagonists/cit_miscreants.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_cargo.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_cargo.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_civilian.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_civilian.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_command.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_command.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_engineering.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_engineering.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_medical.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_medical.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_science.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_science.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm diff --git a/code/citadel/crew_objectives/cit_crewobjectives_security.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm similarity index 100% rename from code/citadel/crew_objectives/cit_crewobjectives_security.dm rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm diff --git a/code/citadel/cit_arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm similarity index 99% rename from code/citadel/cit_arousal.dm rename to modular_citadel/code/modules/arousal/arousal.dm index 077824fe9e..584acc6eb6 100644 --- a/code/citadel/cit_arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -142,7 +142,7 @@ /obj/screen/arousal name = "arousal" icon_state = "arousal0" - icon = 'code/citadel/icons/hud.dmi' + icon = 'modular_citadel/icons/obj/genitals/hud.dmi' screen_loc = ui_arousal /obj/screen/arousal/Click() diff --git a/code/citadel/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm similarity index 96% rename from code/citadel/organs/breasts.dm rename to modular_citadel/code/modules/arousal/organs/breasts.dm index 901c546212..ea44c6d671 100644 --- a/code/citadel/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -2,7 +2,7 @@ name = "breasts" desc = "Female milk producing organs." icon_state = "breasts" - icon = 'code/citadel/icons/breasts.dmi' + icon = 'modular_citadel/icons/obj/genitals/breasts.dmi' zone = "chest" slot = "breasts" w_class = 3 diff --git a/code/citadel/organs/eggsack.dm b/modular_citadel/code/modules/arousal/organs/eggsack.dm similarity index 87% rename from code/citadel/organs/eggsack.dm rename to modular_citadel/code/modules/arousal/organs/eggsack.dm index 1486310d61..27104cd36a 100644 --- a/code/citadel/organs/eggsack.dm +++ b/modular_citadel/code/modules/arousal/organs/eggsack.dm @@ -2,7 +2,7 @@ name = "Egg sack" desc = "An egg producing reproductive organ." icon_state = "egg_sack" - icon = 'code/citadel/icons/ovipositor.dmi' + icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi' zone = "groin" slot = "testicles" color = null //don't use the /genital color since it already is colored diff --git a/code/citadel/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm similarity index 100% rename from code/citadel/organs/genitals.dm rename to modular_citadel/code/modules/arousal/organs/genitals.dm diff --git a/code/citadel/organs/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm similarity index 83% rename from code/citadel/organs/genitals_sprite_accessories.dm rename to modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm index 710bab787c..7c02b1c3a5 100644 --- a/code/citadel/organs/genitals_sprite_accessories.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm @@ -4,7 +4,7 @@ //DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM /datum/sprite_accessory/penis - icon = 'code/citadel/icons/penis_onmob.dmi' + icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi' icon_state = null name = "penis" //the preview name of the accessory gender_specific = 0 //Might be needed somewhere down the list. @@ -35,21 +35,21 @@ // Taur cocks go here // //////////////////////// /datum/sprite_accessory/penis/taur_flared - icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width + icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width icon_state = "flared" name = "Taur, Flared" center = TRUE //Center the image 'cause 2-tile wide. dimension_x = 64 /datum/sprite_accessory/penis/taur_knotted - icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width + icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width icon_state = "knotted" name = "Taur, Knotted" center = TRUE //Center the image 'cause 2-tile wide. dimension_x = 64 /datum/sprite_accessory/penis/taur_tapered - icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width + icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width icon_state = "tapered" name = "Taur, Tapered" center = TRUE //Center the image 'cause 2-tile wide. @@ -60,7 +60,7 @@ //Vaginas /datum/sprite_accessory/vagina - icon = 'code/citadel/icons/vagina_onmob.dmi' + icon = 'modular_citadel/icons/obj/genitals/vagina_onmob.dmi' icon_state = null name = "vagina" gender_specific = 0 @@ -90,7 +90,7 @@ //BREASTS BE HERE /datum/sprite_accessory/breasts - icon = 'code/citadel/icons/breasts_onmob.dmi' + icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi' icon_state = null name = "breasts" gender_specific = 0 @@ -104,7 +104,7 @@ //OVIPOSITORS BE HERE /datum/sprite_accessory/ovipositor - icon = 'code/citadel/icons/penis_onmob.dmi' + icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi' icon_state = null name = "Ovipositor" //the preview name of the accessory gender_specific = 0 //Might be needed somewhere down the list. diff --git a/code/citadel/organs/ovipositor.dm b/modular_citadel/code/modules/arousal/organs/ovipositor.dm similarity index 88% rename from code/citadel/organs/ovipositor.dm rename to modular_citadel/code/modules/arousal/organs/ovipositor.dm index 3d684ee387..76bf60d93c 100644 --- a/code/citadel/organs/ovipositor.dm +++ b/modular_citadel/code/modules/arousal/organs/ovipositor.dm @@ -2,7 +2,7 @@ name = "Ovipositor" desc = "An egg laying reproductive organ." icon_state = "ovi_knotted_2" - icon = 'code/citadel/icons/ovipositor.dmi' + icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi' zone = "groin" slot = "penis" w_class = 3 diff --git a/code/citadel/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm similarity index 97% rename from code/citadel/organs/penis.dm rename to modular_citadel/code/modules/arousal/organs/penis.dm index 509ed72ef4..ae58aabf51 100644 --- a/code/citadel/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -2,7 +2,7 @@ name = "penis" desc = "A male reproductive organ." icon_state = "penis" - icon = 'code/citadel/icons/penis.dmi' + icon = 'modular_citadel/icons/obj/genitals/penis.dmi' zone = "groin" slot = "penis" w_class = 3 diff --git a/code/citadel/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm similarity index 96% rename from code/citadel/organs/testicles.dm rename to modular_citadel/code/modules/arousal/organs/testicles.dm index bb3ade6048..815d8034e7 100644 --- a/code/citadel/organs/testicles.dm +++ b/modular_citadel/code/modules/arousal/organs/testicles.dm @@ -2,7 +2,7 @@ name = "testicles" desc = "A male reproductive organ." icon_state = "testicles" - icon = 'code/citadel/icons/penis.dmi' + icon = 'modular_citadel/icons/obj/genitals/penis.dmi' zone = "groin" slot = "testicles" w_class = 3 diff --git a/code/citadel/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm similarity index 97% rename from code/citadel/organs/vagina.dm rename to modular_citadel/code/modules/arousal/organs/vagina.dm index 1f19dc7e64..4d9eedb1cf 100644 --- a/code/citadel/organs/vagina.dm +++ b/modular_citadel/code/modules/arousal/organs/vagina.dm @@ -1,7 +1,7 @@ /obj/item/organ/genital/vagina name = "vagina" desc = "A female reproductive organ." - icon = 'code/citadel/icons/vagina.dmi' + icon = 'modular_citadel/icons/obj/genitals/vagina.dmi' icon_state = "vagina" zone = "groin" slot = "vagina" diff --git a/code/citadel/organs/womb.dm b/modular_citadel/code/modules/arousal/organs/womb.dm similarity index 94% rename from code/citadel/organs/womb.dm rename to modular_citadel/code/modules/arousal/organs/womb.dm index 433f005623..c59d74e629 100644 --- a/code/citadel/organs/womb.dm +++ b/modular_citadel/code/modules/arousal/organs/womb.dm @@ -1,7 +1,7 @@ /obj/item/organ/genital/womb name = "womb" desc = "A female reproductive organ." - icon = 'code/citadel/icons/vagina.dmi' + icon = 'modular_citadel/icons/obj/genitals/vagina.dmi' icon_state = "womb" zone = "groin" slot = "womb" diff --git a/code/citadel/toys/dildos.dm b/modular_citadel/code/modules/arousal/toys/dildos.dm similarity index 98% rename from code/citadel/toys/dildos.dm rename to modular_citadel/code/modules/arousal/toys/dildos.dm index d216ed86ba..45f4f5a64a 100644 --- a/code/citadel/toys/dildos.dm +++ b/modular_citadel/code/modules/arousal/toys/dildos.dm @@ -4,7 +4,7 @@ obj/item/dildo name = "dildo" desc = "Floppy!" - icon = 'code/citadel/icons/dildo.dmi' + icon = 'modular_citadel/icons/obj/genitals/dildo.dmi' damtype = BRUTE force = 0 throwforce = 0 diff --git a/modular_citadel/code/modules/client/client_procs.dm b/modular_citadel/code/modules/client/client_procs.dm index 5bb53ee0f2..511aac0738 100644 --- a/modular_citadel/code/modules/client/client_procs.dm +++ b/modular_citadel/code/modules/client/client_procs.dm @@ -12,3 +12,11 @@ /client/proc/is_mentor() // admins are mentors too. if(mentor_datum || check_rights_for(src, R_ADMIN,0)) return TRUE + +/client/verb/togglerightclickstuff() + set category = "OOC" + set name = "Toggle Rightclick" + set desc = "Did the context menu get stuck on or off? Press this button." + + show_popup_menus = !show_popup_menus + to_chat(src, "The right-click context menu is now [show_popup_menus ? "enabled" : "disabled"].") diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 577f41ea77..69015b064d 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -198,9 +198,27 @@ category = slot_wear_suit path = /obj/item/clothing/under/gladiator ckeywhitelist = list("aroche") - + /datum/gear/bloodredtie name = "Blood Red Tie" category = slot_neck path = /obj/item/clothing/neck/tie/bloodred ckeywhitelist = list("kyutness") + +/datum/gear/puffydress + name = "Puffy Dress" + category = slot_wear_suit + path = /obj/item/clothing/suit/puffydress + //ckeywhitelist = //Don't know their ckey yet + +/datum/gear/labredblack + name = "Black and Red Coat" + category = slot_wear_suit + path = /obj/item/clothing/suit/toggle/labcoat/labredblack + ckeywhitelist = list("blakeryan") + + + + + + diff --git a/modular_citadel/code/modules/client/loadout/uniform_trek.dm b/modular_citadel/code/modules/client/loadout/uniform_trek.dm new file mode 100644 index 0000000000..dd03d3c446 --- /dev/null +++ b/modular_citadel/code/modules/client/loadout/uniform_trek.dm @@ -0,0 +1,156 @@ +// Trekie things +//TOS +/datum/gear/uniform/job_trek/cmd/tos + name = "TOS uniform, cmd" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/command + restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster") + +/datum/gear/uniform/job_trek/medsci/tos + name = "TOS uniform, med/sci" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/medsci + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + +/datum/gear/uniform/job_trek/eng/tos + name = "TOS uniform, ops/sec" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/engsec + restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") + +//Federation jackets from movies +/datum/gear/uniform/job_trek/cmd/cap + name = "fed (movie) uniform, Captain" + category = slot_wear_suit + path = /obj/item/clothing/suit/storage/fluff/fedcoat/capt + restricted_roles = list("Captain","Head of Personnel") + +/datum/gear/uniform/job_trek/cmd/mov + name = "fed (movie) uniform, sec" + category = slot_wear_suit + path = /obj/item/clothing/suit/storage/fluff/fedcoat + restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster","Warden","Detective","Security Officer") + +/datum/gear/suit/job_trek/medsci/mov + name = "fed (movie) uniform, med/sci" + category = slot_wear_suit + path = /obj/item/clothing/suit/storage/fluff/fedcoat/medsci + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + +/datum/gear/suit/job_trek/eng/mov + name = "fed (movie) uniform, ops/eng" + category = slot_wear_suit + path = /obj/item/clothing/suit/storage/fluff/fedcoat/eng + restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Cargo Technician", "Shaft Miner", "Quartermaster") + +//TNG +/datum/gear/uniform/job_trek/cmd/tng + name = "TNG uniform, cmd" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/command/next + restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster") + +/datum/gear/uniform/job_trek/medsci/tng + name = "TNG uniform, med/sci" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/medsci/next + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + +/datum/gear/uniform/job_trek/eng/tng + name = "TNG uniform, ops/sec" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/engsec/next + restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") + +//VOY +/datum/gear/uniform/job_trek/cmd/voy + name = "VOY uniform, cmd" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/command/voy + restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster") + +/datum/gear/uniform/job_trek/medsci/voy + name = "VOY uniform, med/sci" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/medsci/voy + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + +/datum/gear/uniform/job_trek/eng/voy + name = "VOY uniform, ops/sec" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/engsec/voy + restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") + +//DS9 + +/datum/gear/suit/job_trek/ds9_coat + name = "DS9 Overcoat (use uniform)" + category = slot_wear_suit + path = /obj/item/clothing/suit/storage/trek/ds9 + restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster", + "Medical Doctor","Chemist","Virologist","Geneticist","Scientist", "Roboticist", + "Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer", + "Cargo Technician", "Shaft Miner") //everyone who actually deserves a job. + +/datum/gear/uniform/job_trek/cmd/ds9 + name = "DS9 uniform, cmd" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/command/ds9 + restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster") + +/datum/gear/uniform/job_trek/medsci/ds9 + name = "DS9 uniform, med/sci" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/medsci/ds9 + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + +/datum/gear/uniform/job_trek/eng/ds9 + name = "DS9 uniform, ops/sec" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/engsec/ds9 + restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") + + +//ENT +/datum/gear/uniform/job_trek/cmd/ent + name = "ENT uniform, cmd" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/command/ent + restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster") + +/datum/gear/uniform/job_trek/medsci/ent + name = "ENT uniform, med/sci" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/medsci/ent + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + +/datum/gear/uniform/job_trek/eng/ent + name = "ENT uniform, ops/sec" + category = slot_w_uniform + path = /obj/item/clothing/under/rank/trek/engsec/ent + restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") + +//Hats! +/datum/gear/hat/job_trek/cap + name = "Federation Officer's Cap" + category = slot_head + path = /obj/item/clothing/head/caphat/formal/fedcover + restricted_roles = list("Captain","Head of Personnel") + +/datum/gear/hat/job_trek/cap/medisci + name = "Federation Officer's Cap" + category = slot_head + path = /obj/item/clothing/head/caphat/formal/fedcover/medsci + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + +/datum/gear/hat/job_trek/cap/eng + name = "Federation Officer's Cap" + category = slot_head + path = /obj/item/clothing/head/caphat/formal/fedcover/eng + restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") + +/datum/gear/hat/job_trek/cap/sec + name = "Federation Officer's Cap" + category = slot_head + path = /obj/item/clothing/head/caphat/formal/fedcover/sec + restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") \ No newline at end of file diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm index 1e12ae5c86..4d1fc880d7 100644 --- a/modular_citadel/code/modules/client/preferences.dm +++ b/modular_citadel/code/modules/client/preferences.dm @@ -11,6 +11,7 @@ var/damagescreenshake = 2 var/arousable = TRUE var/widescreenpref = TRUE + var/autostand = TRUE /datum/preferences/New(client/C) ..() diff --git a/modular_citadel/code/modules/client/preferences_toggles.dm b/modular_citadel/code/modules/client/preferences_toggles.dm new file mode 100644 index 0000000000..a475d65106 --- /dev/null +++ b/modular_citadel/code/modules/client/preferences_toggles.dm @@ -0,0 +1,36 @@ +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleeatingnoise)() + set name = "Toggle Eating Noises" + set category = "Preferences" + set desc = "Hear Eating noises" + usr.client.prefs.toggles ^= EATING_NOISES + usr.client.prefs.save_preferences() + usr.stop_sound_channel(CHANNEL_PRED) + to_chat(usr, "You will [(usr.client.prefs.toggles & EATING_NOISES) ? "now" : "no longer"] hear eating noises.") +/datum/verbs/menu/Settings/Sound/toggleeatingnoise/Get_checked(client/C) + return !(C.prefs.toggles & EATING_NOISES) + + +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggledigestionnoise)() + set name = "Toggle Digestion Noises" + set category = "Preferences" + set desc = "Hear digestive noises" + usr.client.prefs.toggles ^= DIGESTION_NOISES + usr.client.prefs.save_preferences() + usr.stop_sound_channel(CHANNEL_DIGEST) + to_chat(usr, "You will [(usr.client.prefs.toggles & DIGESTION_NOISES) ? "now" : "no longer"] hear digestion noises.") +/datum/verbs/menu/Settings/Sound/toggledigestionnoise/Get_checked(client/C) + return !(C.prefs.toggles & DIGESTION_NOISES) + +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglehoundsleeper)() + set name = "Allow/Deny Hound Sleeper" + set category = "Preferences" + set desc = "Allow MediHound Sleepers" + usr.client.prefs.toggles ^= MEDIHOUND_SLEEPER + usr.client.prefs.save_preferences() + if(usr.client.prefs.toggles & MEDIHOUND_SLEEPER) + to_chat(usr, "You will now allow MediHounds to place you in their sleeper.") + else + to_chat(usr, "You will no longer allow MediHounds to place you in their sleeper.") + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle MediHound Sleeper", "[usr.client.prefs.toggles & MEDIHOUND_SLEEPER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/verbs/menu/Settings/Sound/togglehoundsleeper/Get_checked(client/C) + return C.prefs.toggles & MEDIHOUND_SLEEPER \ No newline at end of file diff --git a/modular_citadel/code/modules/clothing/suits/suits.dm b/modular_citadel/code/modules/clothing/suits/suits.dm new file mode 100644 index 0000000000..776da896bd --- /dev/null +++ b/modular_citadel/code/modules/clothing/suits/suits.dm @@ -0,0 +1,13 @@ +/*///////////////////////////////////////////////////////////////////////////////// +/////// /////// +/////// Cit's exclusive suits, armor, etc. go here /////// +/////// /////// +*////////////////////////////////////////////////////////////////////////////////// + + +/obj/item/clothing/suit/armor/hos/trenchcoat/cloak + name = "armored trenchcloak" + desc = "A trenchcoat enchanced with a special lightweight kevlar. This one appears to be designed to be draped over one's shoulders rather than worn normally.." + alternate_worn_icon = 'icons/mob/citadel/suit.dmi' + icon_state = "hostrench" + item_state = "hostrench" \ No newline at end of file diff --git a/modular_citadel/code/modules/clothing/under.dm b/modular_citadel/code/modules/clothing/under.dm deleted file mode 100644 index bf77704122..0000000000 --- a/modular_citadel/code/modules/clothing/under.dm +++ /dev/null @@ -1,7 +0,0 @@ -/obj/item/clothing/under/syndicate/cosmetic - name = "tactitool turtleneck" - desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." - icon_state = "tactifool" - item_state = "bl_suit" - item_color = "tactifool" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) \ No newline at end of file diff --git a/modular_citadel/code/modules/clothing/under/trek_under.dm b/modular_citadel/code/modules/clothing/under/trek_under.dm new file mode 100644 index 0000000000..60276325cb --- /dev/null +++ b/modular_citadel/code/modules/clothing/under/trek_under.dm @@ -0,0 +1,257 @@ +/*///////////////////////////////////////////////////////////////////////////////// +/////// /////// +/////// Star Trek Stuffs /////// +/////// /////// +*////////////////////////////////////////////////////////////////////////////////// +// <3 Nienhaus && Joan. +// I made the Voy and DS9 stuff tho. - Poojy + + + +/obj/item/clothing/under/rank/trek + name = "Section 31 Uniform" + desc = "Oooh... right." + icon = 'modular_citadel/icons/mob/clothing/trek_item_icon.dmi' + icon_override = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' + item_state = "" + can_adjust = FALSE //to prevent you from "wearing it casually" + +//TOS +/obj/item/clothing/under/rank/trek/command + name = "Command Uniform" + desc = "The uniform worn by command officers in the mid 2260s." + icon_state = "trek_command" + item_state = "trek_command" + armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 0) // Considering only staff heads get to pick it + +/obj/item/clothing/under/rank/trek/engsec + name = "Operations Uniform" + desc = "The uniform worn by operations officers of the mid 2260s. You feel strangely vulnerable just seeing this..." + icon_state = "trek_engsec" + item_state = "trek_engsec" + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 10, "acid" = 0) // since they're shared between jobs and kinda moot. + +/obj/item/clothing/under/rank/trek/medsci + name = "MedSci Uniform" + desc = "The uniform worn by medsci officers in the mid 2260s." + icon_state = "trek_medsci" + item_state = "trek_medsci" + permeability_coefficient = 0.50 + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 10) // basically a copy of vanilla sci/med + +//TNG +/obj/item/clothing/under/rank/trek/command/next + desc = "The uniform worn by command officers. This one's from the mid 2360s." + icon_state = "trek_next_command" + item_state = "trek_next_command" + +/obj/item/clothing/under/rank/trek/engsec/next + desc = "The uniform worn by operation officers. This one's from the mid 2360s." + icon_state = "trek_next_engsec" + item_state = "trek_next_engsec" + +/obj/item/clothing/under/rank/trek/medsci/next + desc = "The uniform worn by medsci officers. This one's from the mid 2360s." + icon_state = "trek_next_medsci" + item_state = "trek_next_medsci" + +//ENT +/obj/item/clothing/under/rank/trek/command/ent + desc = "The uniform worn by command officers of the 2140s." + icon_state = "trek_ent_command" + item_state = "trek_ent_command" + +/obj/item/clothing/under/rank/trek/engsec/ent + desc = "The uniform worn by operations officers of the 2140s." + icon_state = "trek_ent_engsec" + item_state = "trek_ent_engsec" + +/obj/item/clothing/under/rank/trek/medsci/ent + desc = "The uniform worn by medsci officers of the 2140s." + icon_state = "trek_ent_medsci" + item_state = "trek_ent_medsci" + +//VOY +/obj/item/clothing/under/rank/trek/command/voy + desc = "The uniform worn by command officers of the 2370s." + icon_state = "trek_voy_command" + item_state = "trek_voy_command" + +/obj/item/clothing/under/rank/trek/engsec/voy + desc = "The uniform worn by operations officers of the 2370s." + icon_state = "trek_voy_engsec" + item_state = "trek_voy_engsec" + +/obj/item/clothing/under/rank/trek/medsci/voy + desc = "The uniform worn by medsci officers of the 2370s." + icon_state = "trek_voy_medsci" + item_state = "trek_voy_medsci" + +//DS9 + +/obj/item/clothing/suit/storage/trek/ds9 + name = "Padded Overcoat" + desc = "The overcoat worn by all officers of the 2380s." + icon = 'modular_citadel/icons/mob/clothing/trek_item_icon.dmi' + icon_state = "trek_ds9_coat" + icon_override = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' + item_state = "trek_ds9_coat" + body_parts_covered = CHEST|GROIN|ARMS + permeability_coefficient = 0.50 + allowed = list( + /obj/item/device/flashlight, /obj/item/device/analyzer, + /obj/item/device/radio, /obj/item/tank/internals/emergency_oxygen, + /obj/item/reagent_containers/hypospray, /obj/item/device/healthanalyzer,/obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/glass/bottle/vial,/obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle, /obj/item/restraints/handcuffs + ) + armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0) + +/obj/item/clothing/suit/storage/trek/ds9/admiral // Only for adminuz + name = "Admiral Overcoat" + desc = "Admirality specialty coat to keep flag officers fashionable and protected." + icon_state = "trek_ds9_coat_adm" + item_state = "trek_ds9_coat_adm" + permeability_coefficient = 0.01 + armor = list("melee" = 50, "bullet" = 50, "laser" = 50,"energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 50, "acid" = 50) + +/obj/item/clothing/under/rank/trek/command/ds9 + desc = "The uniform worn by command officers of the 2380s." + icon_state = "trek_command" + item_state = "trek_ds9_command" + +/obj/item/clothing/under/rank/trek/engsec/ds9 + desc = "The uniform worn by operations officers of the 2380s." + icon_state = "trek_engsec" + item_state = "trek_ds9_engsec" + +/obj/item/clothing/under/rank/trek/medsci/ds9 + desc = "The uniform undershirt worn by medsci officers of the 2380s." + icon_state = "trek_medsci" + item_state = "trek_ds9_medsci" + +//MODERN ish Joan sqrl sprites. I think + +//For general use +/obj/item/clothing/suit/storage/fluff/fedcoat + name = "Federation Uniform Jacket (Red)" + desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Set phasers to awesome." + + icon = 'modular_citadel/icons/mob/clothing/trek_item_icon.dmi' + icon_override = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' + icon_state = "fedcoat" + item_state = "fedcoat" + + blood_overlay_type = "coat" + body_parts_covered = CHEST|GROIN|ARMS + allowed = list( + /obj/item/tank/internals/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/device/analyzer, + /obj/item/device/radio, + /obj/item/gun, + /obj/item/melee/baton, + /obj/item/restraints/handcuffs, + /obj/item/reagent_containers/hypospray, + /obj/item/device/healthanalyzer, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/glass/bottle/vial, + /obj/item/reagent_containers/glass/beaker, + /obj/item/storage/pill_bottle, + /obj/item/device/taperecorder) + armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0) + var/unbuttoned = 0 + + verb/toggle() + set name = "Toggle coat buttons" + set category = "Object" + set src in usr + + if(!usr.canmove || usr.stat || usr.restrained()) + return 0 + + switch(unbuttoned) + if(0) + icon_state = "[initial(icon_state)]_open" + item_state = "[initial(item_state)]_open" + unbuttoned = 1 + usr << "You unbutton the coat." + if(1) + icon_state = "[initial(icon_state)]" + item_state = "[initial(item_state)]" + unbuttoned = 0 + usr << "You button up the coat." + usr.update_inv_wear_suit() + + //Variants +/obj/item/clothing/suit/storage/fluff/fedcoat/medsci + desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Wearing this may make you feel all scientific." + icon_state = "fedblue" + item_state = "fedblue" + +/obj/item/clothing/suit/storage/fluff/fedcoat/eng + desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it.Wearing it may make you feel like checking a warp core, whatever that is." + icon_state = "fedeng" + item_state = "fedeng" + +/obj/item/clothing/suit/storage/fluff/fedcoat/capt + desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. You feel like a commanding officer of Starfleet." + icon_state = "fedcapt" + item_state = "fedcapt" + +//"modern" ones for fancy + +/obj/item/clothing/suit/storage/fluff/modernfedcoat + name = "Modern Federation Uniform Jacket" + desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a competant commander." + icon = 'modular_citadel/icons/mob/clothing/trek_item_icon.dmi' + icon_override = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' + icon_state = "fedmodern" + item_state = "fedmodern" + body_parts_covered = CHEST|GROIN|ARMS + allowed = list( + /obj/item/tank/internals/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/gun, + /obj/item/melee/baton, + /obj/item/restraints/handcuffs, + /obj/item/device/taperecorder) + armor = list("melee" = 45, "bullet" = 25, "laser" = 25,"energy" = 25, "bomb" = 25, "bio" = 25, "rad" = 50, "fire" = 50, "acid" = 50) + + //Variants +/obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci + desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a scientist or a pilot." + icon_state = "fedmodernblue" + item_state = "fedmodernblue" + +/obj/item/clothing/suit/storage/fluff/modernfedcoat/eng + desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. You feel like you can handle any type of technical engineering problems." + icon_state = "fedmoderneng" + item_state = "fedmoderneng" + +/obj/item/clothing/suit/storage/fluff/modernfedcoat/sec + desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. This uniform makes you want to protect and serve as an officer." + icon_state = "fedmodernsec" + item_state = "fedmodernsec" + +/obj/item/clothing/head/caphat/formal/fedcover + name = "Federation Officer's Cap" + desc = "An officer's cap that demands discipline from the one who wears it." + icon = 'modular_citadel/icons/mob/clothing/trek_item_icon.dmi' + icon_state = "fedcapofficer" + icon_override = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' + item_state = "fedcapofficer_mob" + armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 0) + + //Variants +/obj/item/clothing/head/caphat/formal/fedcover/medsci + icon_state = "fedcapsci" + item_state = "fedcapsci_mob" + +/obj/item/clothing/head/caphat/formal/fedcover/eng + icon_state = "fedcapeng" + item_state = "fedcapeng_mob" + +/obj/item/clothing/head/caphat/formal/fedcover/sec + icon_state = "fedcapsec" + item_state = "fedcapsec_mob" \ No newline at end of file diff --git a/modular_citadel/code/modules/clothing/under/turtlenecks.dm b/modular_citadel/code/modules/clothing/under/turtlenecks.dm index 47432d87f7..2f40a08dc3 100644 --- a/modular_citadel/code/modules/clothing/under/turtlenecks.dm +++ b/modular_citadel/code/modules/clothing/under/turtlenecks.dm @@ -19,4 +19,59 @@ /obj/structure/closet/secure_closet/CMO/PopulateContents() //This is placed here because it's a very specific addition for a very specific niche ..() - new /obj/item/clothing/under/rank/chief_medical_officer/turtleneck(src) \ No newline at end of file + new /obj/item/clothing/under/rank/chief_medical_officer/turtleneck(src) + +/obj/item/clothing/under/syndicate/cosmetic + name = "tactitool turtleneck" + desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." + icon_state = "tactifool" + item_state = "bl_suit" + item_color = "tactifool" + has_sensor = TRUE + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) + +/obj/item/clothing/under/syndicate/tacticool + has_sensor = TRUE + +// Sweaters are good enough for this category too. + +/obj/item/clothing/under/bb_sweater + name = "cream sweater" + desc = "Why trade style for comfort? Now you can go commando down south and still be cozy up north." + icon_state = "bb_turtle" + item_state = "w_suit" + item_color = "bb_turtle" + body_parts_covered = CHEST|ARMS + can_adjust = 1 + icon = 'icons/obj/clothing/turtlenecks.dmi' + icon_override = 'icons/mob/citadel/uniforms.dmi' + +/obj/item/clothing/under/bb_sweater/black + name = "black sweater" + icon_state = "bb_turtleblk" + item_state = "bl_suit" + item_color = "bb_turtleblk" + +/obj/item/clothing/under/bb_sweater/purple + name = "purple sweater" + icon_state = "bb_turtlepur" + item_state = "p_suit" + item_color = "bb_turtlepur" + +/obj/item/clothing/under/bb_sweater/green + name = "green sweater" + icon_state = "bb_turtlegrn" + item_state = "g_suit" + item_color = "bb_turtlegrn" + +/obj/item/clothing/under/bb_sweater/red + name = "red sweater" + icon_state = "bb_turtlered" + item_state = "r_suit" + item_color = "bb_turtlered" + +/obj/item/clothing/under/bb_sweater/blue + name = "blue sweater" + icon_state = "bb_turtleblu" + item_state = "b_suit" + item_color = "bb_turtleblu" diff --git a/code/citadel/cit_clothes.dm b/modular_citadel/code/modules/clothing/under/under.dm similarity index 72% rename from code/citadel/cit_clothes.dm rename to modular_citadel/code/modules/clothing/under/under.dm index dd83c6b769..042273ac6a 100644 --- a/code/citadel/cit_clothes.dm +++ b/modular_citadel/code/modules/clothing/under/under.dm @@ -21,11 +21,4 @@ icon_state = "hosskirt" icon_override = 'icons/mob/citadel/uniforms.dmi' item_state = "gy_suit" - item_color = "hosskirt" - -/obj/item/clothing/suit/armor/hos/trenchcoat/cloak - name = "armored trenchcloak" - desc = "A trenchcoat enchanced with a special lightweight kevlar. This one appears to be designed to be draped over one's shoulders rather than worn normally.." - alternate_worn_icon = 'icons/mob/citadel/suit.dmi' - icon_state = "hostrench" - item_state = "hostrench" \ No newline at end of file + item_color = "hosskirt" \ No newline at end of file diff --git a/code/citadel/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm similarity index 94% rename from code/citadel/custom_loadout/custom_items.dm rename to modular_citadel/code/modules/custom_loadout/custom_items.dm index a74ddd023c..8001d71874 100644 --- a/code/citadel/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -85,6 +85,15 @@ item_state = "labred" +/obj/item/clothing/suit/toggle/labcoat/labredblack + name = "Black and Red Coat" + desc = "An oddly special looking coat." + icon = 'icons/obj/custom.dmi' + icon_state = "labredblack" + icon_override = 'icons/mob/custom_w.dmi' + item_state = "labredblack" + + /*Improvedname*/ /obj/item/toy/plush/carrot @@ -259,6 +268,15 @@ icon_state = "bloodredtie" icon_override = 'icons/mob/custom_w.dmi' +/obj/item/clothing/suit/puffydress + name = "Puffy Dress" + desc = "A formal puffy black and red Victorian dress." + icon = 'icons/obj/custom.dmi' + icon_override = 'icons/mob/custom_w.dmi' + icon_state = "puffydress" + item_state = "puffydress" + body_parts_covered = CHEST|GROIN|LEGS + /*Fractious*/ diff --git a/code/citadel/custom_loadout/load_to_mob.dm b/modular_citadel/code/modules/custom_loadout/load_to_mob.dm similarity index 100% rename from code/citadel/custom_loadout/load_to_mob.dm rename to modular_citadel/code/modules/custom_loadout/load_to_mob.dm diff --git a/code/citadel/custom_loadout/read_from_file.dm b/modular_citadel/code/modules/custom_loadout/read_from_file.dm similarity index 100% rename from code/citadel/custom_loadout/read_from_file.dm rename to modular_citadel/code/modules/custom_loadout/read_from_file.dm diff --git a/modular_citadel/code/modules/events/blob.dm b/modular_citadel/code/modules/events/blob.dm new file mode 100644 index 0000000000..6eaffbf9c6 --- /dev/null +++ b/modular_citadel/code/modules/events/blob.dm @@ -0,0 +1,3 @@ +/datum/round_event_control/blob + min_players = 50 + earliest_start = 60 MINUTES diff --git a/modular_citadel/code/modules/food_and_drinks/snacks/meat.dm b/modular_citadel/code/modules/food_and_drinks/snacks/meat.dm new file mode 100644 index 0000000000..eba3660f8d --- /dev/null +++ b/modular_citadel/code/modules/food_and_drinks/snacks/meat.dm @@ -0,0 +1,3 @@ +/obj/item/reagent_containers/food/snacks/carpmeat/aquatic + name = "fillet" + desc = "A fillet of one of the local water dwelling species." diff --git a/modular_citadel/code/modules/jobs/job_types/security.dm b/modular_citadel/code/modules/jobs/job_types/security.dm new file mode 100644 index 0000000000..a034ac9cd5 --- /dev/null +++ b/modular_citadel/code/modules/jobs/job_types/security.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/warden + suit_store = /obj/item/gun/energy/pumpaction/defender \ No newline at end of file diff --git a/modular_citadel/code/modules/keybindings/bindings_carbon.dm b/modular_citadel/code/modules/keybindings/bindings_carbon.dm new file mode 100644 index 0000000000..d49cbcf452 --- /dev/null +++ b/modular_citadel/code/modules/keybindings/bindings_carbon.dm @@ -0,0 +1,6 @@ +/mob/living/carbon/key_down(_key, client/user) + switch(_key) + if("C") + toggle_combat_mode() + return + return ..() diff --git a/modular_citadel/code/modules/keybindings/bindings_human.dm b/modular_citadel/code/modules/keybindings/bindings_human.dm new file mode 100644 index 0000000000..963e71d709 --- /dev/null +++ b/modular_citadel/code/modules/keybindings/bindings_human.dm @@ -0,0 +1,13 @@ +/mob/living/carbon/human/key_down(_key, client/user) + switch(_key) + if("Shift") + togglesprint() + return + return ..() + +/mob/living/carbon/human/key_up(_key, client/user) + switch(_key) + if("Shift") + togglesprint() + return + return ..() diff --git a/code/citadel/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm similarity index 100% rename from code/citadel/cit_emotes.dm rename to modular_citadel/code/modules/mob/cit_emotes.dm diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm new file mode 100644 index 0000000000..87a496b48b --- /dev/null +++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm @@ -0,0 +1,17 @@ +/mob/living/carbon + var/combatmode = FALSE //literally lifeweb + +/mob/living/carbon/proc/toggle_combat_mode() + if(recoveringstam) + return TRUE + combatmode = !combatmode + if(combatmode) + playsound_local(src, 'modular_citadel/sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay! + else + playsound_local(src, 'modular_citadel/sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above! + if(client) + client.show_popup_menus = !combatmode // So we can right-click for alternate actions and all that other good shit. Also moves examine to shift+rightclick to make it possible to attack while sprinting + if(hud_used && hud_used.static_inventory) + for(var/obj/screen/combattoggle/selector in hud_used.static_inventory) + selector.rebasetointerbay(src) + return TRUE diff --git a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm new file mode 100644 index 0000000000..208d4769bb --- /dev/null +++ b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm @@ -0,0 +1,10 @@ +/mob/living/carbon/adjustStaminaLossBuffered(amount, updating_stamina = 1) + if(status_flags & GODMODE) + return 0 + var/directstamloss = (bufferedstam + amount) - stambuffer + if(directstamloss > 0) + adjustStaminaLoss(directstamloss) + bufferedstam = CLAMP(bufferedstam + amount, 0, stambuffer) + stambufferregentime = world.time + 2 SECONDS + if(updating_stamina) + update_health_hud() diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human.dm b/modular_citadel/code/modules/mob/living/carbon/human/human.dm new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm index 1952b3a3b8..c1fc6623de 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/human_defense.dm @@ -2,4 +2,13 @@ if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling)) vore_attack(user, pulling) else - ..() \ No newline at end of file + ..() + +/mob/living/carbon/human/alt_attack_hand(mob/user) + if(..()) + return + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(!dna.species.alt_spec_attack_hand(H, src)) + dna.species.spec_attack_hand(H, src) + return TRUE diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm new file mode 100644 index 0000000000..8463abe66d --- /dev/null +++ b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm @@ -0,0 +1,31 @@ +/mob/living/carbon/human + var/sprinting = FALSE + +/mob/living/carbon/human/Move(NewLoc, direct) + var/oldpseudoheight = pseudo_z_axis + . = ..() + if(. && sprinting && !resting && m_intent == MOVE_INTENT_RUN) + adjustStaminaLossBuffered(0.3) + if((oldpseudoheight - pseudo_z_axis) >= 8) + to_chat(src, "You trip off of the elevated surface!") + for(var/obj/item/I in held_items) + accident(I) + Knockdown(80) + +/mob/living/carbon/human/movement_delay() + . = 0 + if(!resting && m_intent == MOVE_INTENT_RUN && !sprinting) + . += 1 + . += ..() + +/mob/living/carbon/human/proc/togglesprint() // If you call this proc outside of hotkeys or clicking the HUD button, I'll be disappointed in you. + sprinting = !sprinting + if(!resting && m_intent == MOVE_INTENT_RUN && canmove) + if(sprinting) + playsound_local(src, 'modular_citadel/sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE) + else + playsound_local(src, 'modular_citadel/sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE) + if(hud_used && hud_used.static_inventory) + for(var/obj/screen/sprintbutton/selector in hud_used.static_inventory) + selector.insert_witty_toggle_joke_here(src) + return TRUE diff --git a/modular_citadel/code/modules/mob/living/carbon/human/life.dm b/modular_citadel/code/modules/mob/living/carbon/human/life.dm index 1f7c39a5ff..a3730a312f 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/life.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/life.dm @@ -3,10 +3,19 @@ if(stat != DEAD) handle_arousal() . = ..() - + /mob/living/carbon/human/calculate_affecting_pressure(pressure) if(ismob(loc)) return ONE_ATMOSPHERE if(istype(loc, /obj/item/device/dogborg/sleeper)) return ONE_ATMOSPHERE - . = ..() \ No newline at end of file + . = ..() + +/mob/living/carbon/human/update_health_hud(shown_health_amount) + . = ..() + if(!client || !hud_used) + return + if(hud_used.staminas) + hud_used.staminas.icon_state = staminahudamount() + if(hud_used.staminabuffer) + hud_used.staminabuffer.icon_state = staminabufferhudamount() diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species.dm b/modular_citadel/code/modules/mob/living/carbon/human/species.dm new file mode 100644 index 0000000000..007194e9f1 --- /dev/null +++ b/modular_citadel/code/modules/mob/living/carbon/human/species.dm @@ -0,0 +1,57 @@ +/datum/species/proc/alt_spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style) + if(!istype(M)) + return TRUE + CHECK_DNA_AND_SPECIES(M) + CHECK_DNA_AND_SPECIES(H) + + if(!istype(M)) //sanity check for drones. + return TRUE + if(M.mind) + attacker_style = M.mind.martial_art + if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK)) + add_logs(M, H, "attempted to touch") + H.visible_message("[M] attempted to touch [H]!") + return TRUE + switch(M.a_intent) + if("disarm") + altdisarm(M, H, attacker_style) + return TRUE + return FALSE + +/datum/species/proc/altdisarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) + if(user.staminaloss >= STAMINA_SOFTCRIT) + to_chat(user, "You're too exhausted.") + return FALSE + else if(target.check_block()) + target.visible_message("[target] blocks [user]'s disarm attempt!") + return 0 + if(attacker_style && attacker_style.disarm_act(user,target)) + return 1 + else + user.do_attack_animation(target, ATTACK_EFFECT_DISARM) + + user.adjustStaminaLossBuffered(4) //CITADEL CHANGE - makes disarmspam cause staminaloss + + if(target.w_uniform) + target.w_uniform.add_fingerprint(user) + var/randomized_zone = ran_zone(user.zone_selected) + target.SendSignal(COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected) + var/obj/item/bodypart/affecting = target.get_bodypart(randomized_zone) + var/randn = rand(1, 100) + if(user.resting) + randn += 20 //Makes it plausible, but unlikely, to push someone over while resting + if(!user.combatmode) + randn += 25 //Makes it impossible to push actually push someone outside of combat mode + + if(randn <= 25) + playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + target.visible_message("[user] has pushed [target]!", + "[user] has pushed [target]!", null, COMBAT_MESSAGE_RANGE) + target.apply_effect(40, KNOCKDOWN, target.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!")) + target.forcesay(GLOB.hit_appends) + add_logs(user, target, "disarmed", " pushing them to the ground") + return + + playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + target.visible_message("[user] attempted to push [target]!", \ + "[user] attemped to push [target]!", null, COMBAT_MESSAGE_RANGE) diff --git a/modular_citadel/code/modules/mob/living/damage_procs.dm b/modular_citadel/code/modules/mob/living/damage_procs.dm new file mode 100644 index 0000000000..8323386eff --- /dev/null +++ b/modular_citadel/code/modules/mob/living/damage_procs.dm @@ -0,0 +1,2 @@ +/mob/living/proc/adjustStaminaLossBuffered(amount, updating_stamina = TRUE, forced = FALSE) + return diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm new file mode 100644 index 0000000000..16376a4a58 --- /dev/null +++ b/modular_citadel/code/modules/mob/living/living.dm @@ -0,0 +1,122 @@ +/mob/living + var/recoveringstam = FALSE + var/bufferedstam = 0 + var/stambuffer = 20 + var/stambufferregentime + var/aimingdownsights = FALSE + var/attemptingstandup = FALSE + var/intentionalresting = FALSE + +/mob/living/movement_delay(ignorewalk = 0) + . = ..() + if(resting) + . += 6 + +/atom + var/pseudo_z_axis + +/atom/proc/get_fake_z() + return pseudo_z_axis + +/obj/structure/table + pseudo_z_axis = 8 + +/turf/open/get_fake_z() + var/objschecked + for(var/obj/structure/structurestocheck in contents) + objschecked++ + if(structurestocheck.pseudo_z_axis) + return structurestocheck.pseudo_z_axis + if(objschecked >= 25) + break + return pseudo_z_axis + +/mob/living/Move(atom/newloc, direct) + . = ..() + if(.) + if(makesfootstepsounds) + CitFootstep(newloc) + pseudo_z_axis = newloc.get_fake_z() + pixel_z = pseudo_z_axis + if(aimingdownsights) + aimingdownsights = FALSE + to_chat(src, "You are no longer aiming down your weapon's sights.") + +/mob/living/proc/lay_down() + set name = "Rest" + set category = "IC" + + if(client && client.prefs && client.prefs.autostand) + intentionalresting = !intentionalresting + to_chat(src, "You are now attempting to [intentionalresting ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].") + if(intentionalresting && !resting) + resting = TRUE + update_canmove() + else + resist_a_rest() + else + if(!resting) + resting = TRUE + to_chat(src, "You are now laying down.") + update_canmove() + else + resist_a_rest() + +/mob/living/proc/resist_a_rest(automatic = FALSE, ignoretimer = FALSE) //Lets mobs resist out of resting. Major QOL change with combat reworks. + if(!resting || stat || attemptingstandup) + return FALSE + if(ignoretimer) + resting = FALSE + update_canmove() + return TRUE + else + var/totaldelay = 3 //A little bit less than half of a second as a baseline for getting up from a rest + if(staminaloss >= STAMINA_SOFTCRIT) + to_chat(src, "You're too exhausted to get up!") + return FALSE + attemptingstandup = TRUE + var/health_deficiency = max((maxHealth - (health - staminaloss))*0.5, 0) + if(!has_gravity()) + health_deficiency = health_deficiency*0.2 + totaldelay += health_deficiency + var/standupwarning = "[src] and everyone around them should probably yell at the dev team" + switch(health_deficiency) + if(-INFINITY to 10) + standupwarning = "[src] stands right up!" + if(10 to 35) + standupwarning = "[src] tries to stand up." + if(35 to 60) + standupwarning = "[src] slowly pushes [p_them()]self upright." + if(60 to 80) + standupwarning = "[src] weakly attempts to stand up." + if(80 to INFINITY) + standupwarning = "[src] struggles to stand up." + var/usernotice = automatic ? "You are now getting up. (Auto)" : "You are now getting up." + visible_message("[standupwarning]", usernotice, vision_distance = 5) + if(do_after(src, totaldelay, target = src)) + resting = FALSE + attemptingstandup = FALSE + update_canmove() + return TRUE + else + visible_message("[src] falls right back down.", "You fall right back down.") + attemptingstandup = FALSE + if(has_gravity()) + playsound(src, "bodyfall", 20, 1) + return FALSE + +/mob/living/carbon/proc/update_stamina() + var/total_health = (min(health*2,100) - staminaloss) + if(staminaloss) + if(!recoveringstam && total_health <= STAMINA_CRIT_TRADITIONAL && !stat) + to_chat(src, "You're too exhausted to keep going...") + resting = TRUE + if(combatmode) + toggle_combat_mode() + recoveringstam = TRUE + update_canmove() + if(recoveringstam && total_health >= STAMINA_SOFTCRIT_TRADITIONAL) + to_chat(src, "You don't feel nearly as exhausted anymore.") + recoveringstam = FALSE + update_canmove() + update_health_hud() diff --git a/code/citadel/dogborgs.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg archive.dm similarity index 100% rename from code/citadel/dogborgs.dm rename to modular_citadel/code/modules/mob/living/silicon/robot/dogborg archive.dm diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm new file mode 100644 index 0000000000..b15dac4a15 --- /dev/null +++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @@ -0,0 +1,401 @@ +/* +DOG BORG EQUIPMENT HERE +SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! +*/ + +/obj/item/dogborg/jaws/big + name = "combat jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "jaws" + desc = "The jaws of the law." + flags_1 = CONDUCT_1 + force = 12 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") + w_class = 3 + sharpness = IS_SHARP + +/obj/item/dogborg/jaws/small + name = "puppy jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "smalljaws" + desc = "The jaws of a small dog." + flags_1 = CONDUCT_1 + force = 6 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") + w_class = 3 + sharpness = IS_SHARP + +/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user) + ..() + user.do_attack_animation(A, ATTACK_EFFECT_BITE) + +/obj/item/dogborg/jaws/small/attack_self(mob/user) + var/mob/living/silicon/robot.R = user + if(R.emagged) + name = "combat jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "jaws" + desc = "The jaws of the law." + flags_1 = CONDUCT_1 + force = 12 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") + w_class = 3 + sharpness = IS_SHARP + else + name = "puppy jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "smalljaws" + desc = "The jaws of a small dog." + flags_1 = CONDUCT_1 + force = 5 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") + w_class = 3 + sharpness = IS_SHARP + update_icon() + + +//Cuffs + +/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user) + if(!C.handcuffed) + playsound(loc, 'sound/weapons/cablecuff.ogg', 60, 1, -2) + C.visible_message("[user] is trying to put zipties on [C]!", \ + "[user] is trying to put zipties on [C]!") + if(do_mob(user, C, 60)) + if(!C.handcuffed) + C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) + C.update_inv_handcuffed(0) + to_chat(user,"You handcuff [C].") + playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0) + add_logs(user, C, "handcuffed") + else + to_chat(user,"You fail to handcuff [C]!") + + +//Boop + +/obj/item/device/analyzer/nose + name = "boop module" + icon = 'icons/mob/dogborg.dmi' + icon_state = "nose" + desc = "The BOOP module" + flags_1 = CONDUCT_1 + force = 0 + throwforce = 0 + attack_verb = list("nuzzled", "nosed", "booped") + w_class = 1 + +/obj/item/device/analyzer/nose/attack_self(mob/user) + user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces.") + + var/turf/location = user.loc + if(!istype(location)) + return + + var/datum/gas_mixture/environment = location.return_air() + + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles() + + to_chat(user, "Results:") + if(abs(pressure - ONE_ATMOSPHERE) < 10) + to_chat(user, "Pressure: [round(pressure,0.1)] kPa") + else + to_chat(user, "Pressure: [round(pressure,0.1)] kPa") + if(total_moles) + var/list/env_gases = environment.gases + + environment.assert_gases(arglist(GLOB.hardcoded_gases)) + var/o2_concentration = env_gases[/datum/gas/oxygen][MOLES]/total_moles + var/n2_concentration = env_gases[/datum/gas/nitrogen][MOLES]/total_moles + var/co2_concentration = env_gases[/datum/gas/carbon_dioxide][MOLES]/total_moles + var/plasma_concentration = env_gases[/datum/gas/plasma][MOLES]/total_moles + environment.garbage_collect() + + if(abs(n2_concentration - N2STANDARD) < 20) + to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") + else + to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") + + if(abs(o2_concentration - O2STANDARD) < 2) + to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") + else + to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") + + if(co2_concentration > 0.01) + to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") + else + to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") + + if(plasma_concentration > 0.005) + to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") + else + to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") + + + for(var/id in env_gases) + if(id in GLOB.hardcoded_gases) + continue + var/gas_concentration = env_gases[id][MOLES]/total_moles + to_chat(user, "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %") + to_chat(user, "Temperature: [round(environment.temperature-T0C)] °C") + +/obj/item/device/analyzer/nose/AltClick(mob/user) //Barometer output for measuring when the next storm happens + . = ..() + +//Delivery + +/obj/item/storage/bag/borgdelivery + name = "fetching storage" + desc = "Fetch the thing!" + icon = 'icons/mob/dogborg.dmi' + icon_state = "dbag" + //Can hold one big item at a time. Drops contents on unequip.(see inventory.dm) + w_class = 5 + max_w_class = 2 + max_combined_w_class = 2 + storage_slots = 1 + collection_mode = 0 + can_hold = list() // any + cant_hold = list(/obj/item/disk/nuclear) + + +//Tongue stuff + +/obj/item/soap/tongue + name = "synthetic tongue" + desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." + icon = 'icons/mob/dogborg.dmi' + icon_state = "synthtongue" + hitsound = 'sound/effects/attackblob.ogg' + cleanspeed = 80 + +/obj/item/soap/tongue/scrubpup + cleanspeed = 25 //slightly faster than a mop. + +/obj/item/soap/tongue/New() + ..() + flags_1 |= NOBLUDGEON_1 //No more attack messages + +/obj/item/trash/rkibble + name = "robo kibble" + desc = "A novelty bowl of assorted mech fabricator byproducts. Mockingly feed this to the sec-dog to help it recharge." + icon = 'icons/mob/dogborg.dmi' + icon_state= "kibble" + +/obj/item/soap/tongue/attack_self(mob/user) + var/mob/living/silicon/robot.R = user + if(R.emagged) + name = "hacked tongue of doom" + desc = "Your tongue has been upgraded successfully. Congratulations." + icon = 'icons/mob/dogborg.dmi' + icon_state = "syndietongue" + cleanspeed = 10 //(nerf'd)tator soap stat + else + name = "synthetic tongue" + desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." + icon = 'icons/mob/dogborg.dmi' + icon_state = "synthtongue" + cleanspeed = initial(cleanspeed) + update_icon() + +/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity) + var/mob/living/silicon/robot.R = user + if(!proximity || !check_allowed_items(target)) + return + if(R.client && (target in R.client.screen)) + to_chat(R, "You need to take that [target.name] off before cleaning it!") + else if(is_cleanable(target)) + R.visible_message("[R] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...") + if(do_after(R, src.cleanspeed, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't eat them. + to_chat(R, "You finish licking off \the [target.name].") + qdel(target) + R.cell.give(50) + else if(isobj(target)) //hoo boy. danger zone man + if(istype(target,/obj/item/trash)) + R.visible_message("[R] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...") + if(do_after(R, src.cleanspeed, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't eat them. + to_chat(R, "You finish off \the [target.name].") + qdel(target) + R.cell.give(250) + return + if(istype(target,/obj/item/stock_parts/cell)) + R.visible_message("[R] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...") + if(do_after(R, 50, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't eat them. + to_chat(R, "You finish off \the [target.name].") + var/obj/item/stock_parts/cell.C = target + R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf + qdel(target) + return + var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT + if(!I.anchored && R.emagged) + R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "You begin chewing up \the [target.name]...") + if(do_after(R, 100, target = I)) //Nerf dat time yo + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range. + return //If they moved away, you can't eat them. + visible_message("[R] chews up \the [target.name] and cleans off the debris!") + to_chat(R, "You finish off \the [target.name].") + qdel(I) + R.cell.give(500) + return + R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + if(do_after(R, src.cleanspeed, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't clean them. + to_chat(R,"You clean \the [target.name].") + var/obj/effect/decal/cleanable/C = locate() in target + qdel(C) + SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + else if(ishuman(target)) + if(R.emagged) + var/mob/living/L = target + if(R.cell.charge <= 666) + return + L.Stun(4) // normal stunbaton is force 7 gimme a break good sir! + L.Knockdown(80) + L.apply_effect(STUTTER, 4) + L.visible_message("[R] has shocked [L] with its tongue!", \ + "[R] has shocked you with its tongue! You can feel the betrayal.") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + R.cell.use(666) + else + R.visible_message("\the [R] affectionally licks \the [target]'s face!", "You affectionally lick \the [target]'s face!") + playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) + return + else if(istype(target, /obj/structure/window)) + R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + if(do_after(R, src.cleanspeed, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't clean them. + to_chat(R, "You clean \the [target.name].") + target.color = initial(target.color) + else + R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + if(do_after(R, src.cleanspeed, target = target)) + if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't clean them. + to_chat(R, "You clean \the [target.name].") + var/obj/effect/decal/cleanable/C = locate() in target + qdel(C) + SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + return + + +//Defibs + +/obj/item/twohanded/shockpaddles/cyborg/hound + name = "Paws of Life" + desc = "MediHound specific shock paws." + icon = 'icons/mob/dogborg.dmi' + icon_state = "defibpaddles0" + item_state = "defibpaddles0" + +// Pounce stuff for K-9 + +/obj/item/dogborg/pounce + name = "pounce" + icon = 'icons/mob/dogborg.dmi' + icon_state = "pounce" + desc = "Leap at your target to momentarily stun them." + force = 0 + throwforce = 0 + +/obj/item/dogborg/pounce/New() + ..() + flags_1 |= NOBLUDGEON_1 + +/mob/living/silicon/robot + var/leaping = 0 + var/pounce_cooldown = 0 + var/pounce_cooldown_time = 50 //Nearly doubled, u happy? + var/pounce_spoolup = 3 + var/leap_at + var/disabler + var/laser + var/sleeper_g + var/sleeper_r + +#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance. + +/obj/item/dogborg/pounce/afterattack(atom/A, mob/user) + var/mob/living/silicon/robot/R = user + if(R && !R.pounce_cooldown) + R.pounce_cooldown = !R.pounce_cooldown + to_chat(R, "Your targeting systems lock on to [A]...") + addtimer(CALLBACK(R, /mob/living/silicon/robot.proc/leap_at, A), R.pounce_spoolup) + spawn(R.pounce_cooldown_time) + R.pounce_cooldown = !R.pounce_cooldown + else if(R && R.pounce_cooldown) + to_chat(R, "Your leg actuators are still recharging!") + +/mob/living/silicon/robot/proc/leap_at(atom/A) + if(leaping || stat || buckled || lying) + return + + if(!has_gravity(src) || !has_gravity(A)) + to_chat(src,"It is unsafe to leap without gravity!") + //It's also extremely buggy visually, so it's balance+bugfix + return + + if(cell.charge <= 500) + to_chat(src,"Insufficent reserves for jump actuators!") + return + + else + leaping = 1 + weather_immunities += "lava" + pixel_y = 10 + update_icons() + throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1) + cell.use(500) //Doubled the energy consumption + weather_immunities -= "lava" + +/mob/living/silicon/robot/throw_impact(atom/A) + + if(!leaping) + return ..() + + if(A) + if(isliving(A)) + var/mob/living/L = A + var/blocked = 0 + if(ishuman(A)) + var/mob/living/carbon/human/H = A + if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK)) + blocked = 1 + if(!blocked) + L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") + L.Knockdown(iscarbon(L) ? 450 : 45) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice. + playsound(src, 'sound/weapons/Egloves.ogg', 50, 1) + sleep(2)//Runtime prevention (infinite bump() calls on hulks) + step_towards(src,L) + else + Knockdown(45, 1, 1) + + pounce_cooldown = !pounce_cooldown + spawn(pounce_cooldown_time) //3s by default + pounce_cooldown = !pounce_cooldown + else if(A.density && !A.CanPass(src)) + visible_message("[src] smashes into [A]!", "You smash into [A]!") + playsound(src, 'sound/items/trayhit1.ogg', 50, 1) + Knockdown(45, 1, 1) + + if(leaping) + leaping = 0 + pixel_y = initial(pixel_y) + update_icons() + update_canmove() diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm new file mode 100644 index 0000000000..34970bc283 --- /dev/null +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm @@ -0,0 +1,10 @@ +/mob/living/silicon/robot + var/dogborg = FALSE + +/mob/living/silicon/robot/lay_down() + if(resting) + cut_overlays() + icon_state = "[module.cyborg_base_icon]-rest" + else + icon_state = "[module.cyborg_base_icon]" + update_icons() \ No newline at end of file diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm index cf12fff36d..dd7d492575 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -1,9 +1,22 @@ +/mob/living/silicon/robot/modules/medihound + set_module = /obj/item/robot_module/medihound + +/mob/living/silicon/robot/modules/k9 + set_module = /obj/item/robot_module/k9 + +/mob/living/silicon/robot/modules/scrubpup + set_module = /obj/item/robot_module/scrubpup + +/mob/living/silicon/robot/modules/borgi + set_module = /obj/item/robot_module/borgi + /mob/living/silicon/robot/proc/get_cit_modules() var/list/modulelist = list() modulelist["MediHound"] = /obj/item/robot_module/medihound if(!CONFIG_GET(flag/disable_secborg)) modulelist["Security K-9"] = /obj/item/robot_module/k9 modulelist["Scrub Puppy"] = /obj/item/robot_module/scrubpup + modulelist["Borgi"] = /obj/item/robot_module/borgi return modulelist /obj/item/robot_module @@ -12,11 +25,13 @@ var/has_snowflake_deadsprite var/cyborg_pixel_offset var/moduleselect_alternate_icon + var/dogborg = FALSE /obj/item/robot_module/k9 - name = "Security K-9 Unit module" + name = "Security K-9 Unit" basic_modules = list( /obj/item/restraints/handcuffs/cable/zipties/cyborg/dog, + /obj/item/storage/bag/borgdelivery, /obj/item/dogborg/jaws/big, /obj/item/dogborg/pounce, /obj/item/clothing/mask/gas/sechailer/cyborg, @@ -29,12 +44,13 @@ ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security, /obj/item/clockwork/weapon/ratvarian_spear) cyborg_base_icon = "k9" - moduleselect_icon = "security" + moduleselect_icon = "k9" can_be_pushed = FALSE hat_offset = INFINITY sleeper_overlay = "ksleeper" cyborg_icon_override = 'icons/mob/widerobot.dmi' has_snowflake_deadsprite = TRUE + dogborg = TRUE cyborg_pixel_offset = -16 /obj/item/robot_module/k9/do_transform_animation() @@ -43,33 +59,31 @@ For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to.") /obj/item/robot_module/medihound - name = "MediHound module" + name = "MediHound" basic_modules = list( /obj/item/dogborg/jaws/small, + /obj/item/storage/bag/borgdelivery, /obj/item/device/analyzer/nose, /obj/item/soap/tongue, /obj/item/device/healthanalyzer, /obj/item/device/dogborg/sleeper/medihound, - /obj/item/twohanded/shockpaddles/hound, + /obj/item/reagent_containers/borghypo, + /obj/item/twohanded/shockpaddles/cyborg/hound, /obj/item/stack/medical/gauze/cyborg, /obj/item/device/sensor_device) emag_modules = list(/obj/item/dogborg/pounce) ratvar_modules = list(/obj/item/clockwork/slab/cyborg/medical, /obj/item/clockwork/weapon/ratvarian_spear) cyborg_base_icon = "medihound" - moduleselect_icon = "medical" + moduleselect_icon = "medihound" can_be_pushed = FALSE hat_offset = INFINITY sleeper_overlay = "msleeper" cyborg_icon_override = 'icons/mob/widerobot.dmi' has_snowflake_deadsprite = TRUE + dogborg = TRUE cyborg_pixel_offset = -16 -/obj/item/robot_module/medihound/do_transform_animation() - ..() - to_chat(loc, "Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \ - You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you.") - /obj/item/robot_module/scrubpup name = "Janitor" basic_modules = list( @@ -90,6 +104,7 @@ cyborg_icon_override = 'icons/mob/widerobot.dmi' has_snowflake_deadsprite = TRUE cyborg_pixel_offset = -16 + dogborg = TRUE /obj/item/robot_module/scrubpup/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) ..() @@ -102,6 +117,62 @@ ..() to_chat(loc,"As tempting as it might be, do not begin binging on important items. Eat your garbage responsibly. People are not included under Garbage.") +/obj/item/robot_module/borgi + name = "Borgi" + basic_modules = list( + /obj/item/dogborg/jaws/small, + /obj/item/storage/bag/borgdelivery, + /obj/item/device/analyzer/nose, + /obj/item/soap/tongue, + /obj/item/device/healthanalyzer, + /obj/item/borg/cyborghug) + emag_modules = list(/obj/item/dogborg/pounce) + ratvar_modules = list( + /obj/item/clockwork/slab/cyborg, + /obj/item/clockwork/weapon/ratvarian_spear, + /obj/item/clockwork/replica_fabricator/cyborg) + cyborg_base_icon = "borgi" + moduleselect_icon = "borgi" + hat_offset = INFINITY + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + has_snowflake_deadsprite = TRUE + +/* +/obj/item/robot_module/orepup + name = "Ore Pup" + basic_modules = list( + /obj/item/storage/bag/ore/cyborg, + /obj/item/device/analyzer/nose, + /obj/item/storage/bag/borgdelivery, + /obj/item/device/dogborg/sleeper/ore, + /obj/item/pickaxe/drill/cyborg, + /obj/item/shovel, + /obj/item/crowbar/cyborg, + /obj/item/weldingtool/mini, + /obj/item/extinguisher/mini, + /obj/item/device/t_scanner/adv_mining_scanner, + /obj/item/gun/energy/kinetic_accelerator/cyborg, + /obj/item/device/gps/cyborg) + emag_modules = list(/obj/item/dogborg/pounce) + ratvar_modules = list( + /obj/item/clockwork/slab/cyborg/miner, + /obj/item/clockwork/weapon/ratvarian_spear, + /obj/item/borg/sight/xray/truesight_lens) + cyborg_base_icon = "orepup" + moduleselect_icon = "orepup" + sleeper_overlay = "osleeper" + cyborg_icon_override = 'icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + cyborg_pixel_offset = -16 + +/obj/item/robot_module/miner/do_transform_animation() + var/mob/living/silicon/robot/R = loc + R.cut_overlays() + R.setDir(SOUTH) + flick("orepup_transform", R) + do_transform_delay() + R.update_headlamp() +*/ /obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc @@ -147,6 +218,10 @@ cyborg_base_icon = "engi-tread" special_light_key = "engineer" cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Loader") + cyborg_base_icon = "loader" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + has_snowflake_deadsprite = TRUE return ..() /obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module) diff --git a/code/citadel/pokemon.dm b/modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm similarity index 100% rename from code/citadel/pokemon.dm rename to modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm diff --git a/modular_citadel/code/modules/mob/mob.dm b/modular_citadel/code/modules/mob/mob.dm new file mode 100644 index 0000000000..bb48e5103f --- /dev/null +++ b/modular_citadel/code/modules/mob/mob.dm @@ -0,0 +1,2 @@ +/mob/proc/use_that_empty_hand() //currently unused proc so i can implement 2-handing any item a lot easier in the future. + return diff --git a/modular_citadel/code/modules/projectiles/gun.dm b/modular_citadel/code/modules/projectiles/gun.dm new file mode 100644 index 0000000000..27411c7e0a --- /dev/null +++ b/modular_citadel/code/modules/projectiles/gun.dm @@ -0,0 +1,36 @@ +/obj/item/gun/pre_altattackby(atom/A, mob/living/user, params) + altafterattack(A, user, TRUE, params) + return TRUE + +/obj/item/gun/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) + if(istype(user)) + if(!user.aimingdownsights) + user.visible_message("[user] brings [src]'s sights up to [user.p_their()] eyes, aiming directly at [target].", "You bring [src]'s sights up to your eyes, aiming directly at [target].") + user.adjustStaminaLossBuffered(1) + else + user.visible_message("[user] lowers [src].", "You lower [src].") + user.aimingdownsights = !user.aimingdownsights + return TRUE + +/obj/item/gun/dropped(mob/living/user) + . = ..() + if(istype(user)) + user.aimingdownsights = FALSE + +/obj/item/gun/proc/getstamcost(mob/living/carbon/user) + if(user && user.has_gravity()) + return recoil + else + return recoil*5 + +/obj/item/gun/energy/kinetic_accelerator/getstamcost(mob/living/carbon/user) + if(user && !lavaland_equipment_pressure_check(get_turf(user))) + return 0 + else + return ..() + +/obj/item/gun/proc/getinaccuracy(mob/living/user) + if(!iscarbon(user) || user.aimingdownsights) + return 0 + else + return weapon_weight * 25 diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm new file mode 100644 index 0000000000..28dfeb89d6 --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm @@ -0,0 +1,117 @@ +//////Flechette Launcher////// + +///projectiles/// + +/obj/item/projectile/bullet/cflechetteap //shreds armor + name = "flechette (armor piercing)" + damage = 8 + armour_penetration = 80 + +/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding + name = "flechette (serrated)" + damage = 15 + dismemberment = 10 + armour_penetration = -80 + +/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/C = target + C.bleed(10) + return ..() + +///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)/// + +/obj/item/ammo_casing/caseless/flechetteap + name = "flechette (armor piercing)" + desc = "A flechette made with a tungsten alloy." + projectile_type = /obj/item/projectile/bullet/cflechetteap + caliber = "flechette" + throwforce = 1 + throw_speed = 3 + +/obj/item/ammo_casing/caseless/flechettes + name = "flechette (serrated)" + desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh." + projectile_type = /obj/item/projectile/bullet/cflechettes + caliber = "flechette" + throwforce = 2 + throw_speed = 3 + embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10) + +///magazine/// + +/obj/item/ammo_box/magazine/flechette + name = "flechette magazine (armor piercing)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "flechettemag" + ammo_type = /obj/item/ammo_casing/caseless/flechetteap + caliber = "flechette" + max_ammo = 40 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/flechette/s + name = "flechette magazine (serrated)" + ammo_type = /obj/item/ammo_casing/caseless/flechettes + +///the gun itself/// + +/obj/item/gun/ballistic/automatic/flechette + name = "\improper CX Flechette Launcher" + desc = "A flechette launching machine pistol with an unconventional bullpup frame." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "flechettegun" + item_state = "gun" + w_class = WEIGHT_CLASS_NORMAL + slot_flags = 0 + /obj/item/device/firing_pin/implant/pindicate + mag_type = /obj/item/ammo_box/magazine/flechette/ + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 5 + fire_delay = 1 + casing_ejector = 0 + spread = 10 + recoil = 0.05 + +/obj/item/gun/ballistic/automatic/flechette/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("flechettegun-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +///unique variant/// + +/obj/item/projectile/bullet/cflechetteshredder + name = "flechette (shredder)" + damage = 5 + dismemberment = 40 + +/obj/item/ammo_casing/caseless/flechetteshredder + name = "flechette (shredder)" + desc = "A serrated flechette made of a special alloy that forms a monofilament edge." + projectile_type = /obj/item/projectile/bullet/cflechettes + +/obj/item/ammo_box/magazine/flechette/shredder + name = "flechette magazine (shredder)" + icon_state = "shreddermag" + ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder + +/obj/item/gun/ballistic/automatic/flechette/shredder + name = "\improper CX Shredder" + desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes." + w_class = WEIGHT_CLASS_SMALL + mag_type = /obj/item/ammo_box/magazine/flechette/shredder + spread = 15 + recoil = 0.1 + +/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("shreddergun-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm new file mode 100644 index 0000000000..487d5111fc --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm @@ -0,0 +1,424 @@ +////////////Anti Tank Pistol//////////// + +/obj/item/gun/ballistic/automatic/pistol/antitank + name = "Anti Tank Pistol" + desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "atp" + item_state = "pistol" + recoil = 4 + mag_type = /obj/item/ammo_box/magazine/sniper_rounds + fire_delay = 50 + burst_size = 1 + can_suppress = 0 + w_class = WEIGHT_CLASS_NORMAL + actions_types = list() + fire_sound = 'sound/weapons/blastcannon.ogg' + spread = 20 //damn thing has no rifling. + +/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("atp-mag") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate + name = "Syndicate Anti Tank Pistol" + desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing." + pin = /obj/item/device/firing_pin/implant/pindicate + +/* made redundant by reskinnable stetchkins +//////Stealth Pistol////// + +/obj/item/gun/ballistic/automatic/pistol/stealth + name = "stealth pistol" + desc = "A unique bullpup pistol with a compact frame. Has an integrated surpressor." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "stealthpistol" + w_class = WEIGHT_CLASS_SMALL + mag_type = /obj/item/ammo_box/magazine/m10mm + can_suppress = 0 + fire_sound = 'sound/weapons/gunshot_silenced.ogg' + suppressed = 1 + burst_size = 1 + +/obj/item/gun/ballistic/automatic/pistol/stealth/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("stealthpistol-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +*/ + +///foam stealth pistol/// + +/obj/item/gun/ballistic/automatic/toy/pistol/stealth + name = "foam force stealth pistol" + desc = "A small, easily concealable toy bullpup handgun. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "foamsp" + w_class = WEIGHT_CLASS_SMALL + mag_type = /obj/item/ammo_box/magazine/toy/pistol + can_suppress = FALSE + fire_sound = 'sound/weapons/gunshot_silenced.ogg' + suppressed = TRUE + burst_size = 1 + fire_delay = 0 + spread = 20 + actions_types = list() + +/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("foamsp-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +//////10mm soporific bullets////// + +obj/item/projectile/bullet/c10mm/soporific + name ="10mm soporific bullet" + armour_penetration = 0 + nodamage = TRUE + dismemberment = 0 + knockdown = 0 + +/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && isliving(target)) + var/mob/living/L = target + L.blur_eyes(6) + if(L.getStaminaLoss() >= 60) + L.Sleeping(300) + else + L.adjustStaminaLoss(25) + return 1 + +/obj/item/ammo_casing/c10mm/soporific + name = ".10mm soporific bullet casing" + desc = "A 10mm soporific bullet casing." + projectile_type = /obj/item/projectile/bullet/c10mm/soporific + +/obj/item/ammo_box/magazine/m10mm/soporific + name = "pistol magazine (10mm soporific)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "9x19pS" + desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target." + ammo_type = /obj/item/ammo_casing/c10mm/soporific + +/obj/item/ammo_box/c10mm/soporific + name = "ammo box (10mm soporific)" + ammo_type = /obj/item/ammo_casing/c10mm/soporific + max_ammo = 24 + +//////modular pistol////// (reskinnable stetchkins) + +/obj/item/gun/ballistic/automatic/pistol/modular + name = "modular pistol" + desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "cde" + can_unsuppress = TRUE + obj_flags = UNIQUE_RENAME + unique_reskin = list("Default" = "cde", + "NT-99" = "n99", + "Stealth" = "stealthpistol", + "HKVP-78" = "vp78", + "Luger" = "p08b", + "Mk.58" = "secguncomp", + "PX4 Storm" = "px4" + ) + +/obj/item/gun/ballistic/automatic/pistol/modular/update_icon() + ..() + if(current_skin) + icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + else + icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + if(magazine && suppressed) + cut_overlays() + add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay + else if (magazine) + cut_overlays() + add_overlay("[unique_reskin[current_skin]]-magazine") + else + cut_overlays() + +/////////RAYGUN MEMES///////// + +/obj/item/projectile/beam/lasertag/ray //the projectile, compatible with regular laser tag armor + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "ray" + name = "ray bolt" + eyeblur = 0 + +/obj/item/ammo_casing/energy/laser/raytag + projectile_type = /obj/item/projectile/beam/lasertag/ray + select_name = "raytag" + fire_sound = 'sound/weapons/raygun.ogg' + +/obj/item/gun/energy/laser/practice/raygun + name = "toy ray gun" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "raygun" + desc = "A toy laser with a classic, retro feel and look. Compatible with existing laser tag systems." + ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag) + selfcharge = TRUE + +/*///////////////////////////////////////////////////////////////////////////////////////////// + The Recolourable Gun +*////////////////////////////////////////////////////////////////////////////////////////////// + +/obj/item/gun/ballistic/automatic/pistol/p37 + name = "\improper CX Mk.37P" + desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. \ + This model is coated with a special polychromic material. \ + Has a small warning on the receiver that boldly states 'WARNING: WILL DETONATE UPON UNAUTHORIZED USE'. \ + Uses 9mm bullets loaded into proprietary magazines." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "p37" + w_class = WEIGHT_CLASS_NORMAL + spawnwithmagazine = FALSE + mag_type = /obj/item/ammo_box/magazine/m9mm/p37 + can_suppress = FALSE + pin = /obj/item/device/firing_pin/dna/dredd //goes boom if whoever isn't DNA locked to it tries to use it + actions_types = list(/datum/action/item_action/pick_color) + + var/frame_color = "#808080" //RGB + var/receiver_color = "#808080" + var/body_color = "#0098FF" + var/barrel_color = "#808080" + var/tip_color = "#808080" + var/arm_color = "#808080" + var/grip_color = "#00FFCB" //Does not actually colour the grip, just the lights surrounding it + var/energy_color = "#00FFCB" + +///Defining all the colourable bits and displaying them/// + +/obj/item/gun/ballistic/automatic/pistol/p37/update_icon() + var/mutable_appearance/frame_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_frame") + var/mutable_appearance/receiver_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_receiver") + var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_body") + var/mutable_appearance/barrel_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_barrel") + var/mutable_appearance/tip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_tip") + var/mutable_appearance/grip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_grip") + var/mutable_appearance/energy_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_light") + var/mutable_appearance/arm_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm") + var/mutable_appearance/arm_overlay_e = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm-e") + + if(frame_color) + frame_overlay.color = frame_color + if(receiver_color) + receiver_overlay.color = receiver_color + if(body_color) + body_overlay.color = body_color + if(barrel_color) + barrel_overlay.color = barrel_color + if(tip_color) + tip_overlay.color = tip_color + if(grip_color) + grip_overlay.color = grip_color + if(energy_color) + energy_overlay.color = energy_color + if(arm_color) + arm_overlay.color = arm_color + if(arm_color) + arm_overlay_e.color = arm_color + + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + + add_overlay(frame_overlay) + add_overlay(receiver_overlay) + add_overlay(body_overlay) + add_overlay(barrel_overlay) + add_overlay(tip_overlay) + add_overlay(grip_overlay) + add_overlay(energy_overlay) + + if(magazine) //does not need a cut_overlays proc call here because it's already called further up + add_overlay("p37_mag") + + if(chambered) + cut_overlay(arm_overlay_e) + add_overlay(arm_overlay) + else + cut_overlay(arm_overlay) + add_overlay(arm_overlay_e) + +///letting you actually recolor things/// + +/obj/item/gun/ballistic/automatic/pistol/p37/ui_action_click(mob/user, var/datum/action/A) + if(istype(A, /datum/action/item_action/pick_color)) + + var/choice = input(user,"Mk.37P polychrome options", "Gun Recolor") in list("Frame Color","Receiver Color","Body Color", + "Barrel Color", "Barrel Tip Color", "Grip Light Color", + "Light Color", "Arm Color", "*CANCEL*") + + switch(choice) + + if("Frame Color") + var/frame_color_input = input(usr,"","Choose Frame Color",frame_color) as color|null + if(frame_color_input) + frame_color = sanitize_hexcolor(frame_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Receiver Color") + var/receiver_color_input = input(usr,"","Choose Receiver Color",receiver_color) as color|null + if(receiver_color_input) + receiver_color = sanitize_hexcolor(receiver_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Body Color") + var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null + if(body_color_input) + body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Barrel Color") + var/barrel_color_input = input(usr,"","Choose Barrel Color",barrel_color) as color|null + if(barrel_color_input) + barrel_color = sanitize_hexcolor(barrel_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Barrel Tip Color") + var/tip_color_input = input(usr,"","Choose Barrel Tip Color",tip_color) as color|null + if(tip_color_input) + tip_color = sanitize_hexcolor(tip_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Grip Light Color") + var/grip_color_input = input(usr,"","Choose Grip Light Color",grip_color) as color|null + if(grip_color_input) + grip_color = sanitize_hexcolor(grip_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Light Color") + var/energy_color_input = input(usr,"","Choose Light Color",energy_color) as color|null + if(energy_color_input) + energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) + update_icon() + + if("Arm Color") + var/arm_color_input = input(usr,"","Choose Arm Color",arm_color) as color|null + if(arm_color_input) + arm_color = sanitize_hexcolor(arm_color_input, desired_format=6, include_crunch=1) + update_icon() + A.UpdateButtonIcon() + + else + ..() + +///boolets/// + +/obj/item/projectile/bullet/c9mm/frangible + name = "9mm frangible bullet" + damage = 15 + stamina = 0 + speed = 1.0 + range = 20 + armour_penetration = -25 + +/obj/item/projectile/bullet/c9mm/rubber + name = "9mm rubber bullet" + damage = 5 + stamina = 30 + speed = 1.2 + range = 14 + knockdown = 0 + +/obj/item/ammo_casing/c9mm/frangible + name = "9mm frangible bullet casing" + desc = "A 9mm frangible bullet casing." + projectile_type = /obj/item/projectile/bullet/c9mm/frangible + +/obj/item/ammo_casing/c9mm/rubber + name = "9mm rubber bullet casing" + desc = "A 9mm rubber bullet casing." + projectile_type = /obj/item/projectile/bullet/c9mm/rubber + +/obj/item/ammo_box/magazine/m9mm/p37 + name = "\improper P37 magazine (9mm frangible)" + desc = "A gun magazine. Loaded with plastic composite rounds which fragment upon impact to minimize collateral damage." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "11mm" //topkek + ammo_type = /obj/item/ammo_casing/c9mm/frangible + caliber = "9mm" + max_ammo = 11 + multiple_sprites = 1 + +/obj/item/ammo_box/magazine/m9mm/p37/fmj + name = "\improper P37 magazine (9mm)" + ammo_type = /obj/item/ammo_casing/c9mm + desc = "A gun magazine. Loaded with conventional full metal jacket rounds." + +/obj/item/ammo_box/magazine/m9mm/p37/rubber + name = "\improper P37 magazine (9mm Non-Lethal Rubbershot)" + ammo_type = /obj/item/ammo_casing/c9mm/rubber + desc = "A gun magazine. Loaded with less-than-lethal rubber bullets." + +/obj/item/ammo_box/c9mm/frangible + name = "ammo box (9mm frangible)" + ammo_type = /obj/item/ammo_casing/c9mm/frangible + +/obj/item/ammo_box/c9mm/rubber + name = "ammo box (9mm non-lethal rubbershot)" + ammo_type = /obj/item/ammo_casing/c9mm/rubber + +/datum/design/c9mmfrag + name = "Box of 9mm Frangible Bullets" + id = "9mm_frag" + build_type = AUTOLATHE + materials = list(MAT_METAL = 25000) + build_path = /obj/item/ammo_box/c9mm/frangible + category = list("hacked", "Security") + +/datum/design/c9mmrubber + name = "Box of 9mm Rubber Bullets" + id = "9mm_rubber" + build_type = AUTOLATHE + materials = list(MAT_METAL = 30000) + build_path = /obj/item/ammo_box/c9mm/rubber + category = list("initial", "Security") + + +///Security Variant/// + +/obj/item/gun/ballistic/automatic/pistol/p37/sec + name = "\improper CX Mk.37S" + desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. Uses 9mm bullets loaded into proprietary magazines." + spawnwithmagazine = FALSE + pin = /obj/item/device/firing_pin/implant/mindshield + actions_types = list() //so you can't recolor it + + frame_color = "#808080" //RGB + receiver_color = "#808080" + body_color = "#282828" + barrel_color = "#808080" + tip_color = "#808080" + arm_color = "#800000" + grip_color = "#FFFF00" //Does not actually colour the grip, just the lights surrounding it + energy_color = "#FFFF00" + +///Foam Variant because WE NEED MEMES/// + +/obj/item/gun/ballistic/automatic/pistol/p37/foam + name = "\improper Foam Force Mk.37F" + desc = "A licensed foam-firing reproduction of a handgun with a toggle-locking mechanism manufactured by CX Armories. This model is coated with a special polychromic material. Uses standard foam pistol magazines." + icon_state = "p37_foam" + pin = /obj/item/device/firing_pin + spawnwithmagazine = TRUE + obj_flags = 0 + casing_ejector = FALSE + mag_type = /obj/item/ammo_box/magazine/toy/pistol + can_suppress = FALSE + actions_types = list(/datum/action/item_action/pick_color) + +/obj/item/ammo_box/magazine/toy/pistol //forcing this might be a bad idea, but it'll fix the foam gun infinite material exploit + materials = list(MAT_METAL = 200) diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm new file mode 100644 index 0000000000..cd4ec113de --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm @@ -0,0 +1,466 @@ +///////XCOM X9 AR/////// + +/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them + name = "\improper X9 Assault Rifle" + desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "x9" + item_state = "arg" + slot_flags = 0 + mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine. + fire_delay = 1 + spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable + recoil = 1 + +///toy memes/// + +/obj/item/ammo_box/magazine/toy/x9 + name = "foam force X9 magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toy9magazine" + max_ammo = 30 + multiple_sprites = 2 + materials = list(MAT_METAL = 200) + +/obj/item/gun/ballistic/automatic/x9/toy + name = "\improper Foam Force X9" + desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toy9" + can_suppress = 0 + obj_flags = 0 + mag_type = /obj/item/ammo_box/magazine/toy/x9 + casing_ejector = 0 + spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread) + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_HEAVY + +////////XCOM2 Magpistol///////// + +//////projectiles////// + +/obj/item/projectile/bullet/mags + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile" + damage = 15 + armour_penetration = 10 + light_range = 2 + speed = 0.6 + range = 25 + light_color = LIGHT_COLOR_RED + +/obj/item/projectile/bullet/nlmags //non-lethal boolets + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-nl" + damage = 0 + knockdown = 0 + stamina = 25 + armour_penetration = -10 + light_range = 2 + speed = 0.7 + range = 25 + light_color = LIGHT_COLOR_BLUE + + +/////actual ammo///// + +/obj/item/ammo_casing/caseless/amags + desc = "A ferromagnetic slug intended to be launched out of a compatible weapon." + caliber = "mags" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/mags + +/obj/item/ammo_casing/caseless/anlmags + desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload." + caliber = "mags" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/nlmags + +//////magazines///// + +/obj/item/ammo_box/magazine/mmag/small + name = "magpistol magazine (non-lethal disabler)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "nlmagmag" + ammo_type = /obj/item/ammo_casing/caseless/anlmags + caliber = "mags" + max_ammo = 15 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/mmag/small/lethal + name = "magpistol magazine (lethal)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "smallmagmag" + ammo_type = /obj/item/ammo_casing/caseless/amags + +//////the gun itself////// + +/obj/item/gun/ballistic/automatic/pistol/mag + name = "magpistol" + desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magpistol" + force = 10 + fire_sound = 'sound/weapons/magpistol.ogg' + mag_type = /obj/item/ammo_box/magazine/mmag/small + can_suppress = 0 + casing_ejector = 0 + fire_delay = 2 + recoil = 0.2 + +/obj/item/gun/ballistic/automatic/pistol/mag/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("magpistol-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +///research memes/// + +/obj/item/gun/ballistic/automatic/pistol/mag/nopin + pin = null + spawnwithmagazine = FALSE + +/datum/design/magpistol + name = "Magpistol" + desc = "A weapon which fires ferromagnetic slugs." + id = "magpisol" + build_type = PROTOLATHE + materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000) + build_path = /obj/item/gun/ballistic/automatic/pistol/mag/nopin + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magpistol + name = "Magpistol Magazine" + desc = "A 14 round magazine for the Magpistol." + id = "mag_magpistol" + build_type = PROTOLATHE + materials = list(MAT_METAL = 4000, MAT_SILVER = 500) + build_path = /obj/item/ammo_box/magazine/mmag/small/lethal + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magpistol/nl + name = "Magpistol Magazine (Non-Lethal)" + desc = "A 14 round non-lethal magazine for the Magpistol." + id = "mag_magpistol_nl" + materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250) + build_path = /obj/item/ammo_box/magazine/mmag/small + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +//////toy memes///// + +/obj/item/projectile/bullet/reusable/foam_dart/mag + name = "magfoam dart" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-toy" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + light_range = 2 + light_color = LIGHT_COLOR_YELLOW + +/obj/item/ammo_casing/caseless/foam_dart/mag + name = "magfoam dart" + desc = "A foam dart with fun light-up projectiles powered by magnets!" + projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag + +/obj/item/ammo_box/magazine/internal/shot/toy/mag + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + max_ammo = 14 + +/obj/item/gun/ballistic/shotgun/toy/mag + name = "foam force magpistol" + desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toymag" + item_state = "gun" + mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag + fire_sound = 'sound/weapons/magpistol.ogg' + slot_flags = SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + +/obj/item/ammo_box/foambox/mag + name = "ammo box (Magnetic Foam Darts)" + icon = 'icons/obj/guns/toy.dmi' + icon_state = "foambox" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + max_ammo = 42 + +//////Magrifle////// + +///projectiles/// + +/obj/item/projectile/bullet/magrifle + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-large" + damage = 20 + armour_penetration = 25 + light_range = 3 + speed = 0.7 + range = 35 + light_color = LIGHT_COLOR_RED + +/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-large-nl" + damage = 0 + knockdown = 0 + stamina = 25 + armour_penetration = -10 + light_range = 3 + speed = 0.65 + range = 35 + light_color = LIGHT_COLOR_BLUE + +///ammo casings/// + +/obj/item/ammo_casing/caseless/amagm + desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon." + caliber = "magm" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/magrifle + +/obj/item/ammo_casing/caseless/anlmagm + desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload." + caliber = "magm" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/nlmagrifle + +///magazines/// + +/obj/item/ammo_box/magazine/mmag/ + name = "magrifle magazine (non-lethal disabler)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mediummagmag" + ammo_type = /obj/item/ammo_casing/caseless/anlmagm + caliber = "magm" + max_ammo = 24 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/mmag/lethal + name = "magrifle magazine (lethal)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mediummagmag" + ammo_type = /obj/item/ammo_casing/caseless/amagm + max_ammo = 24 + +///the gun itself/// + +/obj/item/gun/ballistic/automatic/magrifle + name = "\improper Magnetic Rifle" + desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magrifle" + item_state = "arg" + slot_flags = 0 + mag_type = /obj/item/ammo_box/magazine/mmag + fire_sound = 'sound/weapons/magrifle.ogg' + can_suppress = 0 + burst_size = 3 + fire_delay = 2 + spread = 5 + recoil = 0.15 + casing_ejector = 0 + +///research/// + +/obj/item/gun/ballistic/automatic/magrifle/nopin + pin = null + spawnwithmagazine = FALSE + +/datum/design/magrifle + name = "Magrifle" + desc = "An upscaled Magpistol in rifle form." + id = "magrifle" + build_type = PROTOLATHE + materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000) + build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magrifle + name = "Magrifle Magazine (Lethal)" + desc = "A 24-round magazine for the Magrifle." + id = "mag_magrifle" + build_type = PROTOLATHE + materials = list(MAT_METAL = 8000, MAT_SILVER = 1000) + build_path = /obj/item/ammo_box/magazine/mmag/lethal + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/mag_magrifle/nl + name = "Magrifle Magazine (Non-Lethal)" + desc = "A 24- round non-lethal magazine for the Magrifle." + id = "mag_magrifle_nl" + materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500) + build_path = /obj/item/ammo_box/magazine/mmag + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +///foamagrifle/// + +/obj/item/ammo_box/magazine/toy/foamag + name = "foam force magrifle magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "foamagmag" + max_ammo = 24 + multiple_sprites = 2 + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + materials = list(MAT_METAL = 200) + +/obj/item/gun/ballistic/automatic/magrifle/toy + name = "foamag rifle" + desc = "A foam launching magnetic rifle. Ages 8 and up." + icon_state = "foamagrifle" + obj_flags = 0 + mag_type = /obj/item/ammo_box/magazine/toy/foamag + casing_ejector = FALSE + spread = 60 + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_HEAVY + +/* +// TECHWEBS IMPLEMENTATION +*/ + +/datum/techweb_node/magnetic_weapons + id = "magnetic_weapons" + display_name = "Magnetic Weapons" + description = "Weapons using magnetic technology" + prereq_ids = list("weaponry", "adv_weaponry", "emp_adv") + design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl") + research_cost = 2500 + export_price = 5000 + + +//////Hyper-Burst Rifle////// + +///projectiles/// + +/obj/item/projectile/bullet/mags/hyper + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile" + damage = 10 + armour_penetration = 10 + stamina = 10 + forcedodge = TRUE + range = 6 + light_range = 1 + light_color = LIGHT_COLOR_RED + +/obj/item/projectile/bullet/mags/hyper/inferno + icon_state = "magjectile-large" + stamina = 0 + forcedodge = FALSE + range = 25 + light_range = 4 + +/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 1, 2, 4, 5) + return 1 + +///ammo casings/// + +/obj/item/ammo_casing/caseless/ahyper + desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle." + caliber = "hypermag" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "hyper-casing-live" + projectile_type = /obj/item/projectile/bullet/mags/hyper + pellets = 12 + variance = 40 + +/obj/item/ammo_casing/caseless/ahyper/inferno + projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno + pellets = 1 + variance = 0 + +///magazines/// + +/obj/item/ammo_box/magazine/mhyper + name = "hyper-burst rifle magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "hypermag-4" + ammo_type = /obj/item/ammo_casing/caseless/ahyper + caliber = "hypermag" + desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range." + max_ammo = 4 + +/obj/item/ammo_box/magazine/mhyper/update_icon() + ..() + icon_state = "hypermag-[ammo_count() ? "4" : "0"]" + +/obj/item/ammo_box/magazine/mhyper/inferno + name = "hyper-burst rifle magazine (inferno)" + ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno + desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light." + +///gun itself/// + +/obj/item/gun/ballistic/automatic/hyperburst + name = "\improper Hyper-Burst Rifle" + desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "hyperburst" + item_state = "arg" + slot_flags = 0 + mag_type = /obj/item/ammo_box/magazine/mhyper + fire_sound = 'sound/weapons/magburst.ogg' + can_suppress = 0 + burst_size = 1 + fire_delay = 40 + recoil = 2 + casing_ejector = 0 + weapon_weight = WEAPON_HEAVY + +/obj/item/gun/ballistic/automatic/hyperburst/update_icon() + ..() + icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]" + +///toy memes/// + +/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-toy" + name = "lasertag magbolt" + forcedodge = TRUE //for penetration memes + range = 5 //so it isn't super annoying + light_range = 2 + light_color = LIGHT_COLOR_YELLOW + eyeblur = 0 + +/obj/item/ammo_casing/energy/laser/magtag + projectile_type = /obj/item/projectile/beam/lasertag/mag + select_name = "magtag" + pellets = 3 + variance = 30 + e_cost = 1000 + fire_sound = 'sound/weapons/magburst.ogg' + +/obj/item/gun/energy/laser/practice/hyperburst + name = "toy hyper-burst launcher" + desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems." + ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag) + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toyburst" + clumsy_check = FALSE + obj_flags = 0 + fire_delay = 40 + weapon_weight = WEAPON_HEAVY + selfcharge = TRUE + charge_delay = 2 + recoil = 2 + cell_type = /obj/item/stock_parts/cell/toymagburst + +/obj/item/stock_parts/cell/toymagburst + name = "toy mag burst rifle power supply" + maxcharge = 4000 \ No newline at end of file diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm new file mode 100644 index 0000000000..a9824c7d33 --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm @@ -0,0 +1,234 @@ + +///////XCOM X9 AR/////// + +/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them + name = "\improper X9 Assault Rifle" + desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "x9" + item_state = "arg" + slot_flags = 0 + mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine. + fire_delay = 1 + spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable + recoil = 1 + +///toy memes/// + +/obj/item/ammo_box/magazine/toy/x9 + name = "foam force X9 magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toy9magazine" + max_ammo = 30 + multiple_sprites = 2 + materials = list(MAT_METAL = 200) + +/obj/item/gun/ballistic/automatic/x9/toy + name = "\improper Foam Force X9" + desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toy9" + can_suppress = 0 + obj_flags = 0 + mag_type = /obj/item/ammo_box/magazine/toy/x9 + casing_ejector = 0 + spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread) + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_HEAVY + + +//////Flechette Launcher////// + +///projectiles/// + +/obj/item/projectile/bullet/cflechetteap //shreds armor + name = "flechette (armor piercing)" + damage = 8 + armour_penetration = 80 + +/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding + name = "flechette (serrated)" + damage = 15 + dismemberment = 10 + armour_penetration = -80 + +/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/C = target + C.bleed(10) + return ..() + +///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)/// + +/obj/item/ammo_casing/caseless/flechetteap + name = "flechette (armor piercing)" + desc = "A flechette made with a tungsten alloy." + projectile_type = /obj/item/projectile/bullet/cflechetteap + caliber = "flechette" + throwforce = 1 + throw_speed = 3 + +/obj/item/ammo_casing/caseless/flechettes + name = "flechette (serrated)" + desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh." + projectile_type = /obj/item/projectile/bullet/cflechettes + caliber = "flechette" + throwforce = 2 + throw_speed = 3 + embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10) + +///magazine/// + +/obj/item/ammo_box/magazine/flechette + name = "flechette magazine (armor piercing)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "flechettemag" + ammo_type = /obj/item/ammo_casing/caseless/flechetteap + caliber = "flechette" + max_ammo = 40 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/flechette/s + name = "flechette magazine (serrated)" + ammo_type = /obj/item/ammo_casing/caseless/flechettes + +///the gun itself/// + +/obj/item/gun/ballistic/automatic/flechette + name = "\improper CX Flechette Launcher" + desc = "A flechette launching machine pistol with an unconventional bullpup frame." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "flechettegun" + item_state = "gun" + w_class = WEIGHT_CLASS_NORMAL + slot_flags = 0 + /obj/item/device/firing_pin/implant/pindicate + mag_type = /obj/item/ammo_box/magazine/flechette/ + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 5 + fire_delay = 1 + casing_ejector = 0 + spread = 10 + recoil = 0.05 + +/obj/item/gun/ballistic/automatic/flechette/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("flechettegun-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +///unique variant/// + +/obj/item/projectile/bullet/cflechetteshredder + name = "flechette (shredder)" + damage = 5 + dismemberment = 40 + +/obj/item/ammo_casing/caseless/flechetteshredder + name = "flechette (shredder)" + desc = "A serrated flechette made of a special alloy that forms a monofilament edge." + projectile_type = /obj/item/projectile/bullet/cflechettes + +/obj/item/ammo_box/magazine/flechette/shredder + name = "flechette magazine (shredder)" + icon_state = "shreddermag" + ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder + +/obj/item/gun/ballistic/automatic/flechette/shredder + name = "\improper CX Shredder" + desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes." + w_class = WEIGHT_CLASS_SMALL + mag_type = /obj/item/ammo_box/magazine/flechette/shredder + spread = 15 + recoil = 0.1 + +/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("shreddergun-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +/*///////////////////////////////////////////////////////////// +//////////////////////// Zero's Meme ////////////////////////// +*////////////////////////////////////////////////////////////// +/obj/item/ammo_box/magazine/toy/AM4B + name = "foam force AM4-B magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "AM4MAG-60" + max_ammo = 60 + multiple_sprites = 0 + materials = list(MAT_METAL = 200) + +/obj/item/gun/ballistic/automatic/AM4B + name = "AM4-B" + desc = "A Relic from a bygone age. Nobody quite knows why it's here. Has a polychromic coating." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "AM4" + item_state = "arg" + mag_type = /obj/item/ammo_box/magazine/toy/AM4B + can_suppress = 0 + item_flags = NEEDS_PERMIT + casing_ejector = 0 + spread = 30 //Assault Rifleeeeeee + w_class = WEIGHT_CLASS_NORMAL + burst_size = 4 //Shh. + fire_delay = 1 + var/body_color = "#3333aa" + +/obj/item/gun/ballistic/automatic/AM4B/update_icon() + ..() + var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "AM4-Body") + if(body_color) + body_overlay.color = body_color + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + add_overlay(body_overlay) + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() +/obj/item/gun/ballistic/automatic/AM4B/AltClick(mob/living/user) + if(!in_range(src, user)) //Basic checks to prevent abuse + return + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + if(alert("Are you sure you want to recolor your gun?", "Confirm Repaint", "Yes", "No") == "Yes") + var/body_color_input = input(usr,"","Choose Shroud Color",body_color) as color|null + if(body_color_input) + body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) + update_icon() +/obj/item/gun/ballistic/automatic/AM4B/examine(mob/user) + ..() + to_chat(user, "Alt-click to recolor it.") + +/obj/item/ammo_box/magazine/toy/AM4C + name = "foam force AM4-C magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "AM4MAG-32" + max_ammo = 32 + multiple_sprites = 0 + materials = list(MAT_METAL = 200) + +/obj/item/gun/ballistic/automatic/AM4C + name = "AM4-C" + desc = "A Relic from a bygone age. This one seems newer, yet less effective." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "AM4C" + item_state = "arg" + mag_type = /obj/item/ammo_box/magazine/toy/AM4C + can_suppress = 0 + item_flags = NEEDS_PERMIT + casing_ejector = 0 + spread = 45 //Assault Rifleeeeeee + w_class = WEIGHT_CLASS_NORMAL + burst_size = 4 //Shh. + fire_delay = 1 diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm new file mode 100644 index 0000000000..5b42f9686a --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm @@ -0,0 +1,90 @@ +/////////////spinfusor stuff//////////////// + +/obj/item/projectile/bullet/spinfusor + name ="spinfusor disk" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state= "spinner" + damage = 30 + dismemberment = 25 + +/obj/item/projectile/bullet/spinfusor/on_hit(atom/target, blocked = FALSE) //explosion to emulate the spinfusor's AOE + ..() + explosion(target, -1, -1, 2, 0, -1) + return 1 + +/obj/item/ammo_casing/caseless/spinfusor + name = "spinfusor disk" + desc = "A magnetic disk designed specifically for the Stormhammer magnetic cannon. Warning: extremely volatile!" + projectile_type = /obj/item/projectile/bullet/spinfusor + caliber = "spinfusor" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "disk" + throwforce = 15 //still deadly when thrown + throw_speed = 3 + +/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/target) //disks detonate when thrown + if(!..()) // not caught in mid-air + visible_message("[src] detonates!") + playsound(src.loc, "sparks", 50, 1) + explosion(target, -1, -1, 1, 1, -1) + qdel(src) + return 1 + +/obj/item/ammo_box/magazine/internal/spinfusor + name = "spinfusor internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/spinfusor + caliber = "spinfusor" + max_ammo = 1 + +/obj/item/gun/ballistic/automatic/spinfusor + name = "Stormhammer Magnetic Cannon" + desc = "An innovative weapon utilizing mag-lev technology to spin up a magnetic fusor and launch it at extreme velocities." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "spinfusor" + item_state = "spinfusor" + mag_type = /obj/item/ammo_box/magazine/internal/spinfusor + fire_sound = 'sound/weapons/rocketlaunch.ogg' + w_class = WEIGHT_CLASS_BULKY + can_suppress = 0 + burst_size = 1 + fire_delay = 40 + select = 0 + actions_types = list() + casing_ejector = 0 + +/obj/item/gun/ballistic/automatic/spinfusor/attackby(obj/item/A, mob/user, params) + var/num_loaded = magazine.attackby(A, user, params, 1) + if(num_loaded) + to_chat(user, "You load [num_loaded] disk\s into \the [src].") + update_icon() + chamber_round() + +/obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user) + return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor + +/obj/item/gun/ballistic/automatic/spinfusor/update_icon() + ..() + icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]" + +/obj/item/ammo_box/aspinfusor + name = "ammo box (spinfusor disks)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "spinfusorbox" + ammo_type = /obj/item/ammo_casing/caseless/spinfusor + max_ammo = 8 + +/datum/supply_pack/security/armory/spinfusor + name = "Stormhammer Spinfusor Crate" + cost = 14000 + contains = list(/obj/item/gun/ballistic/automatic/spinfusor, + /obj/item/gun/ballistic/automatic/spinfusor) + crate_name = "spinfusor crate" + +/datum/supply_pack/security/armory/spinfusorammo + name = "Spinfusor Disk Crate" + cost = 7000 + contains = list(/obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor) + crate_name = "spinfusor disk crate" \ No newline at end of file diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm index a3367e4aa6..fb488fcca4 100644 --- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm @@ -1,5 +1,56 @@ /obj/item/gun/energy/e_gun - icon = 'modular_citadel/icons/obj/guns/energy.dmi' + name = "blaster carbine" + desc = "A high powered particle blaster carbine with varitable setting for stunning or lethal applications." + icon = 'modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi' + lefthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi' + righthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi' ammo_x_offset = 2 flight_x_offset = 17 - flight_y_offset = 11 \ No newline at end of file + flight_y_offset = 11 + + +/*///////////////////////////////////////////////////////////////////////////////////////////// + The Recolourable Energy Gun +*////////////////////////////////////////////////////////////////////////////////////////////// + +obj/item/gun/energy/e_gun/cx + name = "\improper CX Model D Energy Gun" + desc = "An overpriced hybrid energy gun with two settings: disable, and kill. Manufactured by CX Armories. Has a polychromic coating." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "cxe" + lefthand_file = 'icons/mob/citadel/guns_lefthand.dmi' + righthand_file = 'icons/mob/citadel/guns_righthand.dmi' + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) + flight_x_offset = 15 + flight_y_offset = 10 + var/body_color = "#252528" + +obj/item/gun/energy/e_gun/cx/update_icon() + ..() + var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "cxegun_body") + if(body_color) + body_overlay.color = body_color + add_overlay(body_overlay) + + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() + +obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user) + if(!in_range(src, user)) //Basic checks to prevent abuse + return + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + if(alert("Are you sure you want to repaint your gun?", "Confirm Repaint", "Yes", "No") == "Yes") + var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null + if(body_color_input) + body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) + update_icon() + +obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file) + . = ..() + if(isinhands) + var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body") + body_inhand.color = body_color + . += body_inhand diff --git a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm new file mode 100644 index 0000000000..25ae98e72a --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm @@ -0,0 +1,46 @@ +/obj/item/gun/energy/laser + name = "blaster rifle" + desc = "a high energy particle blaster, efficient and deadly." + icon = 'modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi' + ammo_x_offset = 1 + shaded_charge = 1 + lefthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi' + righthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi' + +/obj/item/gun/energy/laser/practice + icon_state = "laser-p" + +/obj/item/gun/energy/laser/bluetag + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + +/obj/item/gun/energy/laser/redtag + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + +/obj/item/gun/energy/laser/carbine + name = "VGS blaster carbine" + desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal blaster carbine." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "lasernew" + item_state = "laser" + force = 10 + throwforce = 10 + ammo_type = list(/obj/item/ammo_casing/energy/lasergun) + cell_type = /obj/item/stock_parts/cell/lascarbine + +/obj/item/gun/energy/laser/carbine/nopin + pin = null + +/obj/item/stock_parts/cell/lascarbine + name = "laser carbine power supply" + maxcharge = 2500 + +/datum/design/lasercarbine + name = "VGS Blaster Carbine" + desc = "Beefed up version of a normal blaster carbine." + id = "lasercarbine" + build_type = PROTOLATHE + materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000) + build_path = /obj/item/gun/energy/laser/carbine/nopin + category = list("Weapons") \ No newline at end of file diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm new file mode 100644 index 0000000000..8fcf7a6463 --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm @@ -0,0 +1,199 @@ +/* +// PUMP-ACTION ENERGY GUNS +*/ + +/obj/item/gun/energy/pumpaction //parent object with all procs defined under. Useless in-game, but VERY important codewise + icon_state = "blaster" + name = "pump-action particle blaster" + desc = "A pump action energy gun that requires manual racking to charge supercapacitors." + icon = 'modular_citadel/icons/obj/guns/pumpactionblaster.dmi' + cell_type = /obj/item/stock_parts/cell/pumpaction + var/recentpump = 0 // to prevent spammage + +/obj/item/gun/energy/pumpaction/emp_act(severity) //makes it not rack itself when emp'd + cell.use(round(cell.charge / severity)) + chambered = null //we empty the chamber + update_icon() + +/obj/item/gun/energy/pumpaction/process() //makes it not rack itself when self-charging + if(selfcharge) + charge_tick++ + if(charge_tick < charge_delay) + return + charge_tick = 0 + if(!cell) + return + cell.give(100) + update_icon() + +/obj/item/gun/energy/pumpaction/attack_self(mob/living/user) //makes clicking on it in hand pump it + if(recentpump > world.time) + return + pump(user) + recentpump = world.time + 10 + return + +/obj/item/gun/energy/pumpaction/process_chamber() //makes it so that it doesn't rack itself after firing + if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired... + var/obj/item/ammo_casing/energy/shot = chambered + cell.use(shot.e_cost)//... drain the cell cell + chambered = null //either way, released the prepared shot + +/obj/item/gun/energy/pumpaction/select_fire(mob/living/user) //makes it so that it doesn't rack itself when changing firing modes unless already racked + select++ + if (select > ammo_type.len) + select = 1 + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + fire_sound = shot.fire_sound + fire_delay = shot.delay + if (shot.select_name) + to_chat(user, "[src] is now set to [shot.select_name].") + if(chambered) + chambered = null + recharge_newshot(1) + update_icon() + if(ismob(loc)) //forces inhands to update + var/mob/M = loc + M.update_inv_hands() + return + +/obj/item/gun/energy/pumpaction/update_icon() //adds racked indicators + ..() + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + if(chambered) + add_overlay("[icon_state]_rack_[shot.select_name]") + else + add_overlay("[icon_state]_rack_empty") + +/obj/item/gun/energy/pumpaction/proc/pump(mob/M) //pumping proc. Checks if the gun is empty and plays a different sound if it is. + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + if(cell.charge < shot.e_cost) + playsound(M, 'modular_citadel/sound/weapons/laserPumpEmpty.ogg', 100, 1) //Ends with three beeps made from highly processed knife honing noises + else + playsound(M, 'modular_citadel/sound/weapons/laserPump.ogg', 100, 1) //Ends with high pitched charging noise + recharge_newshot() //try to charge a new shot + update_icon() + return 1 + +/obj/item/gun/energy/pumpaction/AltClick(mob/living/user) //for changing firing modes since attackself is already used for pumping + if(!in_range(src, user)) //Basic checks to prevent abuse + return + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + + if(ammo_type.len > 1) + select_fire(user) + update_icon() + +/obj/item/gun/energy/pumpaction/examine(mob/user) //so people don't ask HOW TO CHANGE FIRING MODE + ..() + to_chat(user, "Alt-click to change firing modes.") + +/obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file) //ammo counter for inhands + . = ..() + var/ratio = CEILING((cell.charge / cell.maxcharge) * charge_sections, 1) + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + if(isinhands) + if(cell.charge < shot.e_cost) + var/mutable_appearance/ammo_inhand = mutable_appearance(icon_file, "[item_state]_empty") + . += ammo_inhand + else + var/mutable_appearance/ammo_inhand = mutable_appearance(icon_file, "[item_state]_charge_[shot.select_name][ratio]") + . += ammo_inhand + if(chambered) + var/mutable_appearance/rack_inhand = mutable_appearance(icon_file, "[item_state]_rack_[shot.select_name]") + . += rack_inhand + else + var/mutable_appearance/rack_inhand = mutable_appearance(icon_file, "[item_state]_rack_empty") + . += rack_inhand + +/obj/item/stock_parts/cell/pumpaction //nice number to achieve the amount of shots wanted + name = "pump action particle blaster power supply" + maxcharge = 1200 + +//PUMP ACTION DISABLER + +/obj/item/gun/energy/pumpaction/blaster + icon_state = "blaster" + name = "pump-action particle blaster" + desc = "A non-lethal pump-action particle blaster with an overdrive firing mode. Requires manual racking after every shot to charge an integral bank of supercapacitors." + item_state = "particleblaster" + lefthand_file = 'modular_citadel/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_citadel/icons/mob/inhands/guns_righthand.dmi' + ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter/disabler/pump, /obj/item/ammo_casing/energy/disabler/slug) + ammo_x_offset = 2 + modifystate = 1 + +//WARDEN'S SPECIAL vERSION + +/obj/item/gun/energy/pumpaction/defender + icon_state = "defender" + name = "particle defender" + desc = "A pump-action particle blaster with a unique particle focusing chamber optimized for decisive de-escalation. Requires manual racking after every shot to charge an integral bank of supercapacitors." + item_state = "particleblaster" + lefthand_file = 'modular_citadel/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_citadel/icons/mob/inhands/guns_righthand.dmi' + ammo_type = list(/obj/item/ammo_casing/energy/electrode/pump, /obj/item/ammo_casing/energy/laser/pump) + ammo_x_offset = 2 + modifystate = 1 + +//AMMO CASINGS (fire modes) + +/obj/item/ammo_casing/energy/laser/scatter/disabler/pump + projectile_type = /obj/item/projectile/beam/disabler/weak + e_cost = 150 + pellets = 5 + variance = 30 + fire_sound = 'modular_citadel/sound/weapons/ParticleBlaster.ogg' + select_name = "disable" + +/obj/item/ammo_casing/energy/disabler/slug + projectile_type = /obj/item/projectile/beam/disabler/slug + select_name = "overdrive" + e_cost = 200 + fire_sound = 'modular_citadel/sound/weapons/LaserSlugv3.ogg' + +/obj/item/ammo_casing/energy/laser/pump + projectile_type = /obj/item/projectile/beam/weak + e_cost = 200 + select_name = "kill" + pellets = 3 + variance = 15 + fire_sound = 'modular_citadel/sound/weapons/ParticleBlaster.ogg' + +/obj/item/ammo_casing/energy/electrode/pump + projectile_type = /obj/item/projectile/energy/electrode/pump + select_name = "stun" + fire_sound = 'modular_citadel/sound/weapons/LaserSlugv3.ogg' + e_cost = 300 + pellets = 3 + variance = 20 + +//PROJECTILES + +/obj/item/projectile/beam/disabler/weak + name = "particle blast" + damage = 18 + icon_state = "disablerpellet" + icon = 'modular_citadel/icons/obj/projectiles.dmi' + +/obj/item/projectile/beam/disabler/slug + name = "positron blast" + damage = 60 + range = 14 + speed = 0.6 + icon_state = "disablerslug" + icon = 'modular_citadel/icons/obj/projectiles.dmi' + +/obj/item/projectile/energy/electrode/pump + name = "electron blast" + icon_state = "stunjectile" + icon = 'modular_citadel/icons/obj/projectiles.dmi' + color = null + nodamage = 1 + knockdown = 100 + stutter = 5 + jitter = 20 + hitsound = 'sound/weapons/taserhit.ogg' + range = 7 \ No newline at end of file diff --git a/modular_citadel/code/modules/projectiles/guns/toys.dm b/modular_citadel/code/modules/projectiles/guns/toys.dm new file mode 100644 index 0000000000..d6b80a95e5 --- /dev/null +++ b/modular_citadel/code/modules/projectiles/guns/toys.dm @@ -0,0 +1,60 @@ +/* +// NEW TOYS GUNS GO HERE +*/ + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//HITSCAN EXPERIMENT + +/obj/item/gun/energy/pumpaction/toy + icon_state = "blastertoy" + name = "pump-action plastic blaster" + desc = "A fearsome toy of terrible power. It has the ability to fire beams of pure light in either dispersal mode or overdrive mode. Requires the operation of a 40KW power shunt between every shot to prepare the beam focusing chamber." + item_state = "particleblaster" + lefthand_file = 'modular_citadel/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_citadel/icons/mob/inhands/guns_righthand.dmi' + ammo_type = list(/obj/item/ammo_casing/energy/laser/dispersal, /obj/item/ammo_casing/energy/laser/wavemotion) + ammo_x_offset = 2 + modifystate = 1 + selfcharge = TRUE + item_flags = NONE + clumsy_check = FALSE + +//PROJECTILES + +/obj/item/projectile/beam/lasertag/wavemotion + tracer_type = /obj/effect/projectile/tracer/laser/wavemotion + muzzle_type = /obj/effect/projectile/muzzle/laser/wavemotion + impact_type = /obj/effect/projectile/impact/laser/wavemotion + hitscan = TRUE + +/obj/item/projectile/beam/lasertag/dispersal + tracer_type = /obj/effect/projectile/tracer/laser/blue + muzzle_type = /obj/effect/projectile/muzzle/laser/blue + impact_type = /obj/effect/projectile/impact/laser/blue + hitscan = TRUE + +//AMMO CASINGS + +/obj/item/ammo_casing/energy/laser/wavemotion + projectile_type = /obj/item/projectile/beam/lasertag/wavemotion + select_name = "overdrive" + e_cost = 300 + fire_sound = 'modular_citadel/sound/weapons/LaserSlugv3.ogg' + +/obj/item/ammo_casing/energy/laser/dispersal + projectile_type = /obj/item/projectile/beam/lasertag/dispersal + select_name = "dispersal" + pellets = 5 + variance = 25 + e_cost = 200 + fire_sound = 'modular_citadel/sound/weapons/ParticleBlaster.ogg' + +////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//TOY REVOLVER + +/obj/item/toy/gun/justicar + name = "\improper replica F3 Justicar" + desc = "An authentic cap-firing reproduction of a F3 Justicar big-bore revolver! Pretend to blow your friend's brains out with this 100% safe toy! Satisfaction guaranteed!" + icon_state = "justicar" + icon = 'modular_citadel/icons/obj/guns/toys.dmi' + materials = list(MAT_METAL=2000, MAT_GLASS=250) \ No newline at end of file diff --git a/modular_citadel/code/modules/projectiles/projectile/energy.dm b/modular_citadel/code/modules/projectiles/projectile/energy.dm new file mode 100644 index 0000000000..8c5725a8a3 --- /dev/null +++ b/modular_citadel/code/modules/projectiles/projectile/energy.dm @@ -0,0 +1,2 @@ +/obj/item/projectile/energy/electrode + stamina = 30 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm new file mode 100644 index 0000000000..0b57c621f2 --- /dev/null +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -0,0 +1,7 @@ +/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume) + if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart)) + qdel(O) + else + if(O) + O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + O.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) diff --git a/code/citadel/cit_kegs.dm b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm similarity index 93% rename from code/citadel/cit_kegs.dm rename to modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm index d7e4ac03b9..d40dba8a3f 100644 --- a/code/citadel/cit_kegs.dm +++ b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm @@ -1,7 +1,7 @@ /obj/structure/reagent_dispensers/keg name = "keg" desc = "A keg." - icon = 'code/citadel/icons/objects.dmi' + icon = 'modular_citadel/icons/obj/objects.dmi' icon_state = "keg" reagent_id = "water" diff --git a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm new file mode 100644 index 0000000000..e89068c95f --- /dev/null +++ b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm @@ -0,0 +1,223 @@ +#define HYPO_SPRAY 0 +#define HYPO_INJECT 1 + +//A vial-loaded hypospray. Cartridge-based! +/obj/item/reagent_containers/hypospray/mkii + name = "hypospray mk.II" + icon = 'modular_citadel/icons/obj/hypospraymkii.dmi' + icon_state = "hypo2" + var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/small) + desc = "A new development from DeForest Medical, this new hypospray takes 30-unit vials as the drug supply for easy swapping." + volume = 0 + amount_per_transfer_from_this = 5 + possible_transfer_amounts = list(5,10,15) + var/mode = HYPO_INJECT + var/obj/item/reagent_containers/glass/bottle/vial/vial + var/loaded_vial = /obj/item/reagent_containers/glass/bottle/vial/small + var/spawnwithvial = TRUE + var/start_vial = null + +/obj/item/reagent_containers/hypospray/mkii/CMO + name = "hypospray mk.II deluxe" + allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large) + icon_state = "cmo2" + ignore_flags = 1 + desc = "The Chief Medical Officer's hypospray is identically functional to the base model, excepting that it can take larger vials in addition to regular sized. It is also able to penetrate harder materials and deliver more reagents per spray." + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + loaded_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO + possible_transfer_amounts = list(5,10,15,30,60) //cmo hypo should be able to dump lots into it + +/obj/item/reagent_containers/hypospray/mkii/Initialize() + . = ..() + if(!spawnwithvial) + update_icon() + return + if (!start_vial) + start_vial = new loaded_vial(src) + vial = start_vial + update_icon() + +/obj/item/reagent_containers/hypospray/mkii/update_icon() + ..() + icon_state = "[initial(icon_state)][vial ? "" : "-e"]" + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() + return + +/obj/item/reagent_containers/hypospray/mkii/examine(mob/user) + . = ..() + to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.") + +/obj/item/reagent_containers/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user) + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) + var/obj/item/reagent_containers/glass/bottle/vial/V = I + reagents.trans_to(V, reagents.total_volume) + reagents.maximum_volume = 0 + V.forceMove(user.loc) + user.put_in_hands(V) + to_chat(user, "You remove the vial from the [src].") + vial = null + update_icon() + playsound(loc, 'sound/weapons/empty.ogg', 50, 1) + else + to_chat(user, "This hypo isn't loaded!") + return + +/obj/item/reagent_containers/hypospray/mkii/attackby(obj/item/I, mob/living/user) + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial) && vial != null)) + to_chat(user, "[src] can not hold more than one vial!") + return FALSE + if((istype(I, /obj/item/reagent_containers/glass/bottle/vial))) + var/obj/item/reagent_containers/glass/bottle/vial/V = I + if(!is_type_in_list(V, allowed_containers)) + to_chat(user, "\The [src] doesn't accept this vial.") + return + vial = V + reagents.maximum_volume = V.volume + V.reagents.trans_to(src, V.reagents.total_volume) + if(!user.transferItemToLoc(V,src)) + return + user.visible_message("[user] has loads vial into \the [src].","You have loaded [vial] into \the [src].") + update_icon() + playsound(loc, 'sound/weapons/autoguninsert.ogg', 50, 1) + return TRUE + else + to_chat(user, "This doesn't fit in \the [src].") + return FALSE + return FALSE + +/obj/item/reagent_containers/hypospray/mkii/attack(obj/item/I, mob/user, params) + return + +/obj/item/reagent_containers/hypospray/mkii/afterattack(atom/target, mob/user, proximity) + if(!proximity) + return + + if(!ismob(target)) + return + + var/mob/living/L + if(isliving(target)) + L = target + if(!L.can_inject(user, 1)) + return + + if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles + to_chat(user, "You cannot directly fill [target]!") + return + + if(target.reagents.total_volume >= target.reagents.maximum_volume) + to_chat(user, "[target] is full.") + return + + if(ishuman(L)) + var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) + if(!affecting) + to_chat(user, "The limb is missing!") + return + if(affecting.status != BODYPART_ORGANIC) + to_chat(user, "Medicine won't work on a robotic limb!") + return + + var/contained = reagents.log_list() + add_logs(user, L, "attemped to inject", src, addition="which had [contained]") +//Always log attemped injections for admins + if(vial != null) + switch(mode) + if(HYPO_INJECT) + if(L) //living mob + if(!L.can_inject(user, TRUE)) + return + if(L != user) + L.visible_message("[user] is trying to inject [L] with [src]!", \ + "[user] is trying to inject [L] with the [src]!") + if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1))) + return + if(!reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + L.visible_message("[user] uses the [src] on [L]!", \ + "[user] uses the [src] on [L]!") + else + if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1))) + return + if(!reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") + L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) + + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(L, INJECT, fraction) + reagents.trans_to(target, amount_per_transfer_from_this) + if(amount_per_transfer_from_this >= 15) + playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) + if(amount_per_transfer_from_this < 15) + playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) + to_chat(user, "You inject [amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [reagents.total_volume] units.") + + if(HYPO_SPRAY) + if(L) //living mob + if(!L.can_inject(user, TRUE)) + return + if(L != user) + L.visible_message("[user] is trying to inject [L] with [src]!", \ + "[user] is trying to inject [L] with the [src]!") + if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1))) + return + if(!reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + L.visible_message("[user] uses the [src] on [L]!", \ + "[user] uses the [src] on [L]!") + else + if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1))) + return + if(!reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])") + L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG) + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(L, PATCH, fraction) + reagents.trans_to(target, amount_per_transfer_from_this) + if(amount_per_transfer_from_this >= 15) + playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1) + if(amount_per_transfer_from_this < 15) + playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) + to_chat(user, "You spray [amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [reagents.total_volume] units.") + else + to_chat(user, "[src] doesn't work here!") + return + +/obj/item/reagent_containers/hypospray/mkii/AltClick(mob/living/user) + if(user) + if(user.incapacitated()) + return + else if(!contents) + to_chat(user, "This Hypo needs to be loaded first!") + return + else + for(var/obj/item/I in contents) + unload_hypo(I,user) + +/obj/item/reagent_containers/hypospray/mkii/verb/modes() + set name = "Change Application Method" + set category = "Object" + set src in usr + var/mob/M = usr + var/choice = alert(M, "Which application mode should this be? Current mode is: [mode ? "Spray" : "Inject"]", "", "Spray", "Cancel", "Inject") + switch(choice) + if("Cancel") + return + if("Inject") + mode = HYPO_INJECT + to_chat(M, "[src] is now set to inject contents on application.") + if("Spray") + mode = HYPO_SPRAY + to_chat(M, "[src] is now set to spray contents on application.") \ No newline at end of file diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm new file mode 100644 index 0000000000..e3e82e22a7 --- /dev/null +++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm @@ -0,0 +1,116 @@ +/obj/item/reagent_containers/glass/bottle/vial + name = "hypospray vial" + desc = "This is a vial suitable for loading into mk II hyposprays." + icon = 'modular_citadel/icons/obj/vial.dmi' + icon_state = "hypovial" + spillable = FALSE + var/comes_with = list() //Easy way of doing this. + volume = 10 + obj_flags = UNIQUE_RENAME + unique_reskin = list("Hypospray vial" = "hypovial", + "Red hypospray vial" = "hypovial-b", + "Blue hypospray vial" = "hypovial-d", + "Green hypospray vial" = "hypovial-a", + "Orange hypospray vial" = "hypovial-k", + "Purple hypospray vial" = "hypovial-p", + "Black hypospray vial" = "hypovial-t" + ) + +/obj/item/reagent_containers/glass/bottle/vial/Initialize() + . = ..() + if(!icon_state) + icon_state = "hypovial" + update_icon() + for(var/R in comes_with) + reagents.add_reagent(R,comes_with[R]) + +/obj/item/reagent_containers/glass/bottle/vial/on_reagent_change() + update_icon() + +/obj/item/reagent_containers/glass/bottle/vial/update_icon() + cut_overlays() + if(reagents.total_volume) + var/mutable_appearance/filling = mutable_appearance('modular_citadel/icons/obj/vial.dmi', "[icon_state]10") + + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 9) + filling.icon_state = "[icon_state]10" + if(10 to 29) + filling.icon_state = "[icon_state]25" + if(30 to 49) + filling.icon_state = "[icon_state]50" + if(50 to 69) + filling.icon_state = "[icon_state]75" + if(70 to INFINITY) + filling.icon_state = "[icon_state]100" + + filling.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(filling) + +/obj/item/reagent_containers/glass/bottle/vial/small + volume = 30 + +/obj/item/reagent_containers/glass/bottle/vial/large + name = "large hypospray vial" + desc = "This is a vial suitable for loading into the Chief Medical Officer's Hypospray mk II." + icon_state = "hypoviallarge" + volume = 60 + unique_reskin = list("Large hypospray vial" = "hypoviallarge", + "Red hypospray vial" = "hypoviallarge-b", + "Blue hypospray vial" = "hypoviallarge-d", + "Green hypospray vial" = "hypoviallarge-a", + "Orange hypospray vial" = "hypoviallarge-k", + "Purple hypospray vial" = "hypoviallarge-p", + "Black hypospray vial" = "hypoviallarge-t" + ) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine + name = "vial (bicaridine)" + icon_state = "hypovial-b" + comes_with = list("bicaridine" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin + name = "vial (Anti-Tox)" + icon_state = "hypovial-a" + comes_with = list("antitoxin" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane + name = "vial (kelotane)" + icon_state = "hypovial-k" + comes_with = list("kelotane" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin + name = "vial (dexalin)" + icon_state = "hypovial-d" + comes_with = list("dexalin" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricordrazine + name = "vial (tricordrazine)" + icon_state = "hypovial" + comes_with = list("tricordrazine" = 30) + +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO + name = "large vial (CMO Special)" + icon_state = "hypoviallarge-cmos" + comes_with = list("epinephrine" = 15, "kelotane" = 15, "charcoal" = 15, "bicaridine" = 15) + +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/bicaridine + name = "large vial (bicaridine)" + icon_state = "hypoviallarge-b" + comes_with = list("bicaridine" = 60) + +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/antitoxin + name = "large vial (Anti-Tox)" + icon_state = "hypoviallarge-a" + comes_with = list("antitoxin" = 60) + +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/kelotane + name = "large vial (kelotane)" + icon_state = "hypoviallarge-k" + comes_with = list("kelotane" = 60) + +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/dexalin + name = "large vial (dexalin)" + icon_state = "hypoviallarge-d" + comes_with = list("dexalin" = 60) diff --git a/code/citadel/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm similarity index 98% rename from code/citadel/cit_reagents.dm rename to modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index df4af10faa..01c5e005a3 100644 --- a/code/citadel/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -29,7 +29,7 @@ gender = PLURAL density = 0 layer = ABOVE_NORMAL_TURF_LAYER - icon = 'code/citadel/icons/effects.dmi' + icon = 'modular_citadel/icons/obj/genitals/effects.dmi' icon_state = "semen1" random_icon_states = list("semen1", "semen2", "semen3", "semen4") @@ -59,7 +59,7 @@ gender = PLURAL density = 0 layer = ABOVE_NORMAL_TURF_LAYER - icon = 'code/citadel/icons/effects.dmi' + icon = 'modular_citadel/icons/obj/genitals/effects.dmi' icon_state = "fem1" random_icon_states = list("fem1", "fem2", "fem3", "fem4") blood_state = null @@ -260,7 +260,7 @@ /obj/item/reagent_containers/food/drinks/bottle/sake name = "Traditional Sake" desc = "Sweet as can be, and burns like foxfire going down." - icon = 'code/citadel/icons/drinks.dmi' + icon = 'modular_citadel/icons/obj/drinks.dmi' icon_state = "sakebottle" list_reagents = list("sake" = 100) diff --git a/modular_citadel/code/modules/recycling/disposal/bin.dm b/modular_citadel/code/modules/recycling/disposal/bin.dm new file mode 100644 index 0000000000..226c56d226 --- /dev/null +++ b/modular_citadel/code/modules/recycling/disposal/bin.dm @@ -0,0 +1,6 @@ +/obj/machinery/disposal/bin/alt_attack_hand(mob/user) + if(is_interactable() && !user.stat) + flush = !flush + update_icon() + return TRUE + return FALSE diff --git a/modular_citadel/code/modules/research/designs/autoylathe_designs.dm b/modular_citadel/code/modules/research/designs/autoylathe_designs.dm index a257513e96..f0e98a5bfe 100644 --- a/modular_citadel/code/modules/research/designs/autoylathe_designs.dm +++ b/modular_citadel/code/modules/research/designs/autoylathe_designs.dm @@ -624,3 +624,27 @@ materials = list(MAT_PLASTIC = 4000, MAT_METAL = 500) build_path = /obj/item/gun/ballistic/automatic/AM4C category = list("initial", "Rifles") + +/datum/design/foam_f3 + name = "Replica F3 Justicar" + id = "foam_f3" + build_type = AUTOYLATHE + materials = list(MAT_PLASTIC = 2000, MAT_METAL = 250) + build_path = /obj/item/toy/gun/justicar + category = list("initial", "Pistols") + +/datum/design/toy_blaster + name = "pump-action plastic blaster" + id = "toy_blaster" + build_type = AUTOYLATHE + materials = list(MAT_PLASTIC = 2000, MAT_METAL = 750, MAT_GLASS = 1000) + build_path = /obj/item/gun/energy/pumpaction/toy + category = list("initial", "Rifles") + +/datum/design/capammo + name = "Box of Caps" + id = "capammo" + build_type = AUTOYLATHE + materials = list(MAT_METAL = 10, MAT_GLASS = 10) + build_path = /obj/item/toy/ammo/gun + category = list("initial", "Misc") \ No newline at end of file diff --git a/modular_citadel/code/modules/vore/eating/belly_dat_vr.dm b/modular_citadel/code/modules/vore/eating/belly_dat_vr.dm new file mode 100644 index 0000000000..3886eb14cf --- /dev/null +++ b/modular_citadel/code/modules/vore/eating/belly_dat_vr.dm @@ -0,0 +1,162 @@ +// THIS IS NOW MERELY LEGACY, because memes. hopefully it won't be dumb. + +// +// The belly object is what holds onto a mob while they're inside a predator. +// It takes care of altering the pred's decription, digesting the prey, relaying struggles etc. +// + +// If you change what variables are on this, then you need to update the copy() proc. + +// +// Parent type of all the various "belly" varieties. +// +/datum/belly + var/name // Name of this location + var/inside_flavor // Flavor text description of inside sight/sound/smells/feels. + var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone + var/vore_verb = "ingest" // Verb for eating with this in messages + var/human_prey_swallow_time = 10 SECONDS // Time in deciseconds to swallow /mob/living/carbon/human + var/nonhuman_prey_swallow_time = 5 SECONDS // Time in deciseconds to swallow anything else + var/emoteTime = 30 SECONDS // How long between stomach emotes at prey + var/digest_brute = 0 // Brute damage per tick in digestion mode + var/digest_burn = 1 // Burn damage per tick in digestion mode + var/digest_tickrate = 9 // Modulus this of air controller tick number to iterate gurgles on + var/immutable = FALSE // Prevents this belly from being deleted + var/escapable = FALSE // Belly can be resisted out of at any time + var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly + var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles +// var/silenced = FALSE // Will the heartbeat/fleshy internal loop play? + var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles. + + var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off. + var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting + var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location + var/autotransferwait = 10 // Time between trying to transfer. + var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. + + var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest. + var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes + var/tmp/mob/living/owner // The mob whose belly this is. + var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly! + var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages) + var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote + var/swallow_time = 10 SECONDS // for mob transfering automation + var/vore_capacity = 1 // The capacity (in people) this person can hold + + // Don't forget to watch your commas at the end of each line if you change these. + var/list/struggle_messages_outside = list( + "%pred's %belly wobbles with a squirming meal.", + "%pred's %belly jostles with movement.", + "%pred's %belly briefly swells outward as someone pushes from inside.", + "%pred's %belly fidgets with a trapped victim.", + "%pred's %belly jiggles with motion from inside.", + "%pred's %belly sloshes around.", + "%pred's %belly gushes softly.", + "%pred's %belly lets out a wet squelch.") + + var/list/struggle_messages_inside = list( + "Your useless squirming only causes %pred's slimy %belly to squelch over your body.", + "Your struggles only cause %pred's %belly to gush softly around you.", + "Your movement only causes %pred's %belly to slosh around you.", + "Your motion causes %pred's %belly to jiggle.", + "You fidget around inside of %pred's %belly.", + "You shove against the walls of %pred's %belly, making it briefly swell outward.", + "You jostle %pred's %belly with movement.", + "You squirm inside of %pred's %belly, making it wobble around.") + + var/list/digest_messages_owner = list( + "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.", + "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.", + "Your %belly lets out a rumble as it melts %prey into sludge.", + "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.", + "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.", + "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.", + "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.") + + var/list/digest_messages_prey = list( + "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.", + "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.", + "%pred's %belly lets out a rumble as it melts you into sludge.", + "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.", + "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.", + "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.", + "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.") + + var/list/examine_messages = list( + "They have something solid in their %belly!", + "It looks like they have something in their %belly!") + + //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into + //a carbon's belly if someone really wanted. No UI for carbons to adjust this. + //List has indexes that are the digestion mode strings, and keys that are lists of strings. + var/list/emote_lists = list() + +//OLD: This only exists for legacy conversion purposes +//It's called whenever an old datum-style belly is loaded +/datum/belly/proc/copy(obj/belly/new_belly) + + //// Non-object variables + new_belly.name = name + new_belly.desc = inside_flavor + new_belly.vore_sound = vore_sound + new_belly.vore_verb = vore_verb + new_belly.human_prey_swallow_time = human_prey_swallow_time + new_belly.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time + new_belly.emote_time = emoteTime + new_belly.digest_brute = digest_brute + new_belly.digest_burn = digest_burn + new_belly.immutable = immutable + new_belly.can_taste = can_taste + new_belly.escapable = escapable + new_belly.escapetime = escapetime + new_belly.digestchance = digestchance + new_belly.escapechance = escapechance + new_belly.transferchance = transferchance + new_belly.transferlocation = transferlocation + + //// Object-holding variables + //struggle_messages_outside - strings + new_belly.struggle_messages_outside.Cut() + for(var/I in struggle_messages_outside) + new_belly.struggle_messages_outside += I + + //struggle_messages_inside - strings + new_belly.struggle_messages_inside.Cut() + for(var/I in struggle_messages_inside) + new_belly.struggle_messages_inside += I + + //digest_messages_owner - strings + new_belly.digest_messages_owner.Cut() + for(var/I in digest_messages_owner) + new_belly.digest_messages_owner += I + + //digest_messages_prey - strings + new_belly.digest_messages_prey.Cut() + for(var/I in digest_messages_prey) + new_belly.digest_messages_prey += I + + //examine_messages - strings + new_belly.examine_messages.Cut() + for(var/I in examine_messages) + new_belly.examine_messages += I + + //emote_lists - index: digest mode, key: list of strings + new_belly.emote_lists.Cut() + for(var/K in emote_lists) + new_belly.emote_lists[K] = list() + for(var/I in emote_lists[K]) + new_belly.emote_lists[K] += I + + return new_belly + +// // // // // // // // // // // // +// // // LEGACY USE ONLY!! // // // +// // // // // // // // // // // // +// See top of file! // +// // // // // // // // // // // // diff --git a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm new file mode 100644 index 0000000000..14ded0b7cc --- /dev/null +++ b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm @@ -0,0 +1,655 @@ +//#define VORE_SOUND_FALLOFF 0.05 + +// +// Belly system 2.0, now using objects instead of datums because EH at datums. +// How many times have I rewritten bellies and vore now? -Aro +// + +// If you change what variables are on this, then you need to update the copy() proc. + +// +// Parent type of all the various "belly" varieties. +// +/obj/belly + name = "belly" // Name of this location + desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels. + var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone + var/vore_verb = "ingest" // Verb for eating with this in messages + var/release_sound = 'sound/effects/splat.ogg' + var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human + var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else + var/emote_time = 60 SECONDS // How long between stomach emotes at prey + var/digest_brute = 2 // Brute damage per tick in digestion mode + var/digest_burn = 2 // Burn damage per tick in digestion mode + var/immutable = FALSE // Prevents this belly from being deleted + var/escapable = TRUE // Belly can be resisted out of at any time + var/escapetime = 20 SECONDS // Deciseconds, how long to escape this belly + var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles + var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles + var/escapechance = 100 // % Chance of prey beginning to escape if prey struggles. + var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. + var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine. +// var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to. + var/silent = FALSE + + var/transferlocation = null // Location that the prey is released if they struggle and get dropped off. + var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting + var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location + var/autotransferwait = 10 // Time between trying to transfer. + var/swallow_time = 10 SECONDS // for mob transfering automation + var/vore_capacity = 1 // simple animal nom capacity + + //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. + var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes + + var/tmp/mob/living/owner // The mob whose belly this is. + var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human) + var/tmp/next_process = 0 // Waiting for this SSbellies times_fired to process again. + var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again. + var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick # + var/tmp/recent_sound = FALSE // Prevent audio spam + + // Don't forget to watch your commas at the end of each line if you change these. + var/list/struggle_messages_outside = list( + "%pred's %belly wobbles with a squirming meal.", + "%pred's %belly jostles with movement.", + "%pred's %belly briefly swells outward as someone pushes from inside.", + "%pred's %belly fidgets with a trapped victim.", + "%pred's %belly jiggles with motion from inside.", + "%pred's %belly sloshes around.", + "%pred's %belly gushes softly.", + "%pred's %belly lets out a wet squelch.") + + var/list/struggle_messages_inside = list( + "Your useless squirming only causes %pred's slimy %belly to squelch over your body.", + "Your struggles only cause %pred's %belly to gush softly around you.", + "Your movement only causes %pred's %belly to slosh around you.", + "Your motion causes %pred's %belly to jiggle.", + "You fidget around inside of %pred's %belly.", + "You shove against the walls of %pred's %belly, making it briefly swell outward.", + "You jostle %pred's %belly with movement.", + "You squirm inside of %pred's %belly, making it wobble around.") + + var/list/digest_messages_owner = list( + "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.", + "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.", + "Your %belly lets out a rumble as it melts %prey into sludge.", + "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.", + "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.", + "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.", + "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.", + "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.") + + var/list/digest_messages_prey = list( + "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.", + "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.", + "%pred's %belly lets out a rumble as it melts you into sludge.", + "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.", + "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.", + "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.", + "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.", + "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.") + + var/list/examine_messages = list( + "They have something solid in their %belly!", + "It looks like they have something in their %belly!") + + //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into + //a carbon's belly if someone really wanted. No UI for carbons to adjust this. + //List has indexes that are the digestion mode strings, and keys that are lists of strings. + var/tmp/list/emote_lists = list() + +//For serialization, keep this updated, required for bellies to save correctly. +/obj/belly/vars_to_save() + return ..() + list( + "name", + "desc", + "vore_sound", + "vore_verb", + "release_sound", + "human_prey_swallow_time", + "nonhuman_prey_swallow_time", + "emote_time", + "digest_brute", + "digest_burn", + "immutable", + "can_taste", + "escapable", + "escapetime", + "digestchance", + "absorbchance", + "escapechance", + "transferchance", + "transferlocation", + "bulge_size", + "struggle_messages_outside", + "struggle_messages_inside", + "digest_messages_owner", + "digest_messages_prey", + "examine_messages", + "emote_lists", + "silent" + ) + + //ommitted list + // "shrink_grow_size", +/obj/belly/New(var/newloc) + . = ..(newloc) + //If not, we're probably just in a prefs list or something. + if(isliving(newloc)) + owner = loc + owner.vore_organs |= src + SSbellies.belly_list += src + +/obj/belly/Destroy() + SSbellies.belly_list -= src + if(owner) + owner.vore_organs -= src + owner = null + . = ..() + +// Called whenever an atom enters this belly +/obj/belly/Entered(var/atom/movable/thing,var/atom/OldLoc) + if(OldLoc in contents) + return //Someone dropping something (or being stripdigested) + + //Generic entered message + to_chat(owner,"[thing] slides into your [lowertext(name)].") + + //Sound w/ antispam flag setting + if(!silent && !recent_sound) + for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + recent_sound = TRUE + + //Messages if it's a mob + if(isliving(thing)) + var/mob/living/M = thing + if(desc) + to_chat(M, "[desc]") + var/taste + if(can_taste && (taste = M.get_taste_message(FALSE))) + to_chat(owner, "[M] tastes of [taste].") + +// Release all contents of this belly into the owning mob's location. +// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in. +// Returns the number of mobs so released. +/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE) + var/atom/destination = drop_location() + var/count = 0 + for(var/thing in contents) + var/atom/movable/AM = thing + if(isliving(AM)) + var/mob/living/L = AM + if(L.absorbed && !include_absorbed) + continue + L.absorbed = FALSE + for(var/mob/living/W in AM) + W.stop_sound_channel(CHANNEL_PREYLOOP) + AM.forceMove(destination) // Move the belly contents into the same location as belly's owner. + count++ + for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + items_preserved.Cut() + owner.visible_message("[owner] expels everything from their [lowertext(name)]!") + owner.update_icons() + + return count + +// Release a specific atom from the contents of this belly into the owning mob's location. +// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in. +// Returns the number of atoms so released. +/obj/belly/proc/release_specific_contents(var/atom/movable/M) + if (!(M in contents)) + return FALSE // They weren't in this belly anyway + + M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner. + items_preserved -= M + for(var/mob/living/P in M) + P.stop_sound_channel(CHANNEL_PREYLOOP) + if(release_sound) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + + if(istype(M,/mob/living)) + var/mob/living/ML = M + var/mob/living/OW = owner + if(ML.absorbed) + ML.absorbed = FALSE + if(ishuman(M) && ishuman(OW)) + var/mob/living/carbon/human/Prey = M + var/mob/living/carbon/human/Pred = OW + var/absorbed_count = 2 //Prey that we were, plus the pred gets a portion + for(var/mob/living/P in contents) + if(P.absorbed) + absorbed_count++ + Pred.reagents.trans_to(Prey, Pred.reagents.total_volume / absorbed_count) + + owner.visible_message("[owner] expels [M] from their [lowertext(name)]!") + owner.update_icons() + return TRUE + +// Actually perform the mechanics of devouring the tasty prey. +// The purpose of this method is to avoid duplicate code, and ensure that all necessary +// steps are taken. +/obj/belly/proc/nom_mob(var/mob/prey, var/mob/user) + var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE) + if(owner.stat == DEAD) + return + if (prey.buckled) + prey.buckled.unbuckle_mob(prey,TRUE) + + prey.forceMove(src) + prey.playsound_local(loc,preyloop,70,0, channel = CHANNEL_PREYLOOP) + owner.updateVRPanel() + + for(var/mob/living/M in contents) + M.updateVRPanel() + + // Setup the autotransfer checks if needed + if(transferlocation && autotransferchance > 0) + addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, prey), autotransferwait) + +/obj/belly/proc/check_autotransfer(var/mob/prey) + // Some sanity checks + if(transferlocation && (autotransferchance > 0) && (prey in contents)) + if(prob(autotransferchance)) + // Double check transferlocation isn't insane + if(verify_transferlocation()) + transfer_contents(prey, transferlocation) + else + // Didn't transfer, so wait before retrying + addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, prey), autotransferwait) + +/obj/belly/proc/verify_transferlocation() + for(var/I in owner.vore_organs) + var/obj/belly/B = owner.vore_organs[I] + if(B == transferlocation) + return TRUE + + for(var/I in owner.vore_organs) + var/obj/belly/B = owner.vore_organs[I] + if(B == transferlocation) + transferlocation = B + return TRUE + return FALSE + + +// Get the line that should show up in Examine message if the owner of this belly +// is examined. By making this a proc, we not only take advantage of polymorphism, +// but can easily make the message vary based on how many people are inside, etc. +// Returns a string which shoul be appended to the Examine output. +/obj/belly/proc/get_examine_msg() + if(contents.len && examine_messages.len) + var/formatted_message + var/raw_message = pick(examine_messages) + var/total_bulge = 0 + + formatted_message = replacetext(raw_message,"%belly",lowertext(name)) + formatted_message = replacetext(formatted_message,"%pred",owner) + formatted_message = replacetext(formatted_message,"%prey",english_list(contents)) + for(var/mob/living/P in contents) + if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach. + total_bulge += P.mob_size + if(total_bulge >= bulge_size && bulge_size != 0) + return("[formatted_message]
") + else + return "" + +// The next function gets the messages set on the belly, in human-readable format. +// This is useful in customization boxes and such. The delimiter right now is \n\n so +// in message boxes, this looks nice and is easily delimited. +/obj/belly/proc/get_messages(var/type, var/delim = "\n\n") + ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em") + var/list/raw_messages + + switch(type) + if("smo") + raw_messages = struggle_messages_outside + if("smi") + raw_messages = struggle_messages_inside + if("dmo") + raw_messages = digest_messages_owner + if("dmp") + raw_messages = digest_messages_prey + if("em") + raw_messages = examine_messages + + var/messages = list2text(raw_messages,delim) + return messages + +// The next function sets the messages on the belly, from human-readable var +// replacement strings and linebreaks as delimiters (two \n\n by default). +// They also sanitize the messages. +/obj/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n") + ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em") + + var/list/raw_list = text2list(html_encode(raw_text),delim) + if(raw_list.len > 10) + raw_list.Cut(11) + testing("[owner] tried to set [lowertext(name)] with 11+ messages") + + for(var/i = 1, i <= raw_list.len, i++) + if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size + raw_list.Cut(i,i) + testing("[owner] tried to set [lowertext(name)] with >121 or <10 char message") + else + raw_list[i] = readd_quotes(raw_list[i]) + //Also fix % sign for var replacement + raw_list[i] = replacetext(raw_list[i],"%","%") + + ASSERT(raw_list.len <= 10) //Sanity + + switch(type) + if("smo") + struggle_messages_outside = raw_list + if("smi") + struggle_messages_inside = raw_list + if("dmo") + digest_messages_owner = raw_list + if("dmp") + digest_messages_prey = raw_list + if("em") + examine_messages = raw_list + + return + +// Handle the death of a mob via digestion. +// Called from the process_Life() methods of bellies that digest prey. +// Default implementation calls M.death() and removes from internal contents. +// Indigestable items are removed, and M is deleted. +/obj/belly/proc/digestion_death(var/mob/living/M) + //M.death(1) // "Stop it he's already dead..." Basically redundant and the reason behind screaming mouse carcasses. + if(M.ckey) + message_admins("[key_name(owner)] has digested [key_name(M)] in their [lowertext(name)] ([owner ? "JMP" : "null"])") + log_attack("[key_name(owner)] digested [key_name(M)].") + + // If digested prey is also a pred... anyone inside their bellies gets moved up. + if(is_vore_predator(M)) + for(var/belly in M.vore_organs) + var/obj/belly/B = belly + for(var/thing in B) + var/atom/movable/AM = thing + AM.forceMove(owner.loc) + if(isliving(AM)) + to_chat(AM,"As [M] melts away around you, you find yourself in [owner]'s [lowertext(name)]") + + //Drop all items into the belly + for(var/obj/item/W in M) + if(!M.dropItemToGround(W)) + qdel(W) + +/* //Reagent transfer //maybe someday + if(ishuman(owner)) + var/mob/living/carbon/human/Pred = owner + if(ishuman(M)) + var/mob/living/carbon/human/Prey = M + Prey.bloodstr.del_reagent("numbenzyme") + Prey.bloodstr.trans_to_holder(Pred.bloodstr, Prey.bloodstr.total_volume, 0.5, TRUE) // Copy=TRUE because we're deleted anyway + Prey.ingested.trans_to_holder(Pred.bloodstr, Prey.ingested.total_volume, 0.5, TRUE) // Therefore don't bother spending cpu + Prey.touching.trans_to_holder(Pred.bloodstr, Prey.touching.total_volume, 0.5, TRUE) // On updating the prey's reagents + else if(M.reagents) + M.reagents.trans_to_holder(Pred.bloodstr, M.reagents.total_volume, 0.5, TRUE) */ + + // Delete the digested mob + qdel(M) + +// Handle a mob being absorbed +/obj/belly/proc/absorb_living(var/mob/living/M) + M.absorbed = TRUE + to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them.") + to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you.") + +// Reagent sharing is neat, but eh. I'll figure it out later +/* if(ishuman(M) && ishuman(owner)) + var/mob/living/carbon/human/Prey = M + var/mob/living/carbon/human/Pred = owner + //Reagent sharing for absorbed with pred - Copy so both pred and prey have these reagents. + Prey.bloodstr.trans_to_holder(Pred.bloodstr, Prey.bloodstr.total_volume, copy = TRUE) + Prey.ingested.trans_to_holder(Pred.bloodstr, Prey.ingested.total_volume, copy = TRUE) + Prey.touching.trans_to_holder(Pred.bloodstr, Prey.touching.total_volume, copy = TRUE) + // TODO - Find a way to make the absorbed prey share the effects with the pred. + // Currently this is infeasible because reagent containers are designed to have a single my_atom, and we get + // problems when A absorbs B, and then C absorbs A, resulting in B holding onto an invalid reagent container. +*/ + //This is probably already the case, but for sub-prey, it won't be. + if(M.loc != src) + M.forceMove(src) + + //Seek out absorbed prey of the prey, absorb them too. + //This in particular will recurse oddly because if there is absorbed prey of prey of prey... + //it will just move them up one belly. This should never happen though since... when they were + //absobred, they should have been absorbed as well! + for(var/belly in M.vore_organs) + var/obj/belly/B = belly + for(var/mob/living/Mm in B) + if(Mm.absorbed) + absorb_living(Mm) + + //Update owner + owner.updateVRPanel() + +//Digest a single item +//Receives a return value from digest_act that's how much nutrition +//the item should be worth +/obj/belly/proc/digest_item(var/obj/item/item) + var/digested = item.digest_act(src, owner) + if(!digested) + items_preserved |= item + else +// owner.nutrition += (5 * digested) // haha no. + if(iscyborg(owner)) + var/mob/living/silicon/robot/R = owner + R.cell.charge += (50 * digested) + +//Determine where items should fall out of us into. +//Typically just to the owner's location. +/obj/belly/drop_location() + //Should be the case 99.99% of the time + if(owner) + return owner.loc + //Sketchy fallback for safety, put them somewhere safe. + else if(ismob(src)) + testing("[src] (\ref[src]) doesn't have an owner, and dropped someone at a latespawn point!") + SSjob.SendToLateJoin(src) + // wew lad. let's see if this never gets used, hopefully + else + qdel(src) //final option, I guess. + testing("[src] (\ref[src]) was QDEL'd for not having a drop_location!") + +//Handle a mob struggling +// Called from /mob/living/carbon/relaymove() +/obj/belly/proc/relay_resist(var/mob/living/R) + if (!(R in contents)) + return // User is not in this belly + + R.setClickCooldown(50) + + if(owner.stat || !owner.client && R.a_intent != INTENT_HELP) //If owner is stat (dead, KO) we can actually escape + to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around 5 seconds.)") + to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!") + + if(do_after(R, 50, owner)) + if(owner.stat && (R in contents) && R.a_intent != INTENT_HELP) //Can still escape and want to? + release_specific_contents(R) + return + else if(!(R in contents)) //Aren't even in the belly. Quietly fail. + return + else //Belly became inescapable or mob revived + to_chat(R,"Your attempt to escape [lowertext(name)] has failed!") + to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") + return + return + var/struggle_outer_message = pick(struggle_messages_outside) + var/struggle_user_message = pick(struggle_messages_inside) + + struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner) + struggle_outer_message = replacetext(struggle_outer_message,"%prey",R) + struggle_outer_message = replacetext(struggle_outer_message,"%belly",lowertext(name)) + + struggle_user_message = replacetext(struggle_user_message,"%pred",owner) + struggle_user_message = replacetext(struggle_user_message,"%prey",R) + struggle_user_message = replacetext(struggle_user_message,"%belly",lowertext(name)) + + struggle_outer_message = "" + struggle_outer_message + "" + struggle_user_message = "" + struggle_user_message + "" + + for(var/mob/M in get_hearers_in_view(3, get_turf(owner))) + M.show_message(struggle_outer_message, 2) // hearable + to_chat(R,struggle_user_message) + + if(!silent) + for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(owner),"struggle_sound",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) + R.stop_sound_channel(CHANNEL_PRED) + var/sound/prey_struggle = sound(get_sfx("prey_struggle")) + R.playsound_local(get_turf(R),prey_struggle,45,0) + + if(R.a_intent != INTENT_HELP) //If on non help intent + to_chat(R,"You start to climb out of \the [lowertext(name)].") + to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!") + if(do_after(R, escapetime, owner)) + if((owner.stat || !owner.client || escapable) && (R in contents)) + release_specific_contents(R) + to_chat(R,"You climb out of \the [lowertext(name)].") + to_chat(owner,"[R] climbs out of your [lowertext(name)]!") + for(var/mob/M in hearers(4, owner)) + M.show_message("[R] climbs out of [owner]'s [lowertext(name)]!", 2) + return + else if(!istype(loc, /obj/belly)) //Aren't even in the belly. Quietly fail. + return + else //Belly became inescapable. + to_chat(R,"Your attempt to escape [lowertext(name)] has failed!") + to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") + return + + else if(prob(transferchance) && transferlocation) //Next, let's have it see if they end up getting into an even bigger mess then when they started. + var/obj/belly/dest_belly + for(var/belly in owner.vore_organs) + var/obj/belly/B = belly + if(B.name == transferlocation) + dest_belly = B + break + if(!dest_belly) + to_chat(owner, "Something went wrong with your belly transfer settings. Your [lowertext(name)] has had it's transfer chance and transfer location cleared as a precaution.") + transferchance = 0 + transferlocation = null + return + + to_chat(R,"Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!") + to_chat(owner,"Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]!") + transfer_contents(R, dest_belly) + return +/* + else if(prob(absorbchance) && digest_mode != DM_ABSORB) //After that, let's have it run the absorb chance. + to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to cling more tightly...") + to_chat(owner,"You feel your [lowertext(name)] start to cling onto its contents...") + digest_mode = DM_ABSORB + return + + else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance. + to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get more active...") + to_chat(owner,"You feel your [lowertext(name)] beginning to become active!") + digest_mode = DM_ITEMWEAK + return + + else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice! + to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get even more active!") + to_chat(owner,"You feel your [lowertext(name)] beginning to become even more active!") + digest_mode = DM_DIGEST + return */ + else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.) + to_chat(R, "In response to your struggling, \the [name] begins to get more active...") + to_chat(owner, "You feel your [name] beginning to become active!") + digest_mode = DM_DIGEST + return + + else //Nothing interesting happened. + to_chat(R,"You make no progress in escaping [owner]'s [lowertext(name)].") + to_chat(owner,"Your prey appears to be unable to make any progress in escaping your [lowertext(name)].") + return + +//Transfers contents from one belly to another +/obj/belly/proc/transfer_contents(var/atom/movable/content, var/obj/belly/target, silent = FALSE) + if(!(content in src) || !istype(target)) + return + target.nom_mob(content, target.owner) + if(!silent) + for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + owner.updateVRPanel() + for(var/mob/living/M in contents) + M.updateVRPanel() + +// Belly copies and then returns the copy +// Needs to be updated for any var changes +/obj/belly/proc/copy(mob/new_owner) + var/obj/belly/dupe = new /obj/belly(new_owner) + + //// Non-object variables + dupe.name = name + dupe.desc = desc + dupe.vore_sound = vore_sound + dupe.vore_verb = vore_verb + dupe.release_sound = release_sound + dupe.human_prey_swallow_time = human_prey_swallow_time + dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time + dupe.emote_time = emote_time + dupe.digest_brute = digest_brute + dupe.digest_burn = digest_burn + dupe.immutable = immutable + dupe.can_taste = can_taste + dupe.escapable = escapable + dupe.escapetime = escapetime + dupe.digestchance = digestchance + dupe.absorbchance = absorbchance + dupe.escapechance = escapechance + dupe.transferchance = transferchance + dupe.transferlocation = transferlocation + dupe.bulge_size = bulge_size +// dupe.shrink_grow_size = shrink_grow_size + + //// Object-holding variables + //struggle_messages_outside - strings + dupe.struggle_messages_outside.Cut() + for(var/I in struggle_messages_outside) + dupe.struggle_messages_outside += I + + //struggle_messages_inside - strings + dupe.struggle_messages_inside.Cut() + for(var/I in struggle_messages_inside) + dupe.struggle_messages_inside += I + + //digest_messages_owner - strings + dupe.digest_messages_owner.Cut() + for(var/I in digest_messages_owner) + dupe.digest_messages_owner += I + + //digest_messages_prey - strings + dupe.digest_messages_prey.Cut() + for(var/I in digest_messages_prey) + dupe.digest_messages_prey += I + + //examine_messages - strings + dupe.examine_messages.Cut() + for(var/I in examine_messages) + dupe.examine_messages += I + + //emote_lists - index: digest mode, key: list of strings + dupe.emote_lists.Cut() + for(var/K in emote_lists) + dupe.emote_lists[K] = list() + for(var/I in emote_lists[K]) + dupe.emote_lists[K] += I + dupe.silent = silent + + return dupe diff --git a/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm new file mode 100644 index 0000000000..3260e2ae99 --- /dev/null +++ b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm @@ -0,0 +1,186 @@ +// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc) +/obj/belly/proc/process_belly(var/times_fired,var/wait) //Passed by controller + if((times_fired < next_process) || !contents.len) + recent_sound = FALSE + return SSBELLIES_IGNORED + + if(loc != owner) + if(istype(owner)) + loc = owner + else + qdel(src) + return SSBELLIES_PROCESSED + + next_process = times_fired + (6 SECONDS/wait) //Set up our next process time. + +/////////////////////////// Auto-Emotes /////////////////////////// + if(contents.len && next_emote <= times_fired) + next_emote = times_fired + round(emote_time/wait,1) + var/list/EL = emote_lists[digest_mode] + for(var/mob/living/M in contents) + if(M.digestable || !(digest_mode == DM_DIGEST)) // don't give digesty messages to indigestible people + to_chat(M,"[pick(EL)]") + +/////////////////////////// Exit Early //////////////////////////// + var/list/touchable_items = contents - items_preserved + if(!length(touchable_items)) + return SSBELLIES_PROCESSED + +////////////////////////// Sound vars ///////////////////////////// + var/sound/prey_digest = sound(get_sfx("digest_prey")) + var/sound/prey_death = sound(get_sfx("death_prey")) + + +///////////////////////////// DM_HOLD ///////////////////////////// + if(digest_mode == DM_HOLD) + return SSBELLIES_PROCESSED + +//////////////////////////// DM_DIGEST //////////////////////////// + else if(digest_mode == DM_DIGEST) + for (var/mob/living/M in contents) + if(prob(25)) + M.stop_sound_channel(CHANNEL_DIGEST) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(CHANNEL_DIGEST) + M.playsound_local(get_turf(M), prey_digest, 45) + + //Pref protection! + if (!M.digestable || M.absorbed) + continue + + //Person just died in guts! + if(M.stat == DEAD) + var/digest_alert_owner = pick(digest_messages_owner) + var/digest_alert_prey = pick(digest_messages_prey) + + //Replace placeholder vars + digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner) + digest_alert_owner = replacetext(digest_alert_owner,"%prey",M) + digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name)) + + digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner) + digest_alert_prey = replacetext(digest_alert_prey,"%prey",M) + digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name)) + + //Send messages + to_chat(owner, "[digest_alert_owner]") + to_chat(M, "[digest_alert_prey]") + M.visible_message("You watch as [owner]'s form loses its additions.") + + owner.nutrition += 400 // so eating dead mobs gives you *something*. + M.stop_sound_channel(DIGESTION_NOISES) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"death_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(DIGESTION_NOISES) + M.stop_sound_channel(CHANNEL_PREYLOOP) + M.playsound_local(get_turf(M), prey_death, 65) + digestion_death(M) + owner.update_icons() + continue + + + // Deal digestion damage (and feed the pred) + if(!(M.status_flags & GODMODE)) + M.adjustFireLoss(digest_burn) + owner.nutrition += 1 + + //Contaminate or gurgle items + var/obj/item/T = pick(touchable_items) + if(istype(T)) + if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ)) + digest_item(T) + + owner.updateVRPanel() + +///////////////////////////// DM_HEAL ///////////////////////////// + if(digest_mode == DM_HEAL) + for (var/mob/living/M in contents) + if(prob(25)) + M.stop_sound_channel(CHANNEL_DIGEST) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(CHANNEL_DIGEST) + M.playsound_local(get_turf(M), prey_digest, 65) + + if(M.stat != DEAD) + if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth)) + M.adjustBruteLoss(-3) + M.adjustFireLoss(-3) + owner.nutrition -= 5 + return + +////////////////////////// DM_NOISY ///////////////////////////////// +//for when you just want people to squelch around + if(digest_mode == DM_NOISY) + for (var/mob/living/M in contents) + if(prob(35)) + M.stop_sound_channel(CHANNEL_DIGEST) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(CHANNEL_PRED) + M.playsound_local(get_turf(M), prey_digest, 65) + + +//////////////////////////DM_DRAGON ///////////////////////////////////// +//because dragons need snowflake guts + if(digest_mode == DM_DRAGON) + for (var/mob/living/M in contents) + if(prob(25)) + M.stop_sound_channel(CHANNEL_DIGEST) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(CHANNEL_DIGEST) + M.playsound_local(get_turf(M), prey_digest, 65) + + //No digestion protection for megafauna. + + //Person just died in guts! + if(M.stat == DEAD) + var/digest_alert_owner = pick(digest_messages_owner) + var/digest_alert_prey = pick(digest_messages_prey) + + //Replace placeholder vars + digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner) + digest_alert_owner = replacetext(digest_alert_owner,"%prey",M) + digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name)) + + digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner) + digest_alert_prey = replacetext(digest_alert_prey,"%prey",M) + digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name)) + + //Send messages + to_chat(owner, "[digest_alert_owner]") + to_chat(M, "[digest_alert_prey]") + M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal.") + + M.stop_sound_channel(CHANNEL_DIGEST) + for(var/mob/H in get_hearers_in_view(5, get_turf(owner))) + if(H.client && H.client.prefs.toggles & DIGESTION_NOISES) + playsound(get_turf(owner),"death_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST) + M.stop_sound_channel(CHANNEL_DIGEST) + M.playsound_local(get_turf(M), prey_death, 65) + M.spill_organs(FALSE,TRUE,TRUE) + M.stop_sound_channel(CHANNEL_PREYLOOP) + digestion_death(M) + owner.update_icons() + continue + + + // Deal digestion damage (and feed the pred) + if(!(M.status_flags & GODMODE)) + M.adjustFireLoss(digest_burn) + M.adjustToxLoss(2) // something something plasma based acids + M.adjustCloneLoss(1) // eventually this'll kill you if you're healing everything else, you nerds. + //Contaminate or gurgle items + var/obj/item/T = pick(touchable_items) + if(istype(T)) + if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ)) + digest_item(T) + + owner.updateVRPanel() \ No newline at end of file diff --git a/modular_citadel/code/modules/vore/eating/digest_act_vr.dm b/modular_citadel/code/modules/vore/eating/digest_act_vr.dm new file mode 100644 index 0000000000..faa458ad56 --- /dev/null +++ b/modular_citadel/code/modules/vore/eating/digest_act_vr.dm @@ -0,0 +1,119 @@ +//Please make sure to: +//return FALSE: You are not going away, stop asking me to digest. +//return non-negative integer: Amount of nutrition/charge gained (scaled to nutrition, other end can multiply for charge scale). + +// Ye default implementation. +/obj/item/proc/digest_act(var/atom/movable/item_storage = null) + for(var/obj/item/O in contents) + if(istype(O,/obj/item/storage/internal)) //Dump contents from dummy pockets. + for(var/obj/item/SO in O) + if(item_storage) + SO.forceMove(item_storage) + qdel(O) + else if(item_storage) + O.forceMove(item_storage) + + qdel(src) + return w_class + +///////////// +// Some indigestible stuff +///////////// +/obj/item/hand_tele/digest_act(...) + return FALSE +/obj/item/card/id/digest_act(...) + return FALSE +/obj/item/aicard/digest_act(...) + return FALSE +/obj/item/paicard/digest_act(...) + return FALSE +/obj/item/pinpointer/digest_act(...) + return FALSE +/obj/item/disk/nuclear/digest_act(...) + return FALSE +/obj/item/device/perfect_tele_beacon/digest_act(...) + return FALSE //Sorta important to not digest your own beacons. +/obj/item/device/pda/digest_act(...) + return FALSE +/obj/item/gun/digest_act(...) + return FALSE +/obj/item/clothing/shoes/magboots/digest_act(...) + return FALSE +/obj/item/clothing/head/helmet/space/digest_act(...) + return FALSE +/obj/item/clothing/suit/space/digest_act(...) + return FALSE +/obj/item/reagent_containers/hypospray/CMO/digest_act(...) + return FALSE +/obj/item/tank/jetpack/oxygen/captain/digest_act(...) + return FALSE +/obj/item/clothing/accessory/medal/gold/captain/digest_act(...) + return FALSE +/obj/item/clothing/suit/armor/digest_act(...) + return FALSE +/obj/item/documents/digest_act(...) + return FALSE +/obj/item/nuke_core/digest_act(...) + return FALSE +/obj/item/nuke_core_container/digest_act(...) + return FALSE +/obj/item/areaeditor/blueprints/digest_act(...) + return FALSE +/obj/item/documents/syndicate/digest_act(...) + return FALSE +/obj/item/bombcore/digest_act(...) + return FALSE +/obj/item/grenade/digest_act(...) + return FALSE +/obj/item/storage/digest_act(...) + return FALSE + +///////////// +// Some special treatment +///////////// +/* +//PDAs need to lose their ID to not take it with them, so we can get a digested ID +/obj/item/device/pda/digest_act(var/atom/movable/item_storage = null) + if(id) + id = null + + . = ..() +*/ + +/obj/item/reagent_containers/food/digest_act(var/atom/movable/item_storage = null) + if(isbelly(item_storage)) + var/obj/belly/B = item_storage + if(ishuman(B.owner)) + var/mob/living/carbon/human/H = B.owner + reagents.trans_to(H, (reagents.total_volume * 0.3), 1, 0) + else if(iscyborg(B.owner)) + var/mob/living/silicon/robot/R = B.owner + R.cell.charge += 150 + + . = ..() + +/* +/obj/item/holder/digest_act(var/atom/movable/item_storage = null) + for(var/mob/living/M in contents) + if(item_storage) + M.forceMove(item_storage) + held_mob = null + + . = ..() */ + +/obj/item/organ/digest_act(var/atom/movable/item_storage = null) + if((. = ..())) + . += 70 //Organs give a little more + +/obj/item/storage/digest_act(var/atom/movable/item_storage = null) + for(var/obj/item/I in contents) + I.screen_loc = null + + . = ..() + +///////////// +// Some more complicated stuff +///////////// +/obj/item/device/mmi/digital/posibrain/digest_act(var/atom/movable/item_storage = null) + //Replace this with a VORE setting so all types of posibrains can/can't be digested on a whim + return FALSE diff --git a/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm similarity index 71% rename from code/modules/vore/eating/living_vr.dm rename to modular_citadel/code/modules/vore/eating/living_vr.dm index 16a63c40ac..5b2ad312ab 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/modular_citadel/code/modules/vore/eating/living_vr.dm @@ -1,23 +1,24 @@ ///////////////////// Mob Living ///////////////////// /mob/living var/digestable = TRUE // Can the mob be digested inside a belly? - var/datum/belly/vore_selected // Default to no vore capability. + var/obj/belly/vore_selected // Default to no vore capability. var/list/vore_organs = list() // List of vore containers inside a mob var/devourable = FALSE // Can the mob be vored at all? // var/feeding = FALSE // Are we going to feed someone else? var/vore_taste = null // What the character tastes like var/no_vore = FALSE // If the character/mob can vore. var/openpanel = 0 // Is the vore panel open? + var/noisy = FALSE // tummies are rumbly? + var/absorbed = FALSE //are we absorbed? // // Hook for generic creation of stuff on new creatures // /hook/living_new/proc/vore_setup(mob/living/M) - M.verbs += /mob/living/proc/lick M.verbs += /mob/living/proc/preyloop_refresh - if(M.no_vore) //If the mob isn's supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. - M << "The creature that you are can not eat others." - return TRUE + M.verbs += /mob/living/proc/lick + if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. + return 1 M.verbs += /mob/living/proc/insidePanel //Tries to load prefs if a client is present otherwise gives freebie stomach @@ -27,44 +28,36 @@ if(M.client && M.client.prefs_vr) if(!M.copy_from_prefs_vr()) - M << "ERROR: You seem to have saved vore prefs, but they couldn't be loaded." - return FALSE + to_chat(M,"ERROR: You seem to have saved vore prefs, but they couldn't be loaded.") + return 0 if(M.vore_organs && M.vore_organs.len) M.vore_selected = M.vore_organs[1] if(!M.vore_organs || !M.vore_organs.len) if(!M.vore_organs) M.vore_organs = list() - var/datum/belly/B = new /datum/belly(M) + var/obj/belly/B = new /obj/belly(M) + M.vore_selected = B B.immutable = TRUE B.name = "Stomach" - B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]" - B.can_taste = TRUE - M.vore_organs[B.name] = B - M.vore_selected = B.name - - //Simple_animal gets emotes. move this to that hook instead? - if(istype(src,/mob/living/simple_animal)) - B.emote_lists[DM_HOLD] = list( - "The insides knead at you gently for a moment.", - "The guts glorp wetly around you as some air shifts.", - "Your predator takes a deep breath and sighs, shifting you somewhat.", - "The stomach squeezes you tight for a moment, then relaxes.", - "During a moment of quiet, breathing becomes the most audible thing.", - "The warm slickness surrounds and kneads on you.") - - B.emote_lists[DM_DIGEST] = list( - "The caustic acids eat away at your form.", - "The acrid air burns at your lungs.", - "Without a thought for you, the stomach grinds inwards painfully.", - "The guts treat you like food, squeezing to press more acids against you.", - "The onslaught against your body doesn't seem to be letting up; you're food now.", - "The insides work on you like they would any other food.") + B.desc = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]." + B.can_taste = FALSE //Return 1 to hook-caller return 1 +/* +// Hide vore organs in contents // +/datum/proc/view_variables_filter_contents(list/L) + return 0 + +/mob/living/view_variables_filter_contents(list/L) + . = ..() + var/len_before = L.len + L -= vore_organs + . += len_before - L.len*/ + // Handle being clicked, perhaps with something to devour // @@ -126,33 +119,37 @@ var/belly = user.vore_selected return perform_dragon(user, prey, user, belly) -/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly, swallow_time = 20) +/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, swallow_time = 20) //Sanity - if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs)) + if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs)) + testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.") return // The belly selected at the time of noms - var/datum/belly/belly_target = pred.vore_organs[belly] var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)" var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)" +/* //Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros + var/user_to_pred = get_dist(get_turf(user),get_turf(pred)) + var/user_to_prey = get_dist(get_turf(user),get_turf(prey)) */ + // Prepare messages if(user == pred) //Feeding someone to yourself - attempt_msg = text("[] starts to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) - success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) + attempt_msg = text("[] starts to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) + success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) // Announce that we start the attempt! user.visible_message(attempt_msg) - if(!do_mob(src, user, swallow_time)) // one second should be good enough, right? + if(!do_mob(src, user, swallow_time)) return FALSE // Prey escaped (or user disabled) before timer expired. // If we got this far, nom successful! Announce it! user.visible_message(success_msg) - playsound(get_turf(user), belly_target.vore_sound,75,0,-6,0) + playsound(get_turf(user), "[belly.vore_sound]",75,0,-6,0) // Actually shove prey into the belly. - belly_target.nom_mob(prey, user) + belly.nom_mob(prey, user) if (pred == user) message_admins("[key_name(pred)] ate [key_name(prey)].") log_attack("[key_name(pred)] ate [key_name(prey)]") @@ -161,43 +158,55 @@ // Master vore proc that actually does vore procedures // -/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly, swallow_time = 100) +/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, var/delay) //Sanity - if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs)) + if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs)) + testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.") return if (!prey.devourable) to_chat(user, "This can't be eaten!") return // The belly selected at the time of noms - var/datum/belly/belly_target = pred.vore_organs[belly] var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)" var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)" +/* //Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros + var/user_to_pred = get_dist(get_turf(user),get_turf(pred)) + var/user_to_prey = get_dist(get_turf(user),get_turf(prey)) */ + // Prepare messages if(user == pred) //Feeding someone to yourself - attempt_msg = text("[] is attemping to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) - success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) + attempt_msg = text("[] is attemping to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) + success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) else //Feeding someone to another person - attempt_msg = text("[] is attempting to make [] [] [] into their []!",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) - success_msg = text("[] manages to make [] [] [] into their []!",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name)) + attempt_msg = text("[] is attempting to make [] [] [] into their []!",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) + success_msg = text("[] manages to make [] [] [] into their []!",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) // Announce that we start the attempt! user.visible_message(attempt_msg) // Now give the prey time to escape... return if they did + var/swallow_time = delay || ishuman(prey) ? belly.human_prey_swallow_time : belly.nonhuman_prey_swallow_time + if(!do_mob(src, user, swallow_time)) return FALSE // Prey escaped (or user disabled) before timer expired. // If we got this far, nom successful! Announce it! user.visible_message(success_msg) - playsound(get_turf(user), belly_target.vore_sound,75,0,-6,0,ignore_walls = FALSE) + for(var/mob/M in get_hearers_in_view(5, get_turf(user))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(user),"[belly.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) // Actually shove prey into the belly. - belly_target.nom_mob(prey, user) + belly.nom_mob(prey, user) // user.update_icons() stop_pulling() + // Flavor handling + if(belly.can_taste && prey.get_taste_message(FALSE)) + to_chat(belly.owner, "[prey] tastes of [prey.get_taste_message(FALSE)].") + // Inform Admins var/prey_braindead var/prey_stat @@ -250,50 +259,38 @@ return 0 */ + +// +// Release everything in every vore organ +// +/mob/living/proc/release_vore_contents(var/include_absorbed = TRUE) + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.release_all_contents(include_absorbed) + // // Custom resist catches for /mob/living // /mob/living/proc/vore_process_resist() //Are we resisting from inside a belly? - var/datum/belly/B = check_belly(src) - if(B) - spawn() B.relay_resist(src) + if(isbelly(loc)) + var/obj/belly/B = loc + B.relay_resist(src) return TRUE //resist() on living does this TRUE thing. //Other overridden resists go here - return FALSE -// -// Proc for updating vore organs and digestion/healing/absorbing -// -/mob/living/proc/handle_internal_contents() - if(SSmobs.times_fired%6==1) - return //The accursed timer - - for (var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - if(B.internal_contents.len) - B.process_Life() //AKA 'do bellymodes_vr.dm' - - for (var/I in vore_organs) - var/datum/belly/B = vore_organs[I] - if(B.internal_contents.len) - listclearnulls(B.internal_contents) - for(var/atom/movable/M in B.internal_contents) - if(M.loc != src) - B.internal_contents.Remove(M) - // internal slimy button in case the loop stops playing but the player wants to hear it /mob/living/proc/preyloop_refresh() set name = "Internal loop refresh" set category = "Vore" - if(ismob(src.loc)) + if(istype(src.loc, /obj/belly)) src.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE) - src.playsound_local(get_turf(src),preyloop,40,0, channel = CHANNEL_PREYLOOP) + src.playsound_local(get_turf(src),preyloop,80,0, channel = CHANNEL_PREYLOOP) else to_chat(src, "You aren't inside anything, you clod.") @@ -309,7 +306,7 @@ var/confirm = alert(src, "You're in a mob. Use this as a trick to get out of hostile animals. If you are in more than one pred, use this more than once.", "Confirmation", "Okay", "Cancel") if(confirm == "Okay") for(var/I in pred.vore_organs) - var/datum/belly/B = pred.vore_organs[I] + var/obj/belly/B = pred.vore_organs[I] B.release_specific_contents(src) for(var/mob/living/simple_animal/SA in range(10)) @@ -355,9 +352,15 @@ P.digestable = src.digestable P.devourable = src.devourable - P.belly_prefs = src.vore_organs P.vore_taste = src.vore_taste + var/list/serialized = list() + for(var/belly in src.vore_organs) + var/obj/belly/B = belly + serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks. + + P.belly_prefs = serialized + return TRUE // @@ -370,16 +373,52 @@ var/datum/vore_preferences/P = client.prefs_vr - src.digestable = P.digestable - src.devourable = P.devourable - src.vore_organs = list() - src.vore_taste = P.vore_taste + digestable = P.digestable + devourable = P.devourable + vore_taste = P.vore_taste - for(var/I in P.belly_prefs) - var/datum/belly/Bp = P.belly_prefs[I] - src.vore_organs[Bp.name] = Bp.copy(src) + vore_organs.Cut() + for(var/entry in P.belly_prefs) + list_to_object(entry,src) return TRUE + +// +// Returns examine messages for bellies +// +/mob/living/proc/examine_bellies() + if(!show_pudge()) //Some clothing or equipment can hide this. + return "" + + var/message = "" + for (var/belly in vore_organs) + var/obj/belly/B = belly + message += B.get_examine_msg() + + return message + +// +// Whether or not people can see our belly messages +// +/mob/living/proc/show_pudge() + return TRUE //Can override if you want. + +/mob/living/carbon/human/show_pudge() + //A uniform could hide it. + if(istype(w_uniform,/obj/item/clothing)) + var/obj/item/clothing/under = w_uniform + if(under.hides_bulges) + return FALSE + + //We return as soon as we find one, no need for 'else' really. + if(istype(wear_suit,/obj/item/clothing)) + var/obj/item/clothing/suit = wear_suit + if(suit.hides_bulges) + return FALSE + + + return ..() + // // Clearly super important. Obviously. // diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/modular_citadel/code/modules/vore/eating/simple_animal_vr.dm similarity index 94% rename from code/modules/vore/eating/simple_animal_vr.dm rename to modular_citadel/code/modules/vore/eating/simple_animal_vr.dm index 4e7c453371..a93eb2fcf4 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/modular_citadel/code/modules/vore/eating/simple_animal_vr.dm @@ -31,7 +31,7 @@ // // Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs. // -/mob/living/proc/animal_nom(var/mob/living/T in oview(1)) +/mob/living/simple_animal/proc/animal_nom(var/mob/living/T in oview(1)) set name = "Animal Nom" set category = "Vore" set desc = "Since you can't grab, you get a verb!" diff --git a/code/modules/vore/eating/vore_vr.dm b/modular_citadel/code/modules/vore/eating/vore_vr.dm similarity index 56% rename from code/modules/vore/eating/vore_vr.dm rename to modular_citadel/code/modules/vore/eating/vore_vr.dm index f6d886e93f..f0ceb97e31 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vore_vr.dm @@ -23,6 +23,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE // Overrides/additions to stock defines go here, as well as hooks. Sort them by // the object they are overriding. So all /mob/living together, etc. // + // // The datum type bolted onto normal preferences datums for storing Vore stuff // @@ -40,21 +41,23 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE //Actual preferences var/digestable = TRUE var/devourable = FALSE +// var/allowmobvore = TRUE var/list/belly_prefs = list() - var/vore_taste + var/vore_taste = "nothing in particular" +// var/can_be_drop_prey = FALSE +// var/can_be_drop_pred = FALSE //Mechanically required var/path var/slot var/client/client var/client_ckey - var/client/parent /datum/vore_preferences/New(client/C) if(istype(C)) client = C client_ckey = C.ckey - load_vore(C) + load_vore() // // Check if an object is capable of eating things, based on vore_organs @@ -68,46 +71,60 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE // // Belly searching for simplifying other procs +// Mostly redundant now with belly-objects and isbelly(loc) // /proc/check_belly(atom/movable/A) - if(istype(A.loc,/mob/living)) - var/mob/living/M = A.loc - for(var/I in M.vore_organs) - var/datum/belly/B = M.vore_organs[I] - if(A in B.internal_contents) - return(B) - - return FALSE + return isbelly(A.loc) // // Save/Load Vore Preferences // +/datum/vore_preferences/proc/load_path(ckey,slot,filename="character",ext="json") + if(!ckey || !slot) return + path = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/vore/[filename][slot].[ext]" + + /datum/vore_preferences/proc/load_vore() - if(!client || !client_ckey) return FALSE //No client, how can we save? + if(!client || !client_ckey) + return FALSE //No client, how can we save? + if(!client.prefs || !client.prefs.default_slot) + return FALSE //Need to know what character to load! slot = client.prefs.default_slot - path = client.prefs.path + load_path(client_ckey,slot) if(!path) return FALSE //Path couldn't be set? if(!fexists(path)) //Never saved before save_vore() //Make the file first return TRUE - var/savefile/S = new /savefile(path) - if(!S) return FALSE //Savefile object couldn't be created? + var/list/json_from_file = json_decode(file2text(path)) + if(!json_from_file) + return FALSE //My concern grows - S.cd = "/character[slot]" + var/version = json_from_file["version"] + json_from_file = patch_version(json_from_file,version) - S["digestable"] >> digestable - S["devourable"] >> devourable - S["belly_prefs"] >> belly_prefs - S["vore_taste"] >> vore_taste + digestable = json_from_file["digestable"] + devourable = json_from_file["devourable"] +// allowmobvore = json_from_file["allowmobvore"] + vore_taste = json_from_file["vore_taste"] +// can_be_drop_prey = json_from_file["can_be_drop_prey"] +// can_be_drop_prey = json_from_file["can_be_drop_pred"] + belly_prefs = json_from_file["belly_prefs"] + //Quick sanitize if(isnull(digestable)) digestable = TRUE if(isnull(devourable)) devourable = FALSE +/* if(isnull(allowmobvore)) + allowmobvore = TRUE + if(isnull(can_be_drop_prey)) + allowmobvore = FALSE + if(isnull(can_be_drop_pred)) + allowmobvore = FALSE */ if(isnull(belly_prefs)) belly_prefs = list() @@ -115,28 +132,37 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE /datum/vore_preferences/proc/save_vore() if(!path) return FALSE - if(!slot) return FALSE - var/savefile/S = new /savefile(path) - if(!S) return FALSE - S.cd = "/character[slot]" - WRITE_FILE(S["digestable"], digestable) - WRITE_FILE(S["devourable"], devourable) - WRITE_FILE(S["belly_prefs"], belly_prefs) - WRITE_FILE(S["vore_taste"], vore_taste) + var/version = 1 //For "good times" use in the future + var/list/settings_list = list( + "version" = version, + "digestable" = digestable, + "devourable" = devourable, + "vore_taste" = vore_taste, + "belly_prefs" = belly_prefs, + ) + + /* commented out list things + "allowmobvore" = allowmobvore, + "can_be_drop_prey" = can_be_drop_prey, + "can_be_drop_pred" = can_be_drop_pred, */ + + //List to JSON + var/json_to_file = json_encode(settings_list) + if(!json_to_file) + testing("Saving: [path] failed jsonencode") + return FALSE + + //Write it out + if(fexists(path)) + fdel(path) //Byond only supports APPENDING to files, not replacing. + text2file(json_to_file,path) + if(!fexists(path)) + testing("Saving: [path] failed file write") + return FALSE return TRUE -#ifdef TESTING -//DEBUG -//Some crude tools for testing savefiles -//path is the savefile path -/client/verb/vore_savefile_export(path as text) - var/savefile/S = new /savefile(path) - S.ExportText("/",file("[path].txt")) -//path is the savefile path -/client/verb/vore_savefile_import(path as text) - var/savefile/S = new /savefile(path) - S.ImportText("/",file("[path].txt")) - -#endif \ No newline at end of file +//Can do conversions here +/datum/vore_preferences/proc/patch_version(var/list/json_from_file,var/version) + return json_from_file \ No newline at end of file diff --git a/code/modules/vore/eating/voreitems.dm b/modular_citadel/code/modules/vore/eating/voreitems.dm similarity index 93% rename from code/modules/vore/eating/voreitems.dm rename to modular_citadel/code/modules/vore/eating/voreitems.dm index 5d157c39fe..741782545a 100644 --- a/code/modules/vore/eating/voreitems.dm +++ b/modular_citadel/code/modules/vore/eating/voreitems.dm @@ -16,7 +16,7 @@ /obj/item/projectile/sickshot name = "sickshot pulse" icon_state = "e_netting" - damage = 1 + damage = 0 damage_type = STAMINA range = 2 @@ -25,8 +25,7 @@ var/mob/living/carbon/H = target if(prob(5)) for(var/X in H.vore_organs) - var/datum/belly/B = H.vore_organs[X] - B.release_all_contents() + H.release_vore_contents() H.visible_message("[H] contracts strangely, spewing out contents on the floor!", \ "You spew out everything inside you on the floor!") return diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm similarity index 59% rename from code/modules/vore/eating/vorepanel_vr.dm rename to modular_citadel/code/modules/vore/eating/vorepanel_vr.dm index e9bb44765f..7d7a48ed28 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm @@ -14,7 +14,7 @@ var/datum/vore_look/picker_holder = new() picker_holder.loop = picker_holder - picker_holder.selected = vore_organs[vore_selected] + picker_holder.selected = vore_selected var/dat = picker_holder.gen_vui(src) @@ -22,11 +22,23 @@ picker_holder.popup.set_content(dat) picker_holder.popup.open() +/mob/living/proc/updateVRPanel() //Panel popup update call from belly events. + if(src.openpanel == 1) + var/datum/vore_look/picker_holder = new() + picker_holder.loop = picker_holder + picker_holder.selected = vore_selected + + var/dat = picker_holder.gen_vui(src) + + picker_holder.popup = new(src, "insidePanel","Vore Panel", 400, 600, picker_holder) + picker_holder.popup.set_content(dat) + picker_holder.popup.open() + // // Callback Handler for the Inside form // /datum/vore_look - var/datum/belly/selected + var/obj/belly/selected var/show_interacts = TRUE var/datum/browser/popup var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action. @@ -44,29 +56,38 @@ /datum/vore_look/proc/gen_vui(var/mob/living/user) var/dat - if (is_vore_predator(user.loc)) - var/mob/living/eater = user.loc - var/datum/belly/inside_belly - - //This big block here figures out where the prey is - inside_belly = check_belly(user) + var/atom/userloc = user.loc + if (isbelly(userloc)) + var/obj/belly/inside_belly = userloc + var/mob/living/eater = inside_belly.owner + //Don't display this part if we couldn't find the belly since could be held in hand. if(inside_belly) - dat += "You are currently inside [eater]'s [inside_belly]!

" + dat += "You are currently [user.absorbed ? "absorbed into " : "inside "] [eater]'s [inside_belly]!

" - if(inside_belly.inside_flavor) - dat += "[inside_belly.inside_flavor]

" + if(inside_belly.desc) + dat += "[inside_belly.desc]

" - if (inside_belly.internal_contents.len > 1) + if (inside_belly.contents.len > 1) dat += "You can see the following around you:
" - for (var/atom/movable/O in inside_belly.internal_contents) + for (var/atom/movable/O in inside_belly) if(istype(O,/mob/living)) var/mob/living/M = O //That's just you if(M == user) continue + + //That's an absorbed person you're checking + if(M.absorbed) + if(user.absorbed) + dat += "[O]" + continue + else + continue + //Anything else - dat += "[O]" + dat += "[O]​" + //Zero-width space, for wrapping dat += "​" else @@ -75,8 +96,8 @@ dat += "
" dat += "
    " - for(var/K in user.vore_organs) //Fuggin can't iterate over values - var/datum/belly/B = user.vore_organs[K] + for(var/belly in user.vore_organs) + var/obj/belly/B = belly if(B == selected) dat += "
  1. [B.name]" else @@ -90,8 +111,10 @@ spanstyle = "color:red;" if(DM_HEAL) spanstyle = "color:green;" + if(DM_NOISY) + spanstyle = "color:purple;" - dat += " ([B.internal_contents.len])
  2. " + dat += " ([B.contents.len])" if(user.vore_organs.len < BELLIES_MAX) dat += "
  3. New+
  4. " @@ -102,15 +125,27 @@ if(!selected) dat += "No belly selected. Click one to select it." else - if(selected.internal_contents.len > 0) + if(selected.contents.len) dat += "Contents: " - for(var/O in selected.internal_contents) + for(var/O in selected) + + //Mobs can be absorbed, so treat them separately from everything else + if(istype(O,/mob/living)) + var/mob/living/M = O + + //Absorbed gets special color OOoOOOOoooo + if(M.absorbed) + dat += "[O]" + continue + + //Anything else dat += "[O]" //Zero-width space, for wrapping dat += "​" + //If there's more than one thing, add an [All] button - if(selected.internal_contents.len > 1) + if(selected.contents.len > 1) dat += "\[All\]" dat += "
    " @@ -129,14 +164,15 @@ //Inside flavortext dat += "
    Flavor Text:" - dat += " '[selected.inside_flavor]'" + dat += " '[selected.desc]'" //Belly sound dat += "
    Set Vore Sound" dat += "Test" - // //Belly silence - // dat += "
    Belly Silence ([selected.silenced ? "Silenced" : "Noisy"])" + //Release sound + dat += "
    Set Release Sound" + dat += "Test" //Belly messages dat += "
    Belly Messages" @@ -145,6 +181,10 @@ dat += "
    Can Taste:" dat += " [selected.can_taste ? "Yes" : "No"]" + //Minimum size prey must be to show up. + dat += "
    Required examine size:" + dat += " [selected.bulge_size*100]%" + //Belly escapability dat += "
    Belly Interactions ([selected.escapable ? "On" : "Off"])" if(selected.escapable) @@ -173,15 +213,21 @@ dat += " [selected.digestchance]%" dat += "
    " + // Belly Silence + dat += "
    Belly Silence (for not belly bellies):" + dat += " [selected.silent ? "Yes" : "No"]" + //Delete button dat += "
    Delete Belly" + dat += "Set Flavor" + dat += "Toggle Hunger Noises" + dat += "
    " //Under the last HR, save and stuff. dat += "Save Prefs" dat += "Refresh" - dat += "Set Flavor" dat += "
    " switch(user.digestable) @@ -221,8 +267,8 @@ if(href_list["outsidepick"]) var/atom/movable/tgt = locate(href_list["outsidepick"]) - var/datum/belly/OB = locate(href_list["outsidebelly"]) - if(!(tgt in OB.internal_contents)) //Aren't here anymore, need to update menu. + var/obj/belly/OB = locate(href_list["outsidebelly"]) + if(!(tgt in OB)) //Aren't here anymore, need to update menu. return TRUE var/intent = "Examine" @@ -234,42 +280,49 @@ M.examine(user) if("Help Out") //Help the inside-mob out - to_chat(user, "You begin to push [M] to freedom!") - to_chat(M, "[usr] begins to push you to freedom!") - M.loc << "Someone is trying to escape from inside you!" + if(user.stat || user.absorbed || M.absorbed) + to_chat(user,"You can't do that in your state!") + return 1 + + to_chat(user,"You begin to push [M] to freedom!") + to_chat(M,"[usr] begins to push you to freedom!") + to_chat(M.loc,"Someone is trying to escape from inside you!") sleep(50) if(prob(33)) OB.release_specific_contents(M) - to_chat(usr, "You manage to help [M] to safety!") - to_chat(M, "[user] pushes you free!") - M.loc << "[M] forces free of the confines of your body!" + to_chat(usr,"You manage to help [M] to safety!") + to_chat(M,"[user] pushes you free!") + to_chat(OB.owner,"[M] forces free of the confines of your body!") else - to_chat(user, "[M] slips back down inside despite your efforts.") - to_chat(M, " Even with [user]'s help, you slip back inside again.") - M.loc << "Your body efficiently shoves [M] back where they belong." + to_chat(user,"[M] slips back down inside despite your efforts.") + to_chat(M," Even with [user]'s help, you slip back inside again.") + to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong.") + if("Devour") //Eat the inside mob + if(user.absorbed || user.stat) + to_chat(user,"You can't do that in your state!") + return 1 + if(!user.vore_selected) - to_chat(user, "Pick a belly on yourself first!") - return + to_chat(user,"Pick a belly on yourself first!") + return 1 - var/datum/belly/TB = user.vore_organs[user.vore_selected] - to_chat(user, "You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") - to_chat(M, "[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") - M.loc << "Someone inside you is eating someone else!" + var/obj/belly/TB = user.vore_selected + to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") + to_chat(M,"[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") + to_chat(OB.owner,"Someone inside you is eating someone else!") - sleep(TB.nonhuman_prey_swallow_time) - if((user in OB.internal_contents) && (M in OB.internal_contents)) - to_chat(user, "You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") - to_chat(M, "[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") - M.loc << "Someone inside you has eaten someone else!" - M.loc = user + sleep(TB.nonhuman_prey_swallow_time) //Can't do after, in a stomach, weird things abound. + if((user in OB) && (M in OB)) //Make sure they're still here. + to_chat(user,"You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") + to_chat(M,"[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") + to_chat(OB.owner,"Someone inside you has eaten someone else!") TB.nom_mob(M) - OB.internal_contents -= M else if(istype(tgt,/obj/item)) var/obj/item/T = tgt - if(!(tgt in OB.internal_contents)) + if(!(tgt in OB.contents)) //Doesn't exist anymore, update. return TRUE intent = alert("What do you want to do to that?","Query","Examine","Use Hand") @@ -301,27 +354,29 @@ return selected.release_all_contents() - playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE) + for(var/mob/M in get_hearers_in_view(5, get_turf(user))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) to_chat(user.loc,"Everything is released from [user]!") if("Move all") if(user.stat) to_chat(user, "You can't do that in your state!") - return + return FALSE - var/choice = input("Move all where?","Select Belly") in user.vore_organs + "Cancel - Don't Move" + var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs + if(!choice) + return FALSE - if(choice == "Cancel - Don't Move") - return - else - var/datum/belly/B = user.vore_organs[choice] - for(var/atom/movable/tgt in selected.internal_contents) - to_chat(tgt, "You're squished from [user]'s [selected] to their [B]!") - selected.transfer_contents(tgt, B, 1) - playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE) + for(var/atom/movable/tgt in selected) + selected.transfer_contents(tgt, choice, 1) + for(var/mob/M in get_hearers_in_view(5, get_turf(user))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) + to_chat(tgt,"You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]!") var/atom/movable/tgt = locate(href_list["insidepick"]) - if(!(tgt in selected.internal_contents)) //Old menu, needs updating because they aren't really there. + if(!(tgt in selected)) //Old menu, needs updating because they aren't really there. return TRUE//Forces update intent = "Examine" intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move") @@ -335,48 +390,54 @@ return FALSE selected.release_specific_contents(tgt) - playsound(get_turf(user),'sound/effects/splat.ogg',50,0,-5,0,ignore_walls = FALSE) + for(var/mob/M in get_hearers_in_view(5, get_turf(user))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) user.loc << "[tgt] is released from [user]!" if("Move") if(user.stat) - to_chat(user, "You can't do that in your state!") - return FALSE + to_chat(user,"You can't do that in your state!") + return 0 - var/choice = input("Move [tgt] where?","Select Belly") in user.vore_organs + "Cancel - Don't Move" + var/obj/belly/choice = input("Move [tgt] where?","Select Belly") as null|anything in user.vore_organs + if(!choice || !(tgt in selected)) + return 0 - if(choice == "Cancel - Don't Move") - return - else - var/datum/belly/B = user.vore_organs[choice] - if (!(tgt in selected.internal_contents)) - return FALSE - to_chat(tgt, "You're moved from [user]'s [lowertext(selected.name)] to their [lowertext(B.name)]!") - playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE) - selected.transfer_contents(tgt, B) + to_chat(tgt,"You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(choice.name)]!") + selected.transfer_contents(tgt, choice) + for(var/mob/M in get_hearers_in_view(5, get_turf(user))) + if(M.client && M.client.prefs.toggles & EATING_NOISES) + playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED) if(href_list["newbelly"]) if(user.vore_organs.len >= BELLIES_MAX) - return TRUE + return 0 var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null) + var/failure_msg if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN) - to_chat(usr, "Entered belly name is too long.") - return FALSE - if(new_name in user.vore_organs) - to_chat(usr, "No duplicate belly names, please.") - return FALSE + failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])." + // else if(whatever) //Next test here. + else + for(var/belly in user.vore_organs) + var/obj/belly/B = belly + if(lowertext(new_name) == lowertext(B.name)) + failure_msg = "No duplicate belly names, please." + break - var/datum/belly/NB = new(user) + if(failure_msg) //Something went wrong. + alert(user,failure_msg,"Error!") + return 0 + + var/obj/belly/NB = new(user) NB.name = new_name - NB.owner = user //might be the thing we all needed. - user.vore_organs[new_name] = NB selected = NB if(href_list["bellypick"]) selected = locate(href_list["bellypick"]) - user.vore_selected = selected.name + user.vore_selected = selected //// //Please keep these the same order they are on the panel UI for ease of coding @@ -384,41 +445,40 @@ if(href_list["b_name"]) var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null) + var/failure_msg if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN) - to_chat(usr, "Entered belly name length invalid (must be longer than 2, shorter than 12).") - return FALSE - if(new_name in user.vore_organs) - to_chat(usr, "No duplicate belly names, please.") - return FALSE + failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])." + // else if(whatever) //Next test here. + else + for(var/belly in user.vore_organs) + var/obj/belly/B = belly + if(lowertext(new_name) == lowertext(B.name)) + failure_msg = "No duplicate belly names, please." + break + + if(failure_msg) //Something went wrong. + alert(user,failure_msg,"Error!") + return 0 - user.vore_organs[new_name] = selected - user.vore_organs -= selected.name selected.name = new_name if(href_list["b_mode"]) var/list/menu_list = selected.digest_modes - if(selected.digest_modes.len == 1) // Don't do anything - return 1 - if(selected.digest_modes.len == 2) // Just toggle... there's probably a more elegant way to do this... - var/index = selected.digest_modes.Find(selected.digest_mode) - switch(index) - if(1) - selected.digest_mode = selected.digest_modes[2] - if(2) - selected.digest_mode = selected.digest_modes[1] - else - selected.digest_mode = input("Choose Mode (currently [selected.digest_mode])") in menu_list + var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list + if(!new_mode) + return 0 + selected.digest_mode = new_mode if(href_list["b_desc"]) - var/new_desc = html_encode(input(usr,"Belly Description (1024 char limit):","New Description",selected.inside_flavor) as message|null) + var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",selected.desc) as message|null) + if(new_desc) new_desc = readd_quotes(new_desc) if(length(new_desc) > BELLIES_DESC_MAX) - to_chat(usr, "Entered belly desc too long. [BELLIES_DESC_MAX] character limit.") + alert("Entered belly desc too long. [BELLIES_DESC_MAX] character limit.","Error") return FALSE - - selected.inside_flavor = new_desc + selected.desc = new_desc else //Returned null return FALSE @@ -429,12 +489,11 @@ "Struggle Message (outside)", "Struggle Message (inside)", "Examine Message (when full)", - "Reset All To Default", - "Cancel - No Changes" + "Reset All To Default" ) alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message, max 10 messages per topic.","Really, don't.") - var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") in messages + var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") as null|anything in messages var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name." switch(choice) @@ -459,7 +518,7 @@ selected.set_messages(new_message,"smi") if("Examine Message (when full)") - var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging'). "+help,"Examine Message (when full)",selected.get_messages("em")) as message + var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",selected.get_messages("em")) as message if(new_message) selected.set_messages(new_message,"em") @@ -471,40 +530,57 @@ selected.struggle_messages_outside = initial(selected.struggle_messages_outside) selected.struggle_messages_inside = initial(selected.struggle_messages_inside) - if("Cancel - No Changes") - return - if(href_list["b_verb"]) var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null) if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN) - to_chat(usr, "Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).") - return FALSE + alert("Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error") + return 0 selected.vore_verb = new_verb - if(href_list["b_sound"]) - var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") in GLOB.pred_vore_sounds + "Cancel - No Changes" + if(href_list["b_release"]) + var/choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in GLOB.release_sound - if(choice == "Cancel") + if(!choice) + return + + selected.release_sound = GLOB.release_sound[choice] + + if(href_list["b_releasesoundtest"]) + var/soundfile = GLOB.release_sound[selected.release_sound] + if(soundfile) + user << soundfile + + if(href_list["b_sound"]) + var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in GLOB.pred_vore_sounds + + if(!choice) return selected.vore_sound = GLOB.pred_vore_sounds[choice] if(href_list["b_soundtest"]) - user << selected.vore_sound -/* - if(href_list["silenced"]) - if(selected.silenced == FALSE) - selected.silenced = TRUE - to_chat(usr,"The [selected.name] is now silenced, it will not play the internal loop to prey within it.") - else if(selected.silenced == TRUE) - selected.silenced = FALSE - to_chat(usr,"The [selected.name] will play the internal loop to prey within it.") -*/ + var/soundfile = GLOB.pred_vore_sounds[selected.vore_sound] + if(soundfile) + user << soundfile + if(href_list["b_tastes"]) selected.can_taste = !selected.can_taste + if(href_list["b_bulge_size"]) + var/new_bulge = input(user, "Choose the required size prey must be to show up on examine, ranging from 25% to 200% Set this to 0 for no text on examine.", "Set Belly Examine Size.") as num|null + if(new_bulge == null) + return + if(new_bulge == 0) //Disable. + selected.bulge_size = 0 + to_chat(user,"Your stomach will not be seen on examine.") + else if (!IsInRange(new_bulge,25,200)) + selected.bulge_size = 0.25 //Set it to the default. + to_chat(user,"Invalid size.") + else if(new_bulge) + selected.bulge_size = (new_bulge/100) + if(href_list["b_escapable"]) if(selected.escapable == FALSE) //Possibly escapable and special interactions. selected.escapable = TRUE @@ -515,7 +591,7 @@ show_interacts = FALSE //Force the hiding of the panel else to_chat(usr,"Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.") //If they somehow have a varable that's not 0 or 1 - selected.escapable = FALSE + selected.escapable = TRUE show_interacts = FALSE //Force the hiding of the panel if(href_list["b_escapechance"]) @@ -537,68 +613,73 @@ var/choice = input("Where do you want your [selected.name] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected.name) if(!choice) //They cancelled, no changes - return + return FALSE else if(choice == "None - Remove") selected.transferlocation = null else selected.transferlocation = user.vore_organs[choice] + if(href_list["b_absorbchance"]) + var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null + if(!isnull(absorb_chance_input)) + selected.absorbchance = sanitize_integer(absorb_chance_input, 0, 100, initial(selected.absorbchance)) + if(href_list["b_digestchance"]) var/digest_chance_input = input(user, "Set belly digest mode chance on resist (as %)", "Prey Digest Chance") as num|null if(!isnull(digest_chance_input)) selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(selected.digestchance)) + if(href_list["b_silent"]) + selected.silent = !selected.silent + if(href_list["b_del"]) - var/dest_for = FALSE //Check to see if it's the destination of another vore organ. - for(var/I in user.vore_organs) - var/datum/belly/B = user.vore_organs[I] + var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel") + if(!alert == "Delete") + return FALSE + + var/failure_msg = "" + + var/dest_for //Check to see if it's the destination of another vore organ. + for(var/belly in user.vore_organs) + var/obj/belly/B = belly if(B.transferlocation == selected) dest_for = B.name + failure_msg += "This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it. " break - if(dest_for) - alert("This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it.","Error") - return TRUE - else if(selected.internal_contents.len) - alert("Can't delete bellies with contents!","Error") - return TRUE - if(selected.internal_contents.len) - to_chat(usr, "Can't delete bellies with contents!") - return - else if(selected.immutable) - to_chat(usr, "This belly is marked as undeletable.") - return - else if(user.vore_organs.len == 1) - to_chat(usr, "You must have at least one belly.") - return - else - var/alert = alert("Are you sure you want to delete [selected]?","Confirmation","Delete","Cancel") - if(alert == "Delete" && !selected.internal_contents.len) - user.vore_organs -= selected.name - user.vore_organs.Remove(selected) - selected = user.vore_organs[1] - user.vore_selected = user.vore_organs[1] - to_chat(usr,"Note: If you had this organ selected as a transfer location, please remove the transfer location by selecting Cancel - None - Remove on this stomach.") + if(selected.contents.len) + failure_msg += "You cannot delete bellies with contents! " //These end with spaces, to be nice looking. Make sure you do the same. + if(selected.immutable) + failure_msg += "This belly is marked as undeletable. " + if(user.vore_organs.len == 1) + failure_msg += "You must have at least one belly. " + + if(failure_msg) + alert(user,failure_msg,"Error!") + return FALSE + + qdel(selected) + selected = user.vore_organs[1] + user.vore_selected = user.vore_organs[1] if(href_list["saveprefs"]) - if(user.save_vore_prefs()) - to_chat(user, "Belly Preferences saved!") + if(!user.save_vore_prefs()) + to_chat(user, "Belly Preferences not saved!") else - to_chat(user, "ERROR: Belly Preferences were not saved!") + to_chat(user, "Belly Preferences were saved!") log_admin("Could not save vore prefs on USER: [user].") if(href_list["setflavor"]) var/new_flavor = html_encode(input(usr,"What your character tastes like (40ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",user.vore_taste) as text|null) + if(!new_flavor) + return 0 - if(new_flavor) - new_flavor = readd_quotes(new_flavor) - if(length(new_flavor) > FLAVOR_MAX) - alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error") - return FALSE - user.vore_taste = new_flavor - else //Returned null - return FALSE + new_flavor = readd_quotes(new_flavor) + if(length(new_flavor) > FLAVOR_MAX) + alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!") + return 0 + user.vore_taste = new_flavor if(href_list["toggledg"]) var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") @@ -626,5 +707,15 @@ if(user.client.prefs_vr) user.client.prefs_vr.devourable = user.devourable + if(href_list["togglenoisy"]) + var/choice = alert(user, "Toggle audible hunger noises. Currently: [user.noisy ? "Enabled" : "Disabled"]", "", "Enable audible hunger", "Cancel", "Disable audible hunger") + switch(choice) + if("Cancel") + return 0 + if("Enable audible hunger") + user.noisy = TRUE + if("Disable audible hunger") + user.noisy = FALSE + //Refresh when interacted with, returning 1 makes vore_look.Topic update - return TRUE + return 1 \ No newline at end of file diff --git a/code/modules/vore/hook-defs_vr.dm b/modular_citadel/code/modules/vore/hook-defs_vr.dm similarity index 100% rename from code/modules/vore/hook-defs_vr.dm rename to modular_citadel/code/modules/vore/hook-defs_vr.dm diff --git a/modular_citadel/code/modules/vore/persistence.dm b/modular_citadel/code/modules/vore/persistence.dm new file mode 100644 index 0000000000..078a3f48ee --- /dev/null +++ b/modular_citadel/code/modules/vore/persistence.dm @@ -0,0 +1,90 @@ +/* +* Returns a byond list that can be passed to the "deserialize" proc +* to bring a new instance of this atom to its original state +* +* If we want to store this info, we can pass it to `json_encode` or some other +* interface that suits our fancy, to make it into an easily-handled string +*/ +/datum/proc/serialize() + var/data = list("type" = "[type]") + return data + +/* +* This is given the byond list from above, to bring this atom to the state +* described in the list. +* This will be called after `New` but before `initialize`, so linking and stuff +* would probably be handled in `initialize` +* +* Also, this should only be called by `list_to_object` in persistence.dm - at least +* with current plans - that way it can actually initialize the type from the list +*/ +/datum/proc/deserialize(var/list/data) + return + +/atom + // This var isn't actually used for anything, but is present so that + // DM's map reader doesn't forfeit on reading a JSON-serialized map + var/map_json_data + +// This is so specific atoms can override these, and ignore certain ones +/atom/proc/vars_to_save() + return list("color","dir","icon","icon_state","name","pixel_x","pixel_y") + +/atom/proc/map_important_vars() + // A list of important things to save in the map editor + return list("color","dir","icon","icon_state","layer","name","pixel_x","pixel_y") + +/area/map_important_vars() + // Keep the area default icons, to keep things nice and legible + return list("name") + +// No need to save any state of an area by default +/area/vars_to_save() + return list("name") + +/atom/serialize() + var/list/data = ..() + for(var/thing in vars_to_save()) + if(vars[thing] != initial(vars[thing])) + data[thing] = vars[thing] + return data + + +/atom/deserialize(var/list/data) + for(var/thing in vars_to_save()) + if(thing in data) + vars[thing] = data[thing] + ..() + + +/* +Whoops, forgot to put documentation here. +What this does, is take a JSON string produced by running +BYOND's native `json_encode` on a list from `serialize` above, and +turns that string into a new instance of that object. + +You can also easily get an instance of this string by calling "Serialize Marked Datum" +in the "Debug" tab. + +If you're clever, you can do neat things with SDQL and this, though be careful - +some objects, like humans, are dependent that certain extra things are defined +in their list +*/ +/proc/object_to_json(var/atom/movable/thing) + return json_encode(thing.serialize()) + +/proc/json_to_object(var/json_data, var/loc) + return list_to_object(json_decode(json_data), loc) + +/proc/list_to_object(var/list/data, var/loc) + if(!islist(data)) + throw EXCEPTION("You didn't give me a list, bucko") + if(!("type" in data)) + throw EXCEPTION("No 'type' field in the data") + var/path = text2path(data["type"]) + if(!path) + throw EXCEPTION("Path not found: [path]") + + var/atom/movable/thing = new path(loc) + thing.deserialize(data) + return thing \ No newline at end of file diff --git a/code/modules/vore/resizing/grav_pull_vr.dm b/modular_citadel/code/modules/vore/resizing/grav_pull_vr.dm similarity index 100% rename from code/modules/vore/resizing/grav_pull_vr.dm rename to modular_citadel/code/modules/vore/resizing/grav_pull_vr.dm diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/modular_citadel/code/modules/vore/resizing/holder_micro_vr.dm similarity index 100% rename from code/modules/vore/resizing/holder_micro_vr.dm rename to modular_citadel/code/modules/vore/resizing/holder_micro_vr.dm diff --git a/code/modules/vore/resizing/resize_vr.dm b/modular_citadel/code/modules/vore/resizing/resize_vr.dm similarity index 100% rename from code/modules/vore/resizing/resize_vr.dm rename to modular_citadel/code/modules/vore/resizing/resize_vr.dm diff --git a/code/modules/vore/resizing/sizechemicals.dm b/modular_citadel/code/modules/vore/resizing/sizechemicals.dm similarity index 98% rename from code/modules/vore/resizing/sizechemicals.dm rename to modular_citadel/code/modules/vore/resizing/sizechemicals.dm index 78b4bd71ca..1164bf65d6 100644 --- a/code/modules/vore/resizing/sizechemicals.dm +++ b/modular_citadel/code/modules/vore/resizing/sizechemicals.dm @@ -110,6 +110,6 @@ for(var/atom/movable/A in B.internal_contents) if(prob(55)) playsound(M, 'sound/effects/splat.ogg', 50, 1) - B.release_specific_contents(A) + B.release_vore_contents(A) ..() . = 1 \ No newline at end of file diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/modular_citadel/code/modules/vore/resizing/sizegun_vr.dm similarity index 100% rename from code/modules/vore/resizing/sizegun_vr.dm rename to modular_citadel/code/modules/vore/resizing/sizegun_vr.dm diff --git a/code/modules/vore/trycatch_vr.dm b/modular_citadel/code/modules/vore/trycatch_vr.dm similarity index 100% rename from code/modules/vore/trycatch_vr.dm rename to modular_citadel/code/modules/vore/trycatch_vr.dm diff --git a/code/citadel/icons/misc.dmi b/modular_citadel/icons/misc/misc.dmi similarity index 100% rename from code/citadel/icons/misc.dmi rename to modular_citadel/icons/misc/misc.dmi diff --git a/modular_citadel/icons/mob/clothing/fed hats n modern.dmi b/modular_citadel/icons/mob/clothing/fed hats n modern.dmi new file mode 100644 index 0000000000..ab8682b785 Binary files /dev/null and b/modular_citadel/icons/mob/clothing/fed hats n modern.dmi differ diff --git a/modular_citadel/icons/mob/clothing/fedcoats.dmi b/modular_citadel/icons/mob/clothing/fedcoats.dmi new file mode 100644 index 0000000000..6554b3a45d Binary files /dev/null and b/modular_citadel/icons/mob/clothing/fedcoats.dmi differ diff --git a/modular_citadel/icons/mob/clothing/trek_item_icon.dmi b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi new file mode 100644 index 0000000000..4ac77773a0 Binary files /dev/null and b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi differ diff --git a/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi b/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi new file mode 100644 index 0000000000..9323ea9f3c Binary files /dev/null and b/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi differ diff --git a/modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi b/modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi new file mode 100644 index 0000000000..b438c7acee Binary files /dev/null and b/modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi differ diff --git a/modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi b/modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi new file mode 100644 index 0000000000..dda226b046 Binary files /dev/null and b/modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi differ diff --git a/modular_citadel/icons/mob/inhands/guns_lefthand.dmi b/modular_citadel/icons/mob/inhands/guns_lefthand.dmi new file mode 100644 index 0000000000..601cc921d7 Binary files /dev/null and b/modular_citadel/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/modular_citadel/icons/mob/inhands/guns_righthand.dmi b/modular_citadel/icons/mob/inhands/guns_righthand.dmi new file mode 100644 index 0000000000..c76907d2e8 Binary files /dev/null and b/modular_citadel/icons/mob/inhands/guns_righthand.dmi differ diff --git a/modular_citadel/icons/mob/legacy robo transforms.dmi b/modular_citadel/icons/mob/legacy robo transforms.dmi new file mode 100644 index 0000000000..a9baa71ac5 Binary files /dev/null and b/modular_citadel/icons/mob/legacy robo transforms.dmi differ diff --git a/code/citadel/icons/mobs.dmi b/modular_citadel/icons/mob/mobs.dmi similarity index 100% rename from code/citadel/icons/mobs.dmi rename to modular_citadel/icons/mob/mobs.dmi diff --git a/modular_citadel/icons/mob/robots.dmi b/modular_citadel/icons/mob/robots.dmi index a81f672b2b..9da2a97cc6 100644 Binary files a/modular_citadel/icons/mob/robots.dmi and b/modular_citadel/icons/mob/robots.dmi differ diff --git a/code/citadel/icons/drinks.dmi b/modular_citadel/icons/obj/drinks.dmi similarity index 100% rename from code/citadel/icons/drinks.dmi rename to modular_citadel/icons/obj/drinks.dmi diff --git a/code/citadel/icons/breasts.dmi b/modular_citadel/icons/obj/genitals/breasts.dmi similarity index 100% rename from code/citadel/icons/breasts.dmi rename to modular_citadel/icons/obj/genitals/breasts.dmi diff --git a/code/citadel/icons/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi similarity index 100% rename from code/citadel/icons/breasts_onmob.dmi rename to modular_citadel/icons/obj/genitals/breasts_onmob.dmi diff --git a/code/citadel/icons/dildo.dmi b/modular_citadel/icons/obj/genitals/dildo.dmi similarity index 100% rename from code/citadel/icons/dildo.dmi rename to modular_citadel/icons/obj/genitals/dildo.dmi diff --git a/code/citadel/icons/effects.dmi b/modular_citadel/icons/obj/genitals/effects.dmi similarity index 100% rename from code/citadel/icons/effects.dmi rename to modular_citadel/icons/obj/genitals/effects.dmi diff --git a/code/citadel/icons/hud.dmi b/modular_citadel/icons/obj/genitals/hud.dmi similarity index 100% rename from code/citadel/icons/hud.dmi rename to modular_citadel/icons/obj/genitals/hud.dmi diff --git a/code/citadel/icons/onahole.dmi b/modular_citadel/icons/obj/genitals/onahole.dmi similarity index 100% rename from code/citadel/icons/onahole.dmi rename to modular_citadel/icons/obj/genitals/onahole.dmi diff --git a/code/citadel/icons/ovipositor.dmi b/modular_citadel/icons/obj/genitals/ovipositor.dmi similarity index 100% rename from code/citadel/icons/ovipositor.dmi rename to modular_citadel/icons/obj/genitals/ovipositor.dmi diff --git a/code/citadel/icons/penis.dmi b/modular_citadel/icons/obj/genitals/penis.dmi similarity index 100% rename from code/citadel/icons/penis.dmi rename to modular_citadel/icons/obj/genitals/penis.dmi diff --git a/code/citadel/icons/penis_onmob.dmi b/modular_citadel/icons/obj/genitals/penis_onmob.dmi similarity index 100% rename from code/citadel/icons/penis_onmob.dmi rename to modular_citadel/icons/obj/genitals/penis_onmob.dmi diff --git a/code/citadel/icons/taur_penis_onmob.dmi b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi similarity index 100% rename from code/citadel/icons/taur_penis_onmob.dmi rename to modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi diff --git a/code/citadel/icons/vagina.dmi b/modular_citadel/icons/obj/genitals/vagina.dmi similarity index 100% rename from code/citadel/icons/vagina.dmi rename to modular_citadel/icons/obj/genitals/vagina.dmi diff --git a/code/citadel/icons/vagina_onmob.dmi b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi similarity index 100% rename from code/citadel/icons/vagina_onmob.dmi rename to modular_citadel/icons/obj/genitals/vagina_onmob.dmi diff --git a/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi b/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi new file mode 100644 index 0000000000..9a902e0dff Binary files /dev/null and b/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi differ diff --git a/modular_citadel/icons/obj/guns/energy.dmi b/modular_citadel/icons/obj/guns/energy.dmi deleted file mode 100644 index 21d348b66e..0000000000 Binary files a/modular_citadel/icons/obj/guns/energy.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/guns/pumpactionblaster.dmi b/modular_citadel/icons/obj/guns/pumpactionblaster.dmi new file mode 100644 index 0000000000..363faf3c57 Binary files /dev/null and b/modular_citadel/icons/obj/guns/pumpactionblaster.dmi differ diff --git a/modular_citadel/icons/obj/guns/toys.dmi b/modular_citadel/icons/obj/guns/toys.dmi new file mode 100644 index 0000000000..3c8595f405 Binary files /dev/null and b/modular_citadel/icons/obj/guns/toys.dmi differ diff --git a/modular_citadel/icons/obj/hypospraymkii.dmi b/modular_citadel/icons/obj/hypospraymkii.dmi new file mode 100644 index 0000000000..f5e89227c7 Binary files /dev/null and b/modular_citadel/icons/obj/hypospraymkii.dmi differ diff --git a/code/citadel/icons/objects.dmi b/modular_citadel/icons/obj/objects.dmi similarity index 100% rename from code/citadel/icons/objects.dmi rename to modular_citadel/icons/obj/objects.dmi diff --git a/modular_citadel/icons/obj/projectiles.dmi b/modular_citadel/icons/obj/projectiles.dmi new file mode 100644 index 0000000000..f5f6f2f8f3 Binary files /dev/null and b/modular_citadel/icons/obj/projectiles.dmi differ diff --git a/modular_citadel/icons/obj/projectiles_impact.dmi b/modular_citadel/icons/obj/projectiles_impact.dmi new file mode 100644 index 0000000000..1d798b5e9e Binary files /dev/null and b/modular_citadel/icons/obj/projectiles_impact.dmi differ diff --git a/modular_citadel/icons/obj/projectiles_muzzle.dmi b/modular_citadel/icons/obj/projectiles_muzzle.dmi new file mode 100644 index 0000000000..2116b0559c Binary files /dev/null and b/modular_citadel/icons/obj/projectiles_muzzle.dmi differ diff --git a/modular_citadel/icons/obj/projectiles_tracer.dmi b/modular_citadel/icons/obj/projectiles_tracer.dmi new file mode 100644 index 0000000000..e26e8501f1 Binary files /dev/null and b/modular_citadel/icons/obj/projectiles_tracer.dmi differ diff --git a/code/citadel/icons/structures.dmi b/modular_citadel/icons/obj/structures.dmi similarity index 100% rename from code/citadel/icons/structures.dmi rename to modular_citadel/icons/obj/structures.dmi diff --git a/modular_citadel/icons/obj/vial.dmi b/modular_citadel/icons/obj/vial.dmi new file mode 100644 index 0000000000..694cc1741b Binary files /dev/null and b/modular_citadel/icons/obj/vial.dmi differ diff --git a/modular_citadel/icons/ui/screen_clockwork.dmi b/modular_citadel/icons/ui/screen_clockwork.dmi new file mode 100644 index 0000000000..499d2663b6 Binary files /dev/null and b/modular_citadel/icons/ui/screen_clockwork.dmi differ diff --git a/modular_citadel/icons/ui/screen_gen.dmi b/modular_citadel/icons/ui/screen_gen.dmi new file mode 100644 index 0000000000..d006185a3c Binary files /dev/null and b/modular_citadel/icons/ui/screen_gen.dmi differ diff --git a/modular_citadel/icons/ui/screen_midnight.dmi b/modular_citadel/icons/ui/screen_midnight.dmi new file mode 100644 index 0000000000..38d96b86d1 Binary files /dev/null and b/modular_citadel/icons/ui/screen_midnight.dmi differ diff --git a/modular_citadel/icons/ui/screen_operative.dmi b/modular_citadel/icons/ui/screen_operative.dmi new file mode 100644 index 0000000000..7296db1f9c Binary files /dev/null and b/modular_citadel/icons/ui/screen_operative.dmi differ diff --git a/modular_citadel/icons/ui/screen_plasmafire.dmi b/modular_citadel/icons/ui/screen_plasmafire.dmi new file mode 100644 index 0000000000..2829b22d59 Binary files /dev/null and b/modular_citadel/icons/ui/screen_plasmafire.dmi differ diff --git a/modular_citadel/icons/ui/screen_slimecore.dmi b/modular_citadel/icons/ui/screen_slimecore.dmi new file mode 100644 index 0000000000..0f24033da6 Binary files /dev/null and b/modular_citadel/icons/ui/screen_slimecore.dmi differ diff --git a/modular_citadel/sound/misc/sprintactivate.ogg b/modular_citadel/sound/misc/sprintactivate.ogg new file mode 100644 index 0000000000..f499765dc2 Binary files /dev/null and b/modular_citadel/sound/misc/sprintactivate.ogg differ diff --git a/modular_citadel/sound/misc/sprintdeactivate.ogg b/modular_citadel/sound/misc/sprintdeactivate.ogg new file mode 100644 index 0000000000..c22587ace0 Binary files /dev/null and b/modular_citadel/sound/misc/sprintdeactivate.ogg differ diff --git a/modular_citadel/sound/misc/ui_toggle.ogg b/modular_citadel/sound/misc/ui_toggle.ogg new file mode 100644 index 0000000000..7336b9cf0e Binary files /dev/null and b/modular_citadel/sound/misc/ui_toggle.ogg differ diff --git a/modular_citadel/sound/misc/ui_toggleoff.ogg b/modular_citadel/sound/misc/ui_toggleoff.ogg new file mode 100644 index 0000000000..98df1726e9 Binary files /dev/null and b/modular_citadel/sound/misc/ui_toggleoff.ogg differ diff --git a/modular_citadel/sound/weapons/LaserSlugv3.ogg b/modular_citadel/sound/weapons/LaserSlugv3.ogg new file mode 100644 index 0000000000..dbb8f4b954 Binary files /dev/null and b/modular_citadel/sound/weapons/LaserSlugv3.ogg differ diff --git a/modular_citadel/sound/weapons/ParticleBlaster.ogg b/modular_citadel/sound/weapons/ParticleBlaster.ogg new file mode 100644 index 0000000000..ae0ae165f9 Binary files /dev/null and b/modular_citadel/sound/weapons/ParticleBlaster.ogg differ diff --git a/modular_citadel/sound/weapons/laserPump.ogg b/modular_citadel/sound/weapons/laserPump.ogg new file mode 100644 index 0000000000..4063765c5b Binary files /dev/null and b/modular_citadel/sound/weapons/laserPump.ogg differ diff --git a/modular_citadel/sound/weapons/laserPumpEmpty.ogg b/modular_citadel/sound/weapons/laserPumpEmpty.ogg new file mode 100644 index 0000000000..ce82e2bd9d Binary files /dev/null and b/modular_citadel/sound/weapons/laserPumpEmpty.ogg differ diff --git a/sound/ambience/LICENSE.txt b/sound/ambience/LICENSE.txt index d1d18306a6..5fb0ece74d 100644 --- a/sound/ambience/LICENSE.txt +++ b/sound/ambience/LICENSE.txt @@ -2,3 +2,5 @@ ambidet1.ogg is Fast Talking by Kevin Macleod. It has been licensed under the CC It has been cropped for use ingame. ambidet2.ogg is Night on the Docks, Piano by Kevin Macleod. It has been licensed under CC-BY 3.0 license. It has been cropped for use ingame, and also fades in. +aurora_caelus.ogg is Music for Manatees, by Kevin Macleod. It has been licensed under CC-BY 3.0 license. + It has been cropped for use ingame, and also fades out. diff --git a/sound/ambience/aurora_caelus.ogg b/sound/ambience/aurora_caelus.ogg new file mode 100644 index 0000000000..0c741678d5 Binary files /dev/null and b/sound/ambience/aurora_caelus.ogg differ diff --git a/sound/items/hypospray.ogg b/sound/items/hypospray.ogg new file mode 100644 index 0000000000..b70d3fd5b5 Binary files /dev/null and b/sound/items/hypospray.ogg differ diff --git a/sound/items/hypospray2.ogg b/sound/items/hypospray2.ogg new file mode 100644 index 0000000000..14835e9bb6 Binary files /dev/null and b/sound/items/hypospray2.ogg differ diff --git a/sound/items/hypospray_long.ogg b/sound/items/hypospray_long.ogg new file mode 100644 index 0000000000..d7da6c839f Binary files /dev/null and b/sound/items/hypospray_long.ogg differ diff --git a/strings/tips.txt b/strings/tips.txt index 939110deb5..8f68853b42 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -31,7 +31,7 @@ As a Medical Doctor, you can surgically implant or extract things from people's As a Medical Doctor, you must target the correct limb and be on help intent when trying to perform surgery on someone. As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. Experiment! As a Chemist, some chemicals can only be synthesized by heating up the contents in the chemical heater. -As a Geneticist, you can eject someone from cloning early by disabling power in genetics. Note that they will suffer more genetic damage from this. +As a Geneticist, you can eject someone from cloning early by disabling power in genetics. Note that they will suffer more genetic damage and may lose vital organs from this. As a Geneticist, becoming a hulk makes you capable of dealing high melee damage, stunlocking people, and punching through walls. However, you can't fire guns, will lose your hulk status if you take too much damage, and are not considered a human by the AI while you are a hulk. As the Virologist, your viruses can range from healing powers so great that you can heal out of critical status, or diseases so dangerous they can kill the entire crew with airborne spontaneous combustion. Experiment! As the Virologist, you only require small amounts of vaccine to heal a sick patient. Work with the Chemist to distribute your cures more efficiently. @@ -122,7 +122,7 @@ As a Nuclear Operative, stick together! While your equipment is robust, your fel As a Nuclear Operative, you might end up in a situation where the AI has bolted you into a room. Having some spare C4 in your pocket can save your life. As a Monkey, you can crawl through air or scrubber vents by alt+left clicking them. You must drop everything you are wearing and holding to do this, however. As a Monkey, you can still wear a few human items, such as backpacks, gas masks and hats, and still have two free hands. -As the Malfunctioning AI, you can shunt to an APC if the situation gets bad. This can allow the clock to tick down long enough for you to win, but keep in mind the crew's pinpointer will point to you when you do this. +As the Malfunctioning AI, you can shunt to an APC if the situation gets bad. This disables your doomsday device if it is active. As the Malfunctioning AI, you should either order your cyborgs to dismantle the robotics console or blow it up yourself in order to protect them. As the Malfunctioning AI, look into flooding the station with plasma fires to kill off large portions of the crew, letting you pick off the remaining few with space suits who escaped. As an Alien, your melee prowess is unmatched, but your ranged abilities are sorely lacking. Make use of corners to force a melee confrontation! @@ -155,8 +155,7 @@ As a Cultist, you can create an army of manifested goons using a combination of As a Cultist or Servant, check the alert in the upper-right of your screen for all the details about your cult's current status and objective. As a Servant, your jumpsuit functions like a chameleon suit and can take on a lot of different appearances. Use this for stealth and disguise! As a Servant, you can unlock scripture tiers early by stockpiling large amounts of power. -As a Servant, stargazers are a very important tool for power generation, and you should be making them constantly. -As a Servant, stargazers only work if they can see space, and do *not* work on the City of Cogs. +As a Servant, integration cogs are your primary source of power generation, and you should use as many as possible. As a Servant, Abscond also brings anyone you're dragging to Reebe at the cost of some extra power. As a Servant, wraith spectacles let you see everything through walls at virtually no drawback. Just take them off if someone might see you! As a Servant, declaring war empowers a huge amount of your tools and constructs, and makes you into a spaceproof, armored clockwork automaton. diff --git a/tgstation.dme b/tgstation.dme index cae3e0521a..5f971c4690 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -92,6 +92,7 @@ #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wall_dents.dm" #include "code\__DEFINES\wires.dm" +#include "code\__HELPERS\_cit_helpers.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" @@ -133,6 +134,7 @@ #include "code\_globalvars\genetics.dm" #include "code\_globalvars\logging.dm" #include "code\_globalvars\misc.dm" +#include "code\_globalvars\regexes.dm" #include "code\_globalvars\lists\flavor_misc.dm" #include "code\_globalvars\lists\maintenance_loot.dm" #include "code\_globalvars\lists\mapping.dm" @@ -182,42 +184,6 @@ #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\swarmer.dm" -#include "code\citadel\_cit_helpers.dm" -#include "code\citadel\cit_areas.dm" -#include "code\citadel\cit_arousal.dm" -#include "code\citadel\cit_clothes.dm" -#include "code\citadel\cit_crewobjectives.dm" -#include "code\citadel\cit_displaycases.dm" -#include "code\citadel\cit_emotes.dm" -#include "code\citadel\cit_guns.dm" -#include "code\citadel\cit_kegs.dm" -#include "code\citadel\cit_miscreants.dm" -#include "code\citadel\cit_reagents.dm" -#include "code\citadel\cit_spawners.dm" -#include "code\citadel\cit_uniforms.dm" -#include "code\citadel\cit_vendors.dm" -#include "code\citadel\dogborgstuff.dm" -#include "code\citadel\plasmacases.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_cargo.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_civilian.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_command.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_engineering.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_medical.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_science.dm" -#include "code\citadel\crew_objectives\cit_crewobjectives_security.dm" -#include "code\citadel\custom_loadout\custom_items.dm" -#include "code\citadel\custom_loadout\load_to_mob.dm" -#include "code\citadel\custom_loadout\read_from_file.dm" -#include "code\citadel\organs\breasts.dm" -#include "code\citadel\organs\eggsack.dm" -#include "code\citadel\organs\genitals.dm" -#include "code\citadel\organs\genitals_sprite_accessories.dm" -#include "code\citadel\organs\ovipositor.dm" -#include "code\citadel\organs\penis.dm" -#include "code\citadel\organs\testicles.dm" -#include "code\citadel\organs\vagina.dm" -#include "code\citadel\organs\womb.dm" -#include "code\citadel\toys\dildos.dm" #include "code\controllers\admin.dm" #include "code\controllers\configuration_citadel.dm" #include "code\controllers\controller.dm" @@ -257,6 +223,7 @@ #include "code\controllers\subsystem\medals.dm" #include "code\controllers\subsystem\minimap.dm" #include "code\controllers\subsystem\mobs.dm" +#include "code\controllers\subsystem\moods.dm" #include "code\controllers\subsystem\nightshift.dm" #include "code\controllers\subsystem\npcpool.dm" #include "code\controllers\subsystem\orbit.dm" @@ -282,6 +249,7 @@ #include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\title.dm" #include "code\controllers\subsystem\traumas.dm" +#include "code\controllers\subsystem\vore.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\processing\circuit.dm" @@ -292,6 +260,7 @@ #include "code\controllers\subsystem\processing\obj.dm" #include "code\controllers\subsystem\processing\processing.dm" #include "code\controllers\subsystem\processing\projectiles.dm" +#include "code\controllers\subsystem\processing\traits.dm" #include "code\datums\action.dm" #include "code\datums\ai_laws.dm" #include "code\datums\armor.dm" @@ -307,6 +276,7 @@ #include "code\datums\dog_fashion.dm" #include "code\datums\embedding_behavior.dm" #include "code\datums\emotes.dm" +#include "code\datums\ert.dm" #include "code\datums\explosion.dm" #include "code\datums\forced_movement.dm" #include "code\datums\holocall.dm" @@ -347,12 +317,14 @@ #include "code\datums\components\caltrop.dm" #include "code\datums\components\chasm.dm" #include "code\datums\components\cleaning.dm" +#include "code\datums\components\construction.dm" #include "code\datums\components\decal.dm" #include "code\datums\components\forensics.dm" #include "code\datums\components\infective.dm" #include "code\datums\components\jousting.dm" #include "code\datums\components\knockoff.dm" #include "code\datums\components\material_container.dm" +#include "code\datums\components\mood.dm" #include "code\datums\components\ntnet_interface.dm" #include "code\datums\components\paintable.dm" #include "code\datums\components\rad_insulation.dm" @@ -398,7 +370,6 @@ #include "code\datums\diseases\advance\symptoms\fever.dm" #include "code\datums\diseases\advance\symptoms\fire.dm" #include "code\datums\diseases\advance\symptoms\flesh_eating.dm" -#include "code\datums\diseases\advance\symptoms\genetics.dm" #include "code\datums\diseases\advance\symptoms\hallucigen.dm" #include "code\datums\diseases\advance\symptoms\headache.dm" #include "code\datums\diseases\advance\symptoms\heal.dm" @@ -418,7 +389,6 @@ #include "code\datums\diseases\advance\symptoms\vomit.dm" #include "code\datums\diseases\advance\symptoms\weight.dm" #include "code\datums\diseases\advance\symptoms\youth.dm" -#include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\icon_snapshot.dm" @@ -431,10 +401,16 @@ #include "code\datums\martial\boxing.dm" #include "code\datums\martial\cqc.dm" #include "code\datums\martial\krav_maga.dm" +#include "code\datums\martial\mushpunch.dm" #include "code\datums\martial\plasma_fist.dm" #include "code\datums\martial\psychotic_brawl.dm" #include "code\datums\martial\sleeping_carp.dm" #include "code\datums\martial\wrestling.dm" +#include "code\datums\mood_events\drug_events.dm" +#include "code\datums\mood_events\generic_negative_events.dm" +#include "code\datums\mood_events\generic_positive_events.dm" +#include "code\datums\mood_events\mood_event.dm" +#include "code\datums\mood_events\needs_events.dm" #include "code\datums\mutations\body.dm" #include "code\datums\mutations\chameleon.dm" #include "code\datums\mutations\cold_resistance.dm" @@ -449,6 +425,10 @@ #include "code\datums\status_effects\gas.dm" #include "code\datums\status_effects\neutral.dm" #include "code\datums\status_effects\status_effect.dm" +#include "code\datums\traits\_trait.dm" +#include "code\datums\traits\good.dm" +#include "code\datums\traits\negative.dm" +#include "code\datums\traits\neutral.dm" #include "code\datums\weather\weather.dm" #include "code\datums\weather\weather_types\acid_rain.dm" #include "code\datums\weather\weather_types\advanced_darkness.dm" @@ -469,7 +449,6 @@ #include "code\datums\wires\robot.dm" #include "code\datums\wires\suit_storage_unit.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\game\alternate_appearance.dm" @@ -537,6 +516,7 @@ #include "code\game\machinery\dna_scanner.dm" #include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\droneDispenser.dm" +#include "code\game\machinery\exp_cloner.dm" #include "code\game\machinery\firealarm.dm" #include "code\game\machinery\flasher.dm" #include "code\game\machinery\gulag_item_reclaimer.dm" @@ -798,8 +778,10 @@ #include "code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "code\game\objects\items\circuitboards\machine_circuitboards.dm" #include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\beacon.dm" #include "code\game\objects\items\devices\camera_bug.dm" #include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\dogborg_sleeper.dm" #include "code\game\objects\items\devices\doorCharge.dm" #include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm" #include "code\game\objects\items\devices\flashlight.dm" @@ -826,7 +808,6 @@ #include "code\game\objects\items\devices\PDA\PDA_types.dm" #include "code\game\objects\items\devices\PDA\radio.dm" #include "code\game\objects\items\devices\PDA\virus_cart.dm" -#include "code\game\objects\items\devices\radio\beacon.dm" #include "code\game\objects\items\devices\radio\electropack.dm" #include "code\game\objects\items\devices\radio\encryptionkey.dm" #include "code\game\objects\items\devices\radio\headset.dm" @@ -852,6 +833,7 @@ #include "code\game\objects\items\implants\implant_krav_maga.dm" #include "code\game\objects\items\implants\implant_loyality.dm" #include "code\game\objects\items\implants\implant_misc.dm" +#include "code\game\objects\items\implants\implant_spell.dm" #include "code\game\objects\items\implants\implant_storage.dm" #include "code\game\objects\items\implants\implant_track.dm" #include "code\game\objects\items\implants\implantcase.dm" @@ -1047,6 +1029,7 @@ #include "code\modules\admin\ipintel.dm" #include "code\modules\admin\IsBanned.dm" #include "code\modules\admin\NewBan.dm" +#include "code\modules\admin\permissionedit.dm" #include "code\modules\admin\player_panel.dm" #include "code\modules\admin\secrets.dm" #include "code\modules\admin\sound_emitter.dm" @@ -1055,7 +1038,6 @@ #include "code\modules\admin\topic.dm" #include "code\modules\admin\whitelist.dm" #include "code\modules\admin\DB_ban\functions.dm" -#include "code\modules\admin\permissionverbs\permissionedit.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" #include "code\modules\admin\verbs\adminpm.dm" @@ -1087,6 +1069,7 @@ #include "code\modules\admin\verbs\pray.dm" #include "code\modules\admin\verbs\randomverbs.dm" #include "code\modules\admin\verbs\reestablish_db_connection.dm" +#include "code\modules\admin\verbs\spawnobjasmob.dm" #include "code\modules\admin\verbs\tripAI.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" @@ -1213,6 +1196,11 @@ #include "code\modules\antagonists\devil\sintouched\objectives.dm" #include "code\modules\antagonists\devil\true_devil\_true_devil.dm" #include "code\modules\antagonists\devil\true_devil\inventory.dm" +#include "code\modules\antagonists\disease\disease_abilities.dm" +#include "code\modules\antagonists\disease\disease_datum.dm" +#include "code\modules\antagonists\disease\disease_disease.dm" +#include "code\modules\antagonists\disease\disease_event.dm" +#include "code\modules\antagonists\disease\disease_mob.dm" #include "code\modules\antagonists\ert\ert.dm" #include "code\modules\antagonists\greentext\greentext.dm" #include "code\modules\antagonists\highlander\highlander.dm" @@ -1456,6 +1444,7 @@ #include "code\modules\events\anomaly_grav.dm" #include "code\modules\events\anomaly_pyro.dm" #include "code\modules\events\anomaly_vortex.dm" +#include "code\modules\events\aurora_caelus.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" #include "code\modules\events\camerafailure.dm" @@ -1516,7 +1505,6 @@ #include "code\modules\fields\turf_objects.dm" #include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Hallucination.dm" -#include "code\modules\flufftext\TextFilters.dm" #include "code\modules\food_and_drinks\food.dm" #include "code\modules\food_and_drinks\pizzabox.dm" #include "code\modules\food_and_drinks\drinks\drinks.dm" @@ -1640,6 +1628,7 @@ #include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" #include "code\modules\integrated_electronics\passive\passive.dm" #include "code\modules\integrated_electronics\passive\power.dm" +#include "code\modules\integrated_electronics\subtypes\access.dm" #include "code\modules\integrated_electronics\subtypes\arithmetic.dm" #include "code\modules\integrated_electronics\subtypes\converters.dm" #include "code\modules\integrated_electronics\subtypes\data_transfer.dm" @@ -1690,6 +1679,7 @@ #include "code\modules\language\language_menu.dm" #include "code\modules\language\machine.dm" #include "code\modules\language\monkey.dm" +#include "code\modules\language\mushroom.dm" #include "code\modules\language\narsian.dm" #include "code\modules\language\ratvarian.dm" #include "code\modules\language\slime.dm" @@ -1881,6 +1871,7 @@ #include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm" #include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\mothmen.dm" +#include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm" #include "code\modules\mob\living\carbon\human\species_types\podpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm" @@ -2192,29 +2183,57 @@ #include "code\modules\procedural_mapping\mapGenerators\repair.dm" #include "code\modules\procedural_mapping\mapGenerators\shuttle.dm" #include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" -#include "code\modules\projectiles\ammunition.dm" -#include "code\modules\projectiles\box_magazine.dm" -#include "code\modules\projectiles\firing.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\pins.dm" #include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\ammo_casings.dm" -#include "code\modules\projectiles\ammunition\caseless.dm" -#include "code\modules\projectiles\ammunition\energy.dm" -#include "code\modules\projectiles\ammunition\plasma.dm" -#include "code\modules\projectiles\ammunition\special.dm" +#include "code\modules\projectiles\ammunition\_ammunition.dm" +#include "code\modules\projectiles\ammunition\_firing.dm" +#include "code\modules\projectiles\ammunition\ballistic\lmg.dm" +#include "code\modules\projectiles\ammunition\ballistic\pistol.dm" +#include "code\modules\projectiles\ammunition\ballistic\revolver.dm" +#include "code\modules\projectiles\ammunition\ballistic\rifle.dm" +#include "code\modules\projectiles\ammunition\ballistic\shotgun.dm" +#include "code\modules\projectiles\ammunition\ballistic\smg.dm" +#include "code\modules\projectiles\ammunition\ballistic\sniper.dm" +#include "code\modules\projectiles\ammunition\caseless\_caseless.dm" +#include "code\modules\projectiles\ammunition\caseless\foam.dm" +#include "code\modules\projectiles\ammunition\caseless\misc.dm" +#include "code\modules\projectiles\ammunition\caseless\rocket.dm" +#include "code\modules\projectiles\ammunition\energy\_energy.dm" +#include "code\modules\projectiles\ammunition\energy\chameleon.dm" +#include "code\modules\projectiles\ammunition\energy\ebow.dm" +#include "code\modules\projectiles\ammunition\energy\gravity.dm" +#include "code\modules\projectiles\ammunition\energy\laser.dm" +#include "code\modules\projectiles\ammunition\energy\lmg.dm" +#include "code\modules\projectiles\ammunition\energy\plasma.dm" +#include "code\modules\projectiles\ammunition\energy\plasma_cit.dm" +#include "code\modules\projectiles\ammunition\energy\portal.dm" +#include "code\modules\projectiles\ammunition\energy\special.dm" +#include "code\modules\projectiles\ammunition\energy\stun.dm" +#include "code\modules\projectiles\ammunition\special\magic.dm" +#include "code\modules\projectiles\ammunition\special\syringe.dm" +#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm" #include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm" -#include "code\modules\projectiles\boxes_magazines\external_mag.dm" -#include "code\modules\projectiles\boxes_magazines\internal_mag.dm" +#include "code\modules\projectiles\boxes_magazines\external\grenade.dm" +#include "code\modules\projectiles\boxes_magazines\external\lmg.dm" +#include "code\modules\projectiles\boxes_magazines\external\pistol.dm" +#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm" +#include "code\modules\projectiles\boxes_magazines\external\rifle.dm" +#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm" +#include "code\modules\projectiles\boxes_magazines\external\smg.dm" +#include "code\modules\projectiles\boxes_magazines\external\sniper.dm" +#include "code\modules\projectiles\boxes_magazines\external\toy.dm" +#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm" +#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm" +#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm" +#include "code\modules\projectiles\boxes_magazines\internal\misc.dm" +#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm" +#include "code\modules\projectiles\boxes_magazines\internal\rifle.dm" +#include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm" +#include "code\modules\projectiles\boxes_magazines\internal\toy.dm" #include "code\modules\projectiles\guns\ballistic.dm" -#include "code\modules\projectiles\guns\beam_rifle.dm" -#include "code\modules\projectiles\guns\chem_gun.dm" #include "code\modules\projectiles\guns\energy.dm" -#include "code\modules\projectiles\guns\grenade_launcher.dm" #include "code\modules\projectiles\guns\magic.dm" -#include "code\modules\projectiles\guns\medbeam.dm" -#include "code\modules\projectiles\guns\mounted.dm" -#include "code\modules\projectiles\guns\syringe_gun.dm" #include "code\modules\projectiles\guns\ballistic\automatic.dm" #include "code\modules\projectiles\guns\ballistic\laser_gatling.dm" #include "code\modules\projectiles\guns\ballistic\launchers.dm" @@ -2226,21 +2245,58 @@ #include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" #include "code\modules\projectiles\guns\energy\laser.dm" #include "code\modules\projectiles\guns\energy\megabuster.dm" -#include "code\modules\projectiles\guns\energy\plasma.dm" +#include "code\modules\projectiles\guns\energy\mounted.dm" +#include "code\modules\projectiles\guns\energy\plasma_cit.dm" #include "code\modules\projectiles\guns\energy\pulse.dm" #include "code\modules\projectiles\guns\energy\special.dm" #include "code\modules\projectiles\guns\energy\stun.dm" #include "code\modules\projectiles\guns\magic\staff.dm" #include "code\modules\projectiles\guns\magic\wand.dm" +#include "code\modules\projectiles\guns\misc\beam_rifle.dm" #include "code\modules\projectiles\guns\misc\blastcannon.dm" +#include "code\modules\projectiles\guns\misc\chem_gun.dm" +#include "code\modules\projectiles\guns\misc\grenade_launcher.dm" +#include "code\modules\projectiles\guns\misc\medbeam.dm" +#include "code\modules\projectiles\guns\misc\syringe_gun.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\energy.dm" #include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\megabuster.dm" #include "code\modules\projectiles\projectile\plasma.dm" -#include "code\modules\projectiles\projectile\reusable.dm" -#include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\projectiles\projectile\bullets\_incendiary.dm" +#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" +#include "code\modules\projectiles\projectile\bullets\dnainjector.dm" +#include "code\modules\projectiles\projectile\bullets\grenade.dm" +#include "code\modules\projectiles\projectile\bullets\lmg.dm" +#include "code\modules\projectiles\projectile\bullets\pistol.dm" +#include "code\modules\projectiles\projectile\bullets\revolver.dm" +#include "code\modules\projectiles\projectile\bullets\rifle.dm" +#include "code\modules\projectiles\projectile\bullets\shotgun.dm" +#include "code\modules\projectiles\projectile\bullets\smg.dm" +#include "code\modules\projectiles\projectile\bullets\sniper.dm" +#include "code\modules\projectiles\projectile\bullets\special.dm" +#include "code\modules\projectiles\projectile\energy\_energy.dm" +#include "code\modules\projectiles\projectile\energy\chameleon.dm" +#include "code\modules\projectiles\projectile\energy\ebow.dm" +#include "code\modules\projectiles\projectile\energy\misc.dm" +#include "code\modules\projectiles\projectile\energy\net_snare.dm" +#include "code\modules\projectiles\projectile\energy\stun.dm" +#include "code\modules\projectiles\projectile\energy\tesla.dm" +#include "code\modules\projectiles\projectile\reusable\_reusable.dm" +#include "code\modules\projectiles\projectile\reusable\foam_dart.dm" +#include "code\modules\projectiles\projectile\reusable\magspear.dm" +#include "code\modules\projectiles\projectile\special\curse.dm" +#include "code\modules\projectiles\projectile\special\floral.dm" +#include "code\modules\projectiles\projectile\special\gravity.dm" +#include "code\modules\projectiles\projectile\special\hallucination.dm" +#include "code\modules\projectiles\projectile\special\ion.dm" +#include "code\modules\projectiles\projectile\special\meteor.dm" +#include "code\modules\projectiles\projectile\special\mindflayer.dm" +#include "code\modules\projectiles\projectile\special\neurotoxin.dm" +#include "code\modules\projectiles\projectile\special\plasma.dm" +#include "code\modules\projectiles\projectile\special\rocket.dm" +#include "code\modules\projectiles\projectile\special\temperature.dm" +#include "code\modules\projectiles\projectile\special\wormhole.dm" #include "code\modules\reagents\chem_splash.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" @@ -2276,6 +2332,7 @@ #include "code\modules\reagents\reagent_containers\dropper.dm" #include "code\modules\reagents\reagent_containers\glass.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\medspray.dm" #include "code\modules\reagents\reagent_containers\patch.dm" #include "code\modules\reagents\reagent_containers\pill.dm" #include "code\modules\reagents\reagent_containers\spray.dm" @@ -2289,13 +2346,9 @@ #include "code\modules\recycling\disposal\outlet.dm" #include "code\modules\recycling\disposal\pipe.dm" #include "code\modules\recycling\disposal\pipe_sorting.dm" -#include "code\modules\research\circuitprinter.dm" -#include "code\modules\research\departmental_circuit_imprinter.dm" -#include "code\modules\research\departmental_lathe.dm" #include "code\modules\research\designs.dm" #include "code\modules\research\destructive_analyzer.dm" #include "code\modules\research\experimentor.dm" -#include "code\modules\research\protolathe.dm" #include "code\modules\research\rdconsole.dm" #include "code\modules\research\rdmachines.dm" #include "code\modules\research\research_disk.dm" @@ -2321,6 +2374,13 @@ #include "code\modules\research\designs\stock_parts_designs.dm" #include "code\modules\research\designs\telecomms_designs.dm" #include "code\modules\research\designs\weapon_designs.dm" +#include "code\modules\research\machinery\_production.dm" +#include "code\modules\research\machinery\circuit_imprinter.dm" +#include "code\modules\research\machinery\departmental_circuit_imprinter.dm" +#include "code\modules\research\machinery\departmental_protolathe.dm" +#include "code\modules\research\machinery\departmental_techfab.dm" +#include "code\modules\research\machinery\protolathe.dm" +#include "code\modules\research\machinery\techfab.dm" #include "code\modules\research\techweb\__techweb_helpers.dm" #include "code\modules\research\techweb\_techweb.dm" #include "code\modules\research\techweb\_techweb_node.dm" @@ -2337,6 +2397,7 @@ #include "code\modules\ruins\spaceruin_code\asteroid4.dm" #include "code\modules\ruins\spaceruin_code\bigderelict1.dm" #include "code\modules\ruins\spaceruin_code\caravanambush.dm" +#include "code\modules\ruins\spaceruin_code\cloning_lab.dm" #include "code\modules\ruins\spaceruin_code\crashedclownship.dm" #include "code\modules\ruins\spaceruin_code\crashedship.dm" #include "code\modules\ruins\spaceruin_code\deepstorage.dm" @@ -2508,15 +2569,6 @@ #include "code\modules\vehicles\speedbike.dm" #include "code\modules\vehicles\vehicle_actions.dm" #include "code\modules\vehicles\vehicle_key.dm" -#include "code\modules\vore\hook-defs_vr.dm" -#include "code\modules\vore\trycatch_vr.dm" -#include "code\modules\vore\eating\belly_vr.dm" -#include "code\modules\vore\eating\bellymodes_vr.dm" -#include "code\modules\vore\eating\living_vr.dm" -#include "code\modules\vore\eating\simple_animal_vr.dm" -#include "code\modules\vore\eating\vore_vr.dm" -#include "code\modules\vore\eating\voreitems.dm" -#include "code\modules\vore\eating\vorepanel_vr.dm" #include "code\modules\VR\vr_human.dm" #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" @@ -2533,26 +2585,42 @@ #include "modular_citadel\hopefully_temporary_patches.dm" #include "modular_citadel\simplemob_vore_values.dm" #include "modular_citadel\code\init.dm" +#include "modular_citadel\code\__HELPERS\list2list.dm" #include "modular_citadel\code\__HELPERS\lists.dm" #include "modular_citadel\code\__HELPERS\mobs.dm" #include "modular_citadel\code\_globalvars\lists\mobs.dm" +#include "modular_citadel\code\_onclick\click.dm" +#include "modular_citadel\code\_onclick\item_attack.dm" +#include "modular_citadel\code\_onclick\other_mobs.dm" +#include "modular_citadel\code\_onclick\hud\screen_objects.dm" +#include "modular_citadel\code\_onclick\hud\stamina.dm" #include "modular_citadel\code\controllers\configuration\entries\general.dm" #include "modular_citadel\code\controllers\subsystem\job.dm" #include "modular_citadel\code\controllers\subsystem\research.dm" #include "modular_citadel\code\controllers\subsystem\shuttle.dm" #include "modular_citadel\code\datums\uplink_items_cit.dm" #include "modular_citadel\code\datums\mutations\hulk.dm" +#include "modular_citadel\code\datums\status_effects\debuffs.dm" +#include "modular_citadel\code\datums\traits\neutral.dm" #include "modular_citadel\code\datums\wires\airlock.dm" #include "modular_citadel\code\datums\wires\autoylathe.dm" +#include "modular_citadel\code\game\area\cit_areas.dm" #include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" #include "modular_citadel\code\game\gamemodes\revolution\revolution.dm" #include "modular_citadel\code\game\machinery\cryopod.dm" +#include "modular_citadel\code\game\machinery\displaycases.dm" +#include "modular_citadel\code\game\machinery\firealarm.dm" #include "modular_citadel\code\game\machinery\Sleeper.dm" #include "modular_citadel\code\game\machinery\toylathe.dm" #include "modular_citadel\code\game\machinery\vending.dm" #include "modular_citadel\code\game\machinery\computer\card.dm" #include "modular_citadel\code\game\objects\ids.dm" +#include "modular_citadel\code\game\objects\items.dm" #include "modular_citadel\code\game\objects\tools.dm" +#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" #include "modular_citadel\code\game\objects\items\handcuffs.dm" #include "modular_citadel\code\game\objects\items\holy_weapons.dm" #include "modular_citadel\code\game\objects\items\stunsword.dm" @@ -2564,6 +2632,7 @@ #include "modular_citadel\code\game\objects\items\devices\radio\headset.dm" #include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm" #include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm" +#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm" #include "modular_citadel\code\game\objects\structures\beds_chairs\sofa.dm" #include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm" #include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm" @@ -2572,12 +2641,33 @@ #include "modular_citadel\code\modules\admin\holder2.dm" #include "modular_citadel\code\modules\admin\secrets.dm" #include "modular_citadel\code\modules\admin\topic.dm" +#include "modular_citadel\code\modules\antagonists\cit_crewobjectives.dm" +#include "modular_citadel\code\modules\antagonists\cit_miscreants.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_cargo.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_civilian.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_command.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_engineering.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_medical.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_science.dm" +#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_security.dm" +#include "modular_citadel\code\modules\arousal\arousal.dm" +#include "modular_citadel\code\modules\arousal\organs\breasts.dm" +#include "modular_citadel\code\modules\arousal\organs\eggsack.dm" +#include "modular_citadel\code\modules\arousal\organs\genitals.dm" +#include "modular_citadel\code\modules\arousal\organs\genitals_sprite_accessories.dm" +#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm" +#include "modular_citadel\code\modules\arousal\organs\penis.dm" +#include "modular_citadel\code\modules\arousal\organs\testicles.dm" +#include "modular_citadel\code\modules\arousal\organs\vagina.dm" +#include "modular_citadel\code\modules\arousal\organs\womb.dm" +#include "modular_citadel\code\modules\arousal\toys\dildos.dm" #include "modular_citadel\code\modules\cargo\console.dm" #include "modular_citadel\code\modules\cargo\packs.dm" #include "modular_citadel\code\modules\client\client_defines.dm" #include "modular_citadel\code\modules\client\client_procs.dm" #include "modular_citadel\code\modules\client\preferences.dm" #include "modular_citadel\code\modules\client\preferences_savefile.dm" +#include "modular_citadel\code\modules\client\preferences_toggles.dm" #include "modular_citadel\code\modules\client\loadout\__donator.dm" #include "modular_citadel\code\modules\client\loadout\_medical.dm" #include "modular_citadel\code\modules\client\loadout\_security.dm" @@ -2593,16 +2683,27 @@ #include "modular_citadel\code\modules\client\loadout\shoes.dm" #include "modular_citadel\code\modules\client\loadout\suit.dm" #include "modular_citadel\code\modules\client\loadout\uniform.dm" +#include "modular_citadel\code\modules\client\loadout\uniform_trek.dm" #include "modular_citadel\code\modules\client\verbs\who.dm" -#include "modular_citadel\code\modules\clothing\under.dm" #include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm" +#include "modular_citadel\code\modules\clothing\suits\suits.dm" #include "modular_citadel\code\modules\clothing\under\polychromic_clothes.dm" +#include "modular_citadel\code\modules\clothing\under\trek_under.dm" #include "modular_citadel\code\modules\clothing\under\turtlenecks.dm" +#include "modular_citadel\code\modules\clothing\under\under.dm" #include "modular_citadel\code\modules\crafting\recipes.dm" +#include "modular_citadel\code\modules\custom_loadout\custom_items.dm" +#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" +#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" +#include "modular_citadel\code\modules\events\blob.dm" +#include "modular_citadel\code\modules\food_and_drinks\snacks\meat.dm" #include "modular_citadel\code\modules\jobs\jobs.dm" #include "modular_citadel\code\modules\jobs\job_types\captain.dm" #include "modular_citadel\code\modules\jobs\job_types\cargo_service.dm" #include "modular_citadel\code\modules\jobs\job_types\engineering.dm" +#include "modular_citadel\code\modules\jobs\job_types\security.dm" +#include "modular_citadel\code\modules\keybindings\bindings_carbon.dm" +#include "modular_citadel\code\modules\keybindings\bindings_human.dm" #include "modular_citadel\code\modules\mentor\follow.dm" #include "modular_citadel\code\modules\mentor\mentor.dm" #include "modular_citadel\code\modules\mentor\mentor_memo.dm" @@ -2611,19 +2712,58 @@ #include "modular_citadel\code\modules\mentor\mentorpm.dm" #include "modular_citadel\code\modules\mentor\mentorsay.dm" #include "modular_citadel\code\modules\mining\mine_items.dm" +#include "modular_citadel\code\modules\mob\cit_emotes.dm" +#include "modular_citadel\code\modules\mob\mob.dm" +#include "modular_citadel\code\modules\mob\living\damage_procs.dm" +#include "modular_citadel\code\modules\mob\living\living.dm" +#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm" +#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\life.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\species.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm" #include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm" #include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm" #include "modular_citadel\code\modules\power\lighting.dm" +#include "modular_citadel\code\modules\projectiles\gun.dm" +#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm" +#include "modular_citadel\code\modules\projectiles\guns\toys.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\flechette.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm" #include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm" #include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm" +#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm" +#include "modular_citadel\code\modules\projectiles\projectile\energy.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" +#include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm" +#include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm" +#include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm" +#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm" +#include "modular_citadel\code\modules\recycling\disposal\bin.dm" #include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm" #include "modular_citadel\code\modules\research\designs\machine_designs.dm" #include "modular_citadel\code\modules\research\techweb\_techweb.dm" #include "modular_citadel\code\modules\research\techweb\all_nodes.dm" #include "modular_citadel\code\modules\uplink\uplink_items.dm" +#include "modular_citadel\code\modules\vore\hook-defs_vr.dm" +#include "modular_citadel\code\modules\vore\persistence.dm" +#include "modular_citadel\code\modules\vore\trycatch_vr.dm" +#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm" +#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm" +#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm" +#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm" +#include "modular_citadel\code\modules\vore\eating\living_vr.dm" +#include "modular_citadel\code\modules\vore\eating\simple_animal_vr.dm" +#include "modular_citadel\code\modules\vore\eating\vore_vr.dm" +#include "modular_citadel\code\modules\vore\eating\voreitems.dm" +#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm" #include "modular_citadel\interface\skin.dmf" // END_INCLUDE diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index e84cebf112..6e2f1133f2 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -7,12 +7,12 @@ return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}function real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,"int":8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830},sc=[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376],pc=RegExp("&(#?(?:x[\\w\\d]+|\\d+|"+Object.keys(oc).join("|")+"));?","g"),uc=//g,lc=/&/g;var vc=function(){return e(this.node)},bc=function(t){this.type=ku,this.text=t.template};bc.prototype={detach:vc,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createTextNode(this.text)),this.node},toString:function(t){return t?Ee(this.text):this.text},unrender:function(t){return t?this.detach():void 0}};var yc=bc,xc=Se,_c=Ce,wc=function(t,e,n){var a;this.ref=e,this.resolved=!1,this.root=t.root,this.parentFragment=t.parentFragment,this.callback=n,a=ls(t.root,e,t.parentFragment),void 0!=a?this.resolve(a):bs.addUnresolved(this)};wc.prototype={resolve:function(t){this.keypath&&!t&&bs.addUnresolved(this),this.resolved=!0,this.keypath=t,this.callback(t)},forceResolution:function(){this.resolve(E(this.ref))},rebind:function(t,e){var n;void 0!=this.keypath&&(n=this.keypath.replace(t,e),void 0!==n&&this.resolve(n))},unbind:function(){this.resolved||bs.removeUnresolved(this)}};var kc=wc,Ec=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,this.rebind()},Sc={"@keypath":{prefix:"c",prop:["context"]},"@index":{prefix:"i",prop:["index"]},"@key":{prefix:"k",prop:["key","index"]}};Ec.prototype={rebind:function(){var t,e=this.ref,n=this.parentFragment,a=Sc[e];if(!a)throw Error('Unknown special reference "'+e+'" - valid references are @index, @key and @keypath');if(this.cached)return this.callback(E("@"+a.prefix+Pe(this.cached,a)));if(-1!==a.prop.indexOf("index")||-1!==a.prop.indexOf("key"))for(;n;){if(n.owner.currentSubtype===Bu&&void 0!==(t=Pe(n,a)))return this.cached=n,n.registerIndexRef(this),this.callback(E("@"+a.prefix+t));n=!n.parent&&n.owner&&n.owner.component&&n.owner.component.parentFragment&&!n.owner.component.instance.isolated?n.owner.component.parentFragment:n.parent}else for(;n;){if(void 0!==(t=Pe(n,a)))return this.callback(E("@"+a.prefix+t.str));n=n.parent}},unbind:function(){this.cached&&this.cached.unregisterIndexRef(this)}};var Cc=Ec,Pc=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,e.ref.fragment.registerIndexRef(this),this.rebind()};Pc.prototype={rebind:function(){var t,e=this.ref.ref;t="k"===e.ref.t?"k"+e.fragment.key:"i"+e.fragment.index,void 0!==t&&this.callback(E("@"+t))},unbind:function(){this.ref.ref.fragment.unregisterIndexRef(this)}};var Ac=Pc,Oc=Ae;Ae.resolve=function(t){var e,n,a={};for(e in t.refs)n=t.refs[e],a[n.ref.n]="k"===n.ref.t?n.fragment.key:n.fragment.index;return a};var Tc,Rc=Oe,Lc=Te,jc={},Mc=Function.prototype.bind;Tc=function(t,e,n,a){var r,i=this;r=t.root,this.root=r,this.parentFragment=e,this.callback=a,this.owner=t,this.str=n.s,this.keypaths=[],this.pending=n.r.length,this.refResolvers=n.r.map(function(t,e){return Rc(i,t,function(t){i.resolve(e,t)})}),this.ready=!0,this.bubble()},Tc.prototype={bubble:function(){this.ready&&(this.uniqueString=Le(this.str,this.keypaths),this.keypath=je(this.uniqueString),this.createEvaluator(),this.callback(this.keypath))},unbind:function(){for(var t;t=this.refResolvers.pop();)t.unbind()},resolve:function(t,e){this.keypaths[t]=e,this.bubble()},createEvaluator:function(){var t,e,n,a,r,i=this;a=this.keypath,t=this.root.viewmodel.computations[a.str],t?this.root.viewmodel.mark(a):(r=Lc(this.str,this.refResolvers.length),e=this.keypaths.map(function(t){var e;return"undefined"===t?function(){}:t.isSpecial?(e=t.value,function(){return e}):function(){var e=i.root.viewmodel.get(t,{noUnwrap:!0,fullRootGet:!0});return"function"==typeof e&&(e=De(e,i.root)),e}}),n={deps:this.keypaths.filter(Me),getter:function(){var t=e.map(Re);return r.apply(null,t)}},t=this.root.viewmodel.compute(a,n))},rebind:function(t,e){this.refResolvers.forEach(function(n){return n.rebind(t,e)})}};var Dc=Tc,Nc=function(t,e,n){var a=this;this.resolver=e,this.root=e.root,this.parentFragment=n,this.viewmodel=e.root.viewmodel,"string"==typeof t?this.value=t:t.t===Nu?this.refResolver=Rc(this,t.n,function(t){a.resolve(t)}):new Dc(e,n,t,function(t){a.resolve(t)})};Nc.prototype={resolve:function(t){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.keypath=t,this.value=this.viewmodel.get(t),this.bind(),this.resolver.bubble()},bind:function(){this.viewmodel.register(this.keypath,this)},rebind:function(t,e){this.refResolver&&this.refResolver.rebind(t,e)},setValue:function(t){this.value=t,this.resolver.bubble()},unbind:function(){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.refResolver&&this.refResolver.unbind()},forceResolution:function(){this.refResolver&&this.refResolver.forceResolution()}};var Fc=Nc,Ic=function(t,e,n){var a,r,i,o,s=this;this.parentFragment=o=t.parentFragment,this.root=a=t.root,this.mustache=t,this.ref=r=e.r,this.callback=n,this.unresolved=[],(i=ls(a,r,o))?this.base=i:this.baseResolver=new kc(this,r,function(t){s.base=t,s.baseResolver=null,s.bubble()}),this.members=e.m.map(function(t){return new Fc(t,s,o)}),this.ready=!0,this.bubble()};Ic.prototype={getKeypath:function(){var t=this.members.map(Ne);return!t.every(Fe)||this.baseResolver?null:this.base.join(t.join("."))},bubble:function(){this.ready&&!this.baseResolver&&this.callback(this.getKeypath())},unbind:function(){this.members.forEach(K)},rebind:function(t,e){var n;if(this.base){var a=this.base.replace(t,e);a&&a!==this.base&&(this.base=a,n=!0)}this.members.forEach(function(a){a.rebind(t,e)&&(n=!0)}),n&&this.bubble()},forceResolution:function(){this.baseResolver&&(this.base=E(this.ref),this.baseResolver.unbind(),this.baseResolver=null),this.members.forEach(Ie),this.bubble()}};var Bc=Ic,qc=Be,Uc=qe,Vc=Ue,Gc={getValue:_c,init:qc,resolve:Uc,rebind:Vc},zc=function(t){this.type=Eu,Gc.init(this,t)};zc.prototype={update:function(){this.node.data=void 0==this.value?"":this.value},resolve:Gc.resolve,rebind:Gc.rebind,detach:vc,unbind:xc,render:function(){return this.node||(this.node=document.createTextNode(n(this.value))),this.node},unrender:function(t){t&&e(this.node)},getValue:Gc.getValue,setValue:function(t){var e;this.keypath&&(e=this.root.viewmodel.wrapped[this.keypath.str])&&(t=e.get()),s(t,this.value)||(this.value=t,this.parentFragment.bubble(),this.node&&bs.addView(this))},firstNode:function(){return this.node},toString:function(t){var e=""+n(this.value);return t?Ee(e):e}};var Wc=zc,Hc=Ve,Kc=Ge,Qc=ze,$c=We,Yc=He,Jc=Ke,Xc=Qe,Zc=$e,tl=Ye,el=function(t,e){Gc.rebind.call(this,t,e)},nl=Xe,al=Ze,rl=ln,il=dn,ol=fn,sl=gn,pl=function(t){this.type=Cu,this.subtype=this.currentSubtype=t.template.n,this.inverted=this.subtype===Iu,this.pElement=t.pElement,this.fragments=[],this.fragmentsToCreate=[],this.fragmentsToRender=[],this.fragmentsToUnrender=[],t.template.i&&(this.indexRefs=t.template.i.split(",").map(function(t,e){return{n:t,t:0===e?"k":"i"}})),this.renderedFragments=[],this.length=0,Gc.init(this,t)};pl.prototype={bubble:Hc,detach:Kc,find:Qc,findAll:$c,findAllComponents:Yc,findComponent:Jc,findNextNode:Xc,firstNode:Zc,getIndexRef:function(t){if(this.indexRefs)for(var e=this.indexRefs.length;e--;){var n=this.indexRefs[e];if(n.n===t)return n}},getValue:Gc.getValue,shuffle:tl,rebind:el,render:nl,resolve:Gc.resolve,setValue:al,toString:rl,unbind:il,unrender:ol,update:sl};var ul,cl,ll=pl,dl=vn,fl=bn,hl=yn,ml=xn,gl={};try{co("table").innerHTML="foo"}catch(Ao){ul=!0,cl={TABLE:['',"
    "],THEAD:['',"
    "],TBODY:['',"
    "],TR:['',"
    "],SELECT:['"]}}var vl=function(t,e,n){var a,r,i,o,s,p=[];if(null!=t&&""!==t){for(ul&&(r=cl[e.tagName])?(a=_n("DIV"),a.innerHTML=r[0]+t+r[1],a=a.querySelector(".x"),"SELECT"===a.tagName&&(i=a.options[a.selectedIndex])):e.namespaceURI===no.svg?(a=_n("DIV"),a.innerHTML=''+t+"",a=a.querySelector(".x")):(a=_n(e.tagName),a.innerHTML=t,"SELECT"===a.tagName&&(i=a.options[a.selectedIndex]));o=a.firstChild;)p.push(o),n.appendChild(o);if("SELECT"===e.tagName)for(s=p.length;s--;)p[s]!==i&&(p[s].selected=!1)}return p},bl=wn,yl=En,xl=Sn,_l=Cn,wl=Pn,kl=An,El=function(t){this.type=Su,Gc.init(this,t)};El.prototype={detach:dl,find:fl,findAll:hl,firstNode:ml,getValue:Gc.getValue,rebind:Gc.rebind,render:yl,resolve:Gc.resolve,setValue:xl,toString:_l,unbind:xc,unrender:wl,update:kl};var Sl,Cl,Pl,Al,Ol=El,Tl=function(){this.parentFragment.bubble()},Rl=On,Ll=function(t){return this.node?lo(this.node,t)?this.node:this.fragment&&this.fragment.find?this.fragment.find(t):void 0:null},jl=function(t,e){e._test(this,!0)&&e.live&&(this.liveQueries||(this.liveQueries=[])).push(e),this.fragment&&this.fragment.findAll(t,e)},Ml=function(t,e){this.fragment&&this.fragment.findAllComponents(t,e)},Dl=function(t){return this.fragment?this.fragment.findComponent(t):void 0},Nl=Tn,Fl=Rn,Il=Ln,Bl=/^true|on|yes|1$/i,ql=/^[0-9]+$/,Ul=function(t,e){var n,a,r;return r=e.a||{},a={},n=r.twoway,void 0!==n&&(a.twoway=0===n||Bl.test(n)),n=r.lazy,void 0!==n&&(0!==n&&ql.test(n)?a.lazy=parseInt(n):a.lazy=0===n||Bl.test(n)),a},Vl=jn;Sl="altGlyph altGlyphDef altGlyphItem animateColor animateMotion animateTransform clipPath feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence foreignObject glyphRef linearGradient radialGradient textPath vkern".split(" "),Cl="attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits contentScriptType contentStyleType diffuseConstant edgeMode externalResourcesRequired filterRes filterUnits glyphRef gradientTransform gradientUnits kernelMatrix kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent spreadMethod startOffset stdDeviation stitchTiles surfaceScale systemLanguage tableValues targetX targetY textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan".split(" "),Pl=function(t){for(var e={},n=t.length;n--;)e[t[n].toLowerCase()]=t[n];return e},Al=Pl(Sl.concat(Cl));var Gl=function(t){var e=t.toLowerCase();return Al[e]||e},zl=function(t,e){var n,a;if(n=e.indexOf(":"),-1===n||(a=e.substr(0,n),"xmlns"===a))t.name=t.element.namespace!==no.html?Gl(e):e;else if(e=e.substring(n+1),t.name=Gl(e),t.namespace=no[a.toLowerCase()],t.namespacePrefix=a,!t.namespace)throw'Unknown namespace ("'+a+'")'},Wl=Mn,Hl=Dn,Kl=Nn,Ql=Fn,$l={"accept-charset":"acceptCharset",accesskey:"accessKey",bgcolor:"bgColor","class":"className",codebase:"codeBase",colspan:"colSpan",contenteditable:"contentEditable",datetime:"dateTime",dirname:"dirName","for":"htmlFor","http-equiv":"httpEquiv",ismap:"isMap",maxlength:"maxLength",novalidate:"noValidate",pubdate:"pubDate",readonly:"readOnly",rowspan:"rowSpan",tabindex:"tabIndex",usemap:"useMap"},Yl=In,Jl=qn,Xl=Un,Zl=Vn,td=Gn,ed=zn,nd=Wn,ad=Hn,rd=Kn,id=Qn,od=$n,sd=Yn,pd=Jn,ud=Xn,cd=Zn,ld=function(t){this.init(t)};ld.prototype={bubble:Vl,init:Hl,rebind:Kl,render:Ql,toString:Yl,unbind:Jl,update:cd};var dd,fd=ld,hd=function(t,e){var n,a,r=[];for(n in e)"twoway"!==n&&"lazy"!==n&&e.hasOwnProperty(n)&&(a=new fd({element:t,name:n,value:e[n],root:t.root}),r[n]=a,"value"!==n&&r.push(a));return(a=r.value)&&r.push(a),r};"undefined"!=typeof document&&(dd=co("div"));var md=function(t,e){this.element=t,this.root=t.root,this.parentFragment=t.parentFragment,this.attributes=[],this.fragment=new rg({root:t.root,owner:this,template:[e]})};md.prototype={bubble:function(){this.node&&this.update(),this.element.bubble()},rebind:function(t,e){this.fragment.rebind(t,e)},render:function(t){this.node=t,this.isSvg=t.namespaceURI===no.svg,this.update()},unbind:function(){this.fragment.unbind()},update:function(){var t,e,n=this;t=""+this.fragment,e=ta(t,this.isSvg),this.attributes.filter(function(t){return ea(e,t)}).forEach(function(t){n.node.removeAttribute(t.name)}),e.forEach(function(t){n.node.setAttribute(t.name,t.value)}),this.attributes=e},toString:function(){return""+this.fragment}};var gd=md,vd=function(t,e){return e?e.map(function(e){return new gd(t,e)}):[]},bd=function(t){var e,n,a,r;if(this.element=t,this.root=t.root,this.attribute=t.attributes[this.name||"value"],e=this.attribute.interpolator,e.twowayBinding=this,n=e.keypath){if("}"===n.str.slice(-1))return g("Two-way binding does not work with expressions (`%s` on <%s>)",e.resolver.uniqueString,t.name,{ractive:this.root}),!1;if(n.isSpecial)return g("Two-way binding does not work with %s",e.resolver.ref,{ractive:this.root}),!1}else{var i=e.template.r?"'"+e.template.r+"' reference":"expression";m("The %s being used for two-way binding is ambiguous, and may cause unexpected results. Consider initialising your data to eliminate the ambiguity",i,{ractive:this.root}),e.resolver.forceResolution(),n=e.keypath}this.attribute.isTwoway=!0,this.keypath=n,a=this.root.viewmodel.get(n),void 0===a&&this.getInitialValue&&(a=this.getInitialValue(),void 0!==a&&this.root.viewmodel.set(n,a)),(r=na(t))&&(this.resetValue=a,r.formBindings.push(this))};bd.prototype={handleChange:function(){var t=this;bs.start(this.root),this.attribute.locked=!0,this.root.viewmodel.set(this.keypath,this.getValue()),bs.scheduleTask(function(){return t.attribute.locked=!1}),bs.end()},rebound:function(){var t,e,n;e=this.keypath,n=this.attribute.interpolator.keypath,e!==n&&(N(this.root._twowayBindings[e.str],this),this.keypath=n,t=this.root._twowayBindings[n.str]||(this.root._twowayBindings[n.str]=[]),t.push(this))},unbind:function(){}},bd.extend=function(t){var e,n=this;return e=function(t){bd.call(this,t),this.init&&this.init()},e.prototype=Eo(n.prototype),a(e.prototype,t),e.extend=bd.extend,e};var yd,xd=bd,_d=aa;yd=xd.extend({getInitialValue:function(){return""},getValue:function(){return this.element.node.value},render:function(){var t,e=this.element.node,n=!1;this.rendered=!0,t=this.root.lazy,this.element.lazy===!0?t=!0:this.element.lazy===!1?t=!1:p(this.element.lazy)?(t=!1,n=+this.element.lazy):p(t||"")&&(n=+t,t=!1,this.element.lazy=n),this.handler=n?ia:_d,e.addEventListener("change",_d,!1),t||(e.addEventListener("input",this.handler,!1),e.attachEvent&&e.addEventListener("keyup",this.handler,!1)),e.addEventListener("blur",ra,!1)},unrender:function(){var t=this.element.node;this.rendered=!1,t.removeEventListener("change",_d,!1),t.removeEventListener("input",this.handler,!1),t.removeEventListener("keyup",this.handler,!1),t.removeEventListener("blur",ra,!1)}});var wd=yd,kd=wd.extend({getInitialValue:function(){return this.element.fragment?""+this.element.fragment:""},getValue:function(){return this.element.node.innerHTML}}),Ed=kd,Sd=oa,Cd={},Pd=xd.extend({name:"checked",init:function(){this.siblings=Sd(this.root._guid,"radio",this.element.getAttribute("name")),this.siblings.push(this)},render:function(){var t=this.element.node;t.addEventListener("change",_d,!1),t.attachEvent&&t.addEventListener("click",_d,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_d,!1),t.removeEventListener("click",_d,!1)},handleChange:function(){bs.start(this.root),this.siblings.forEach(function(t){t.root.viewmodel.set(t.keypath,t.getValue())}),bs.end()},getValue:function(){return this.element.node.checked},unbind:function(){N(this.siblings,this)}}),Ad=Pd,Od=xd.extend({name:"name",init:function(){this.siblings=Sd(this.root._guid,"radioname",this.keypath.str),this.siblings.push(this),this.radioName=!0},getInitialValue:function(){return this.element.getAttribute("checked")?this.element.getAttribute("value"):void 0},render:function(){var t=this.element.node;t.name="{{"+this.keypath.str+"}}",t.checked=this.root.viewmodel.get(this.keypath)==this.element.getAttribute("value"),t.addEventListener("change",_d,!1),t.attachEvent&&t.addEventListener("click",_d,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_d,!1),t.removeEventListener("click",_d,!1)},getValue:function(){var t=this.element.node;return t._ractive?t._ractive.value:t.value},handleChange:function(){this.element.node.checked&&xd.prototype.handleChange.call(this)},rebound:function(t,e){var n;xd.prototype.rebound.call(this,t,e),(n=this.element.node)&&(n.name="{{"+this.keypath.str+"}}")},unbind:function(){N(this.siblings,this)}}),Td=Od,Rd=xd.extend({name:"name",getInitialValue:function(){return this.noInitialValue=!0,[]},init:function(){var t,e;this.checkboxName=!0,this.siblings=Sd(this.root._guid,"checkboxes",this.keypath.str),this.siblings.push(this),this.noInitialValue&&(this.siblings.noInitialValue=!0),this.siblings.noInitialValue&&this.element.getAttribute("checked")&&(t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),t.push(e))},unbind:function(){N(this.siblings,this)},render:function(){var t,e,n=this.element.node;t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),i(t)?this.isChecked=L(t,e):this.isChecked=t==e,n.name="{{"+this.keypath.str+"}}",n.checked=this.isChecked,n.addEventListener("change",_d,!1),n.attachEvent&&n.addEventListener("click",_d,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_d,!1),t.removeEventListener("click",_d,!1)},changed:function(){var t=!!this.isChecked;return this.isChecked=this.element.node.checked,this.isChecked===t},handleChange:function(){this.isChecked=this.element.node.checked,xd.prototype.handleChange.call(this)},getValue:function(){return this.siblings.filter(sa).map(pa)}}),Ld=Rd,jd=xd.extend({name:"checked",render:function(){var t=this.element.node;t.addEventListener("change",_d,!1),t.attachEvent&&t.addEventListener("click",_d,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_d,!1),t.removeEventListener("click",_d,!1)},getValue:function(){return this.element.node.checked}}),Md=jd,Dd=xd.extend({getInitialValue:function(){var t,e,n,a,r=this.element.options;if(void 0===this.element.getAttribute("value")&&(e=t=r.length,t)){for(;e--;)if(r[e].getAttribute("selected")){n=r[e].getAttribute("value"),a=!0;break}if(!a)for(;++ee;e+=1)if(a=t[e],t[e].selected)return r=a._ractive?a._ractive.value:a.value},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,bs.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))}}),Nd=Dd,Fd=Nd.extend({getInitialValue:function(){return this.element.options.filter(function(t){return t.getAttribute("selected")}).map(function(t){return t.getAttribute("value")})},render:function(){var t;this.element.node.addEventListener("change",_d,!1),t=this.root.viewmodel.get(this.keypath),void 0===t&&this.handleChange()},unrender:function(){this.element.node.removeEventListener("change",_d,!1)},setValue:function(){throw Error("TODO not implemented yet")},getValue:function(){var t,e,n,a,r,i;for(t=[],e=this.element.node.options,a=e.length,n=0;a>n;n+=1)r=e[n],r.selected&&(i=r._ractive?r._ractive.value:r.value,t.push(i));return t},handleChange:function(){var t,e,n;return t=this.attribute,e=t.value,n=this.getValue(),void 0!==e&&j(n,e)||Nd.prototype.handleChange.call(this),this},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,bs.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))},updateModel:function(){void 0!==this.attribute.value&&this.attribute.value.length||this.root.viewmodel.set(this.keypath,this.initialValue)}}),Id=Fd,Bd=xd.extend({render:function(){this.element.node.addEventListener("change",_d,!1)},unrender:function(){this.element.node.removeEventListener("change",_d,!1)},getValue:function(){return this.element.node.files}}),qd=Bd,Ud=wd.extend({getInitialValue:function(){},getValue:function(){var t=parseFloat(this.element.node.value);return isNaN(t)?void 0:t}}),Vd=ua,Gd=la,zd=da,Wd=fa,Hd=ha,Kd=/^event(?:\.(.+))?/,Qd=ba,$d=ya,Yd={},Jd={touchstart:!0,touchmove:!0,touchend:!0,touchcancel:!0,touchleave:!0},Xd=_a,Zd=wa,tf=ka,ef=Ea,nf=Sa,af=function(t,e,n){this.init(t,e,n)};af.prototype={bubble:Gd,fire:zd,getAction:Wd,init:Hd,listen:$d,rebind:Xd,render:Zd,resolve:tf,unbind:ef,unrender:nf};var rf=af,of=function(t,e){var n,a,r,i,o=[];for(a in e)if(e.hasOwnProperty(a))for(r=a.split("-"),n=r.length;n--;)i=new rf(t,r[n],e[a]),o.push(i);return o},sf=function(t,e){var n,a,r,i=this;this.element=t,this.root=n=t.root,a=e.n||e,("string"==typeof a||(r=new rg({template:a,root:n,owner:t}),a=""+r,r.unbind(),""!==a))&&(e.a?this.params=e.a:e.d&&(this.fragment=new rg({template:e.d,root:n,owner:t}),this.params=this.fragment.getArgsList(),this.fragment.bubble=function(){this.dirtyArgs=this.dirtyValue=!0,i.params=this.getArgsList(),i.ready&&i.update()}),this.fn=v("decorators",n,a),this.fn||l(Io(a,"decorator")))};sf.prototype={init:function(){var t,e,n;if(t=this.element.node,this.params?(n=[t].concat(this.params),e=this.fn.apply(this.root,n)):e=this.fn.call(this.root,t),!e||!e.teardown)throw Error("Decorator definition must return an object with a teardown method");this.actual=e,this.ready=!0},update:function(){this.actual.update?this.actual.update.apply(this.root,this.params):(this.actual.teardown(!0),this.init())},rebind:function(t,e){this.fragment&&this.fragment.rebind(t,e)},teardown:function(t){this.torndown=!0,this.ready&&this.actual.teardown(),!t&&this.fragment&&this.fragment.unbind()}};var pf,uf,cf,lf=sf,df=La,ff=ja,hf=Ba,mf=function(t){return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Xi?(uf={},cf=co("div").style,pf=function(t){var e,n,a;if(t=mf(t),!uf[t])if(void 0!==cf[t])uf[t]=t;else for(a=t.charAt(0).toUpperCase()+t.substring(1),e=ro.length;e--;)if(n=ro[e],void 0!==cf[n+a]){uf[t]=n+a;break}return uf[t]}):pf=null;var gf,vf,bf=pf;Xi?(vf=window.getComputedStyle||Po.getComputedStyle,gf=function(t){var e,n,a,r,o;if(e=vf(this.node),"string"==typeof t)return o=e[bf(t)],"0px"===o&&(o=0),o;if(!i(t))throw Error("Transition$getStyle must be passed a string, or an array of strings representing CSS properties");for(n={},a=t.length;a--;)r=t[a],o=e[bf(r)],"0px"===o&&(o=0),n[r]=o;return n}):gf=null;var yf=gf,xf=function(t,e){var n;if("string"==typeof t)this.node.style[bf(t)]=e;else for(n in t)t.hasOwnProperty(n)&&(this.node.style[bf(n)]=t[n]);return this},_f=function(t){var e;this.duration=t.duration,this.step=t.step,this.complete=t.complete,"string"==typeof t.easing?(e=t.root.easing[t.easing],e||(g(Io(t.easing,"easing")),e=qa)):e="function"==typeof t.easing?t.easing:qa,this.easing=e,this.start=ns(),this.end=this.start+this.duration,this.running=!0,_s.add(this)};_f.prototype={tick:function(t){var e,n;return this.running?t>this.end?(this.step&&this.step(1),this.complete&&this.complete(1),!1):(e=t-this.start,n=this.easing(e/this.duration),this.step&&this.step(n),!0):!1},stop:function(){this.abort&&this.abort(),this.running=!1}};var wf,kf,Ef,Sf,Cf,Pf,Af,Of,Tf=_f,Rf=RegExp("^-(?:"+ro.join("|")+")-"),Lf=function(t){return t.replace(Rf,"")},jf=RegExp("^(?:"+ro.join("|")+")([A-Z])"),Mf=function(t){var e;return t?(jf.test(t)&&(t="-"+t),e=t.replace(/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):""},Df={},Nf={};Xi?(kf=co("div").style,function(){void 0!==kf.transition?(Ef="transition",Sf="transitionend",Cf=!0):void 0!==kf.webkitTransition?(Ef="webkitTransition",Sf="webkitTransitionEnd",Cf=!0):Cf=!1}(),Ef&&(Pf=Ef+"Duration",Af=Ef+"Property",Of=Ef+"TimingFunction"),wf=function(t,e,n,a,r){setTimeout(function(){var i,o,s,p,u;p=function(){o&&s&&(t.root.fire(t.name+":end",t.node,t.isIntro),r())},i=(t.node.namespaceURI||"")+t.node.tagName,t.node.style[Af]=a.map(bf).map(Mf).join(","),t.node.style[Of]=Mf(n.easing||"linear"),t.node.style[Pf]=n.duration/1e3+"s",u=function(e){var n;n=a.indexOf(mf(Lf(e.propertyName))),-1!==n&&a.splice(n,1),a.length||(t.node.removeEventListener(Sf,u,!1),s=!0,p())},t.node.addEventListener(Sf,u,!1),setTimeout(function(){for(var r,c,l,d,f,h=a.length,g=[];h--;)d=a[h],r=i+d,Cf&&!Nf[r]&&(t.node.style[bf(d)]=e[d],Df[r]||(c=t.getStyle(d),Df[r]=t.getStyle(d)!=e[d],Nf[r]=!Df[r],Nf[r]&&(t.node.style[bf(d)]=c))),(!Cf||Nf[r])&&(void 0===c&&(c=t.getStyle(d)),l=a.indexOf(d),-1===l?m("Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!",{node:t.node}):a.splice(l,1),f=/[^\d]*$/.exec(e[d])[0],g.push({name:bf(d),interpolator:qo(parseFloat(c),parseFloat(e[d])),suffix:f}));g.length?new Tf({root:t.root,duration:n.duration,easing:mf(n.easing||""),step:function(e){var n,a;for(a=g.length;a--;)n=g[a],t.node.style[n.name]=n.interpolator(e)+n.suffix},complete:function(){o=!0,p()}}):o=!0,a.length||(t.node.removeEventListener(Sf,u,!1),s=!0,p())},0)},n.delay||0)}):wf=null;var Ff,If,Bf,qf,Uf,Vf=wf;if("undefined"!=typeof document){if(Ff="hidden",Uf={},Ff in document)Bf="";else for(qf=ro.length;qf--;)If=ro[qf],Ff=If+"Hidden",Ff in document&&(Bf=If);void 0!==Bf?(document.addEventListener(Bf+"visibilitychange",Ua),Ua()):("onfocusout"in document?(document.addEventListener("focusout",Va),document.addEventListener("focusin",Ga)):(window.addEventListener("pagehide",Va),window.addEventListener("blur",Va),window.addEventListener("pageshow",Ga),window.addEventListener("focus",Ga)),Uf.hidden=!1)}var Gf,zf,Wf,Hf=Uf;Xi?(zf=window.getComputedStyle||Po.getComputedStyle,Gf=function(t,e,n){var a,r=this;if(4===arguments.length)throw Error("t.animateStyle() returns a promise - use .then() instead of passing a callback");if(Hf.hidden)return this.setStyle(t,e),Wf||(Wf=us.resolve());"string"==typeof t?(a={},a[t]=e):(a=t,n=e),n||(g('The "%s" transition does not supply an options object to `t.animateStyle()`. This will break in a future version of Ractive. For more info see https://github.com/RactiveJS/Ractive/issues/340',this.name),n=this);var i=new us(function(t){var e,i,o,s,p,u,c;if(!n.duration)return r.setStyle(a),void t();for(e=Object.keys(a),i=[],o=zf(r.node),p={},u=e.length;u--;)c=e[u],s=o[bf(c)],"0px"===s&&(s=0),s!=a[c]&&(i.push(c),r.node.style[bf(c)]=s);return i.length?void Vf(r,a,n,i,t):void t()});return i}):Gf=null;var Kf=Gf,Qf=function(t,e){return"number"==typeof t?t={duration:t}:"string"==typeof t?t="slow"===t?{duration:600}:"fast"===t?{duration:200}:{duration:400}:t||(t={}),r({},t,e)},$f=za,Yf=function(t,e,n){this.init(t,e,n)};Yf.prototype={init:hf,start:$f,getStyle:yf,setStyle:xf,animateStyle:Kf,processParams:Qf};var Jf,Xf,Zf=Yf,th=Ha;Jf=function(){var t=this.node,e=this.fragment.toString(!1);if(window&&window.appearsToBeIELessEqual8&&(t.type="text/css"),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}},Xf=function(){this.node.type&&"text/javascript"!==this.node.type||m("Script tag was updated. This does not cause the code to be re-evaluated!",{ractive:this.root}),this.node.text=this.fragment.toString(!1)};var eh=function(){var t,e;return this.template.y?"":(t="<"+this.template.e,t+=this.attributes.map(Xa).join("")+this.conditionalAttributes.map(Xa).join(""),"option"===this.name&&Ya(this)&&(t+=" selected"),"input"===this.name&&Ja(this)&&(t+=" checked"),t+=">","textarea"===this.name&&void 0!==this.getAttribute("value")?t+=Ee(this.getAttribute("value")):void 0!==this.getAttribute("contenteditable")&&(t+=this.getAttribute("value")||""),this.fragment&&(e="script"!==this.name&&"style"!==this.name,t+=this.fragment.toString(e)),ic.test(this.template.e)||(t+=""),t)},nh=Za,ah=tr,rh=function(t){this.init(t)};rh.prototype={bubble:Tl,detach:Rl,find:Ll,findAll:jl,findAllComponents:Ml,findComponent:Dl,findNextNode:Nl,firstNode:Fl,getAttribute:Il,init:df,rebind:ff,render:th,toString:eh,unbind:nh,unrender:ah};var ih=rh,oh=/^\s*$/,sh=/^\s*/,ph=function(t){var e,n,a,r;return e=t.split("\n"),n=e[0],void 0!==n&&oh.test(n)&&e.shift(),a=D(e),void 0!==a&&oh.test(a)&&e.pop(),r=e.reduce(nr,null),r&&(t=e.map(function(t){return t.replace(r,"")}).join("\n")),t},uh=ar,ch=function(t,e){var n;return e?n=t.split("\n").map(function(t,n){return n?e+t:t}).join("\n"):t},lh='Could not find template for partial "%s"',dh=function(t){var e,n;e=this.parentFragment=t.parentFragment,this.root=e.root,this.type=Au,this.index=t.index,this.name=t.template.r,this.rendered=!1,this.fragment=this.fragmentToRender=this.fragmentToUnrender=null,Gc.init(this,t),this.keypath||((n=uh(this.root,this.name,e))?(xc.call(this),this.isNamed=!0,this.setTemplate(n)):g(lh,this.name))};dh.prototype={bubble:function(){this.parentFragment.bubble()},detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},firstNode:function(){return this.fragment.firstNode()},findNextNode:function(){return this.parentFragment.findNextNode(this)},getPartialName:function(){return this.isNamed&&this.name?this.name:void 0===this.value?this.name:this.value},getValue:function(){return this.fragment.getValue()},rebind:function(t,e){this.isNamed||Vc.call(this,t,e),this.fragment&&this.fragment.rebind(t,e)},render:function(){return this.docFrag=document.createDocumentFragment(),this.update(),this.rendered=!0,this.docFrag},resolve:Gc.resolve,setValue:function(t){var e;(void 0===t||t!==this.value)&&(void 0!==t&&(e=uh(this.root,""+t,this.parentFragment)),!e&&this.name&&(e=uh(this.root,this.name,this.parentFragment))&&(xc.call(this),this.isNamed=!0),e||g(lh,this.name,{ractive:this.root}),this.value=t,this.setTemplate(e||[]),this.bubble(),this.rendered&&bs.addView(this))},setTemplate:function(t){this.fragment&&(this.fragment.unbind(),this.rendered&&(this.fragmentToUnrender=this.fragment)),this.fragment=new rg({template:t,root:this.root,owner:this,pElement:this.parentFragment.pElement}),this.fragmentToRender=this.fragment},toString:function(t){var e,n,a,r;return e=this.fragment.toString(t),n=this.parentFragment.items[this.index-1],n&&n.type===ku?(a=n.text.split("\n").pop(),(r=/^\s+$/.exec(a))?ch(e,r[0]):e):e},unbind:function(){this.isNamed||xc.call(this),this.fragment&&this.fragment.unbind()},unrender:function(t){this.rendered&&(this.fragment&&this.fragment.unrender(t),this.rendered=!1)},update:function(){var t,e;this.fragmentToUnrender&&(this.fragmentToUnrender.unrender(!0),this.fragmentToUnrender=null),this.fragmentToRender&&(this.docFrag.appendChild(this.fragmentToRender.render()),this.fragmentToRender=null), this.rendered&&(t=this.parentFragment.getNode(),e=this.parentFragment.findNextNode(this),t.insertBefore(this.docFrag,e))}};var fh,hh,mh,gh=dh,vh=pr,bh=ur,yh=new is("detach"),xh=cr,_h=lr,wh=dr,kh=fr,Eh=hr,Sh=mr,Ch=function(t,e,n,a){var r=t.root,i=t.keypath;a?r.viewmodel.smartUpdate(i,e,a):r.viewmodel.mark(i)},Ph=[],Ah=["pop","push","reverse","shift","sort","splice","unshift"];Ah.forEach(function(t){var e=function(){for(var e=arguments.length,n=Array(e),a=0;e>a;a++)n[a]=arguments[a];var r,i,o,s;for(r=bp(this,t,n),i=Array.prototype[t].apply(this,arguments),bs.start(),this._ractive.setting=!0,s=this._ractive.wrappers.length;s--;)o=this._ractive.wrappers[s],bs.addRactive(o.root),Ch(o,this,t,r);return bs.end(),this._ractive.setting=!1,i};So(Ph,t,{value:e})}),fh={},fh.__proto__?(hh=function(t){t.__proto__=Ph},mh=function(t){t.__proto__=Array.prototype}):(hh=function(t){var e,n;for(e=Ah.length;e--;)n=Ah[e],So(t,n,{value:Ph[n],configurable:!0})},mh=function(t){var e;for(e=Ah.length;e--;)delete t[Ah[e]]}),hh.unpatch=mh;var Oh,Th,Rh,Lh=hh;Oh={filter:function(t){return i(t)&&(!t._ractive||!t._ractive.setting)},wrap:function(t,e,n){return new Th(t,e,n)}},Th=function(t,e,n){this.root=t,this.value=e,this.keypath=E(n),e._ractive||(So(e,"_ractive",{value:{wrappers:[],instances:[],setting:!1},configurable:!0}),Lh(e)),e._ractive.instances[t._guid]||(e._ractive.instances[t._guid]=0,e._ractive.instances.push(t)),e._ractive.instances[t._guid]+=1,e._ractive.wrappers.push(this)},Th.prototype={get:function(){return this.value},teardown:function(){var t,e,n,a,r;if(t=this.value,e=t._ractive,n=e.wrappers,a=e.instances,e.setting)return!1;if(r=n.indexOf(this),-1===r)throw Error(Rh);if(n.splice(r,1),n.length){if(a[this.root._guid]-=1,!a[this.root._guid]){if(r=a.indexOf(this.root),-1===r)throw Error(Rh);a.splice(r,1)}}else delete t._ractive,Lh.unpatch(this.value)}},Rh="Something went wrong in a rather interesting way";var jh,Mh,Dh=Oh,Nh=/^\s*[0-9]+\s*$/,Fh=function(t){return Nh.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),jh={filter:function(t,e,n){var a,r;return e?(e=E(e),(a=n.viewmodel.wrapped[e.parent.str])&&!a.magic?!1:(r=n.viewmodel.get(e.parent),i(r)&&/^[0-9]+$/.test(e.lastKey)?!1:r&&("object"==typeof r||"function"==typeof r))):!1},wrap:function(t,e,n){return new Mh(t,e,n)}},Mh=function(t,e,n){var a,r,i;return n=E(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,a=n.parent,this.obj=a.isRoot?t.viewmodel.data:t.viewmodel.get(a),r=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),r&&r.set&&(i=r.set._ractiveWrappers)?void(-1===i.indexOf(this)&&i.push(this)):void gr(this,e,r)},Mh.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,bs.addRactive(this.ractive),this.ractive.viewmodel.mark(this.keypath,{keepExistingWrapper:!0}),this.updating=!1,!0)},set:function(t,e){this.updating||(this.obj[this.prop]||(this.updating=!0,this.obj[this.prop]=Fh(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,a,r;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(a=e._ractiveWrappers,r=a.indexOf(this),-1!==r&&a.splice(r,1),a.length||(n=this.obj[this.prop],Object.defineProperty(this.obj,this.prop,this.originalDescriptor||{writable:!0,enumerable:!0,configurable:!0}),this.obj[this.prop]=n))))}}}catch(Ao){jh=!1}var Ih,Bh,qh=jh;qh&&(Ih={filter:function(t,e,n){return qh.filter(t,e,n)&&Dh.filter(t)},wrap:function(t,e,n){return new Bh(t,e,n)}},Bh=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=qh.wrap(t,e,n),this.arrayWrapper=Dh.wrap(t,e,n)},Bh.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Uh=Ih,Vh=vr,Gh={},zh=xr,Wh=_r,Hh=Er,Kh=Or,Qh=Tr,$h=function(t,e){this.computation=t,this.viewmodel=t.viewmodel,this.ref=e,this.root=this.viewmodel.ractive,this.parentFragment=this.root.component&&this.root.component.parentFragment};$h.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var Yh=$h,Jh=function(t,e){this.key=t,this.getter=e.getter,this.setter=e.setter,this.hardDeps=e.deps||[],this.softDeps=[],this.unresolvedDeps={},this.depValues={},this._dirty=this._firstRun=!0};Jh.prototype={constructor:Jh,init:function(t){var e,n=this;this.viewmodel=t,this.bypass=!0,e=t.get(this.key),t.clearCache(this.key.str),this.bypass=!1,this.setter&&void 0!==e&&this.set(e),this.hardDeps&&this.hardDeps.forEach(function(e){return t.register(e,n,"computed")})},invalidate:function(){this._dirty=!0},get:function(){var t,e,n=this,a=!1;if(this.getting){var r="The "+this.key.str+" computation indirectly called itself. This probably indicates a bug in the computation. It is commonly caused by `array.sort(...)` - if that's the case, clone the array first with `array.slice().sort(...)`";return h(r),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?a=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,r,i;if(!a)for(i=t.length;i--;)if(e=t[i],r=n.viewmodel.get(e),!s(r,n.depValues[e.str]))return n.depValues[e.str]=r,void(a=!0)}),a){this.viewmodel.capture();try{this.value=this.getter()}catch(i){m('Failed to compute "%s"',this.key.str),d(i.stack||i),this.value=void 0}t=this.viewmodel.release(),e=this.updateDependencies(t),e&&[this.hardDeps,this.softDeps].forEach(function(t){t.forEach(function(t){n.depValues[t.str]=n.viewmodel.get(t)})})}this._dirty=!1}return this.getting=this._firstRun=!1,this.value},set:function(t){if(this.setting)return void(this.value=t);if(!this.setter)throw Error("Computed properties without setters are read-only. (This may change in a future version of Ractive!)");this.setter(t)},updateDependencies:function(t){var e,n,a,r,i;for(n=this.softDeps,e=n.length;e--;)a=n[e],-1===t.indexOf(a)&&(r=!0,this.viewmodel.unregister(a,this,"computed"));for(e=t.length;e--;)a=t[e],-1!==n.indexOf(a)||this.hardDeps&&-1!==this.hardDeps.indexOf(a)||(r=!0,Rr(this.viewmodel,a)&&!this.unresolvedDeps[a.str]?(i=new Yh(this,a.str),t.splice(e,1),this.unresolvedDeps[a.str]=i,bs.addUnresolved(i)):this.viewmodel.register(a,this,"computed"));return r&&(this.softDeps=t.slice()),r}};var Xh=Jh,Zh=Lr,tm={FAILED_LOOKUP:!0},em=jr,nm={},am=Dr,rm=Nr,im=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};im.prototype={forceResolution:function(){this.keypath=this.localKey,this.setup()},get:function(t,e){return this.resolved?this.origin.get(this.map(t),e):void 0},getValue:function(){return this.keypath?this.origin.get(this.keypath):void 0},initViewmodel:function(t){this.local=t,this.setup()},map:function(t){return void 0===typeof this.keypath?this.localKey:t.replace(this.localKey,this.keypath)},register:function(t,e,n){this.deps.push({keypath:t,dep:e,group:n}),this.resolved&&this.origin.register(this.map(t),e,n)},resolve:function(t){void 0!==this.keypath&&this.unbind(!0),this.keypath=t,this.setup()},set:function(t,e){this.resolved||this.forceResolution(),this.origin.set(this.map(t),e)},setup:function(){var t=this;void 0!==this.keypath&&(this.resolved=!0,this.deps.length&&(this.deps.forEach(function(e){var n=t.map(e.keypath);if(t.origin.register(n,e.dep,e.group),e.dep.setValue)e.dep.setValue(t.origin.get(n));else{if(!e.dep.invalidate)throw Error("An unexpected error occurred. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");e.dep.invalidate()}}),this.origin.mark(this.keypath)))},setValue:function(t){if(!this.keypath)throw Error("Mapping does not have keypath, cannot set value. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");this.origin.set(this.keypath,t)},unbind:function(t){var e=this;t||delete this.local.mappings[this.localKey],this.resolved&&(this.deps.forEach(function(t){e.origin.unregister(e.map(t.keypath),t.dep,t.group)}),this.tracker&&this.origin.unregister(this.keypath,this.tracker))},unregister:function(t,e,n){var a,r;if(this.resolved){for(a=this.deps,r=a.length;r--;)if(a[r].dep===e){a.splice(r,1);break}this.origin.unregister(this.map(t),e,n)}}};var om=Fr,sm=function(t,e){var n,a,r,i;return n={},a=0,r=t.map(function(t,r){var o,s,p;s=a,p=e.length;do{if(o=e.indexOf(t,s),-1===o)return i=!0,-1;s=o+1}while(n[o]&&p>s);return o===a&&(a+=1),o!==r&&(i=!0),n[o]=!0,o})},pm=Ir,um={},cm=Ur,lm=Gr,dm=zr,fm=Wr,hm=Kr,mm={implicit:!0},gm={noCascade:!0},vm=$r,bm=Yr,ym=function(t){var e,n,a=t.adapt,r=t.data,i=t.ractive,o=t.computed,s=t.mappings;this.ractive=i,this.adaptors=a,this.onchange=t.onchange,this.cache={},this.cacheMap=Eo(null),this.deps={computed:Eo(null),"default":Eo(null)},this.depsMap={computed:Eo(null),"default":Eo(null)},this.patternObservers=[],this.specials=Eo(null),this.wrapped=Eo(null),this.computations=Eo(null),this.captureGroups=[],this.unresolvedImplicitDependencies=[],this.changes=[],this.implicitChanges={},this.noCascade={},this.data=r,this.mappings=Eo(null);for(e in s)this.map(E(e),s[e]);if(r)for(e in r)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(r[e]);for(e in o)s&&e in s&&l("Cannot map to a computed property ('%s')",e),this.compute(E(e),o[e]);this.ready=!0};ym.prototype={adapt:Vh,applyChanges:Hh,capture:Kh,clearCache:Qh,compute:Zh,get:em,init:am,map:rm,mark:om,merge:pm,register:cm,release:lm,reset:dm,set:fm,smartUpdate:hm,teardown:vm,unregister:bm};var xm=ym;Xr.prototype={constructor:Xr,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zr(this.queue,e).push(t):ti(this,t),delete this.inProcess[t._guid]}};var _m=Xr,wm=ei,km=/\$\{([^\}]+)\}/g,Em=new is("construct"),Sm=new is("config"),Cm=new _m("init"),Pm=0,Am=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Om=ii,Tm=ci;ci.prototype={bubble:function(){this.dirty||(this.dirty=!0,bs.addView(this))},update:function(){this.callback(this.fragment.getValue()),this.dirty=!1},rebind:function(t,e){this.fragment.rebind(t,e)},unbind:function(){this.fragment.unbind()}};var Rm=function(t,e,n,r,o){var s,p,u,c,l,d,f={},h={},g={},v=[];for(p=t.parentFragment,u=t.root,o=o||{},a(f,o),o.content=r||[],f[""]=o.content,e.defaults.el&&m("The <%s/> component has a default `el` property; it has been disregarded",t.name),c=p;c;){if(c.owner.type===Lu){l=c.owner.container;break}c=c.parent}return n&&Object.keys(n).forEach(function(e){var a,r,o=n[e];if("string"==typeof o)a=dc(o),h[e]=a?a.value:o;else if(0===o)h[e]=!0;else{if(!i(o))throw Error("erm wut");di(o)?(g[e]={origin:t.root.viewmodel,keypath:void 0},r=li(t,o[0],function(t){t.isSpecial?d?s.set(e,t.value):(h[e]=t.value,delete g[e]):d?s.viewmodel.mappings[e].resolve(t):g[e].keypath=t})):r=new Tm(t,o,function(t){d?s.set(e,t):h[e]=t}),v.push(r)}}),s=Eo(e.prototype),Om(s,{el:null,append:!0,data:h,partials:o,magic:u.magic||e.defaults.magic,modifyArrays:u.modifyArrays,adapt:u.adapt},{parent:u,component:t,container:l,mappings:g,inlinePartials:f,cssIds:p.cssIds}),d=!0,t.resolvers=v,s},Lm=fi,jm=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},Mm=mi,Dm=gi,Nm=vi,Fm=bi,Im=yi,Bm=new is("teardown"),qm=_i,Um=function(t,e){this.init(t,e)};Um.prototype={detach:bh,find:xh,findAll:_h,findAllComponents:wh,findComponent:kh,findNextNode:Eh,firstNode:Sh,init:Mm,rebind:Dm,render:Nm,toString:Fm,unbind:Im,unrender:qm};var Vm=Um,Gm=function(t){this.type=Ou,this.value=t.template.c};Gm.prototype={detach:vc,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createComment(this.value)),this.node},toString:function(){return""},unrender:function(t){t&&this.node.parentNode.removeChild(this.node)}};var zm=Gm,Wm=function(t){var e,n;this.type=Lu,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var a=this.name=t.template.n||"",r=e._inlinePartials[a];r||(m('Could not find template for partial "'+a+'"',{ractive:t.root}),r=[]),this.fragment=new rg({owner:this,root:e.parent,template:r,pElement:this.containerFragment.pElement}),i(n.yielders[a])?n.yielders[a].push(this):n.yielders[a]=[this],bs.scheduleTask(function(){if(n.yielders[a].length>1)throw Error("A component template can only have one {{yield"+(a?" "+a:"")+"}} declaration at a time")})};Wm.prototype={detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},findNextNode:function(){return this.containerFragment.findNextNode(this)},firstNode:function(){return this.fragment.firstNode()},getValue:function(t){return this.fragment.getValue(t)},render:function(){return this.fragment.render()},unbind:function(){this.fragment.unbind()},unrender:function(t){this.fragment.unrender(t),N(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Hm=Wm,Km=function(t){this.declaration=t.template.a};Km.prototype={init:ko,render:ko,unrender:ko,teardown:ko,toString:function(){return""}};var Qm=Km,$m=wi,Ym=Ei,Jm=Si,Xm=Ci,Zm=Oi,tg=Ri,eg=function(t){this.init(t)};eg.prototype={bubble:cu,detach:lu,find:du,findAll:fu,findAllComponents:hu,findComponent:mu,findNextNode:gu,firstNode:vu,getArgsList:hc,getNode:mc,getValue:gc,init:$m,rebind:Ym,registerIndexRef:function(t){var e=this.registeredIndexRefs;-1===e.indexOf(t)&&e.push(t)},render:Jm,toString:Xm,unbind:Zm,unregisterIndexRef:function(t){var e=this.registeredIndexRefs;e.splice(e.indexOf(t),1)},unrender:tg};var ng,ag,rg=eg,ig=Li,og=["template","partials","components","decorators","events"],sg=new is("reset"),pg=function(t,e){function n(e,a,r){r&&r.partials[t]||e.forEach(function(e){e.type===Au&&e.getPartialName()===t&&a.push(e),e.fragment&&n(e.fragment.items,a,r),i(e.fragments)?n(e.fragments,a,r):i(e.items)?n(e.items,a,r):e.type===Ru&&e.instance&&n(e.instance.fragment.items,a,e.instance),e.type===Pu&&(i(e.attributes)&&n(e.attributes,a,r),i(e.conditionalAttributes)&&n(e.conditionalAttributes,a,r))})}var a,r=[];return n(this.fragment.items,r),this.partials[t]=e,a=bs.start(this,!0),r.forEach(function(e){e.value=void 0,e.setValue(t)}),bs.end(),a},ug=ji,cg=xp("reverse"),lg=Mi,dg=xp("shift"),fg=xp("sort"),hg=xp("splice"),mg=Ni,gg=Fi,vg=new is("teardown"),bg=Bi,yg=qi,xg=Ui,_g=new is("unrender"),wg=xp("unshift"),kg=Vi,Eg=new is("update"),Sg=Gi,Cg={add:Zo,animate:Es,detach:Cs,find:As,findAll:Fs,findAllComponents:Is,findComponent:Bs,findContainer:qs,findParent:Us,fire:Ws,get:Hs,insert:Qs,merge:Ys,observe:lp,observeOnce:dp,off:mp,on:gp,once:vp,pop:_p,push:wp,render:Tp,reset:ig,resetPartial:pg,resetTemplate:ug,reverse:cg,set:lg,shift:dg,sort:fg,splice:hg,subtract:mg,teardown:gg,toggle:bg,toHTML:yg,toHtml:yg,unrender:xg,unshift:wg,update:kg,updateModel:Sg},Pg=function(t,e,n){return n||Wi(t,e)?function(){var n,a="_super"in this,r=this._super;return this._super=e,n=t.apply(this,arguments),a&&(this._super=r),n}:t},Ag=Hi,Og=Yi,Tg=function(t){var e,n,a={};return t&&(e=t._ractive)?(a.ractive=e.root,a.keypath=e.keypath.str,a.index={},(n=Oc(e.proxy.parentFragment))&&(a.index=Oc.resolve(n)),a):a};ng=function(t){return this instanceof ng?void Om(this,t):new ng(t)},ag={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Og},getNodeInfo:{value:Tg},parse:{value:Hp},Promise:{value:us},svg:{value:ao},magic:{value:eo},VERSION:{value:"0.7.3"},adaptors:{writable:!0,value:{}},components:{writable:!0,value:{}},decorators:{writable:!0,value:{}},easing:{writable:!0,value:po},events:{writable:!0,value:{}},interpolators:{writable:!0,value:Vo},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Co(ng,ag),ng.prototype=a(Cg,so),ng.prototype.constructor=ng,ng.defaults=ng.prototype;var Rg="function";if(typeof Date.now!==Rg||typeof String.prototype.trim!==Rg||typeof Object.keys!==Rg||typeof Array.prototype.indexOf!==Rg||typeof Array.prototype.forEach!==Rg||typeof Array.prototype.map!==Rg||typeof Array.prototype.filter!==Rg||"undefined"!=typeof window&&typeof window.addEventListener!==Rg)throw Error("It looks like you're attempting to use Ractive.js in an older browser. You'll need to use one of the 'legacy builds' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.");var Lg=ng;return Lg})},{}],206:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,a){var r=t.get(),i=r.min,o=r.max,s=Math.clamp(i,o,e);t.animate("percentage",Math.round((s-i)/(o-i)*100))})}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,305],t:7,e:"div",a:{"class":"bar"},f:[{p:[14,3,326],t:7,e:"div",a:{"class":["barFill ",{t:2,r:"state",p:[14,23,346]}],style:["width: ",{t:2,r:"percentage",p:[14,48,371]},"%"]}}," ",{p:[15,3,398],t:7,e:"span",a:{"class":"barText"},f:[{t:16,p:[15,25,420]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],207:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(338),a=t(337);e.exports={computed:{clickable:function(){return!this.get("enabled")||this.get("state")&&"toggle"!=this.get("state")?!1:!0},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t="";if(this.get("class")&&(t+=" "+this.get("class")),this.get("tooltip-side")&&(t=" tooltip-"+this.get("tooltip-side")),this.get("grid")&&(t+=" gridable"),this.get("enabled")){var e=this.get("state"),n=this.get("style");return e?"inactive "+e+" "+t:"active normal "+n+" "+t}return"inactive disabled "+t}},oninit:function(){var t=this;this.on("press",function(e){var n=t.get(),r=n.action,i=n.params;(0,a.act)(t.get("config.ref"),r,i),e.node.blur()})},data:{iconStackToHTML:function(t){var e="",n=t.split(",");if(n.length){e+='';for(var a=n,r=Array.isArray(a),i=0,a=r?a:a[Symbol.iterator]();;){var o;if(r){if(i>=a.length)break;o=a[i++]}else{if(i=a.next(),i.done)break;o=i.value}var s=o,p=/([\w\-]+)\s*(\dx)/g,u=p.exec(s),c=u[1],l=u[2];e+=''}}return e&&(e+=""),e}}}}(r),r.exports.template={v:3,t:[" ",{p:[70,1,2019],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[70,21,2039]}],unselectable:"on","data-tooltip":[{t:2,r:"tooltip",p:[73,17,2124]}]},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[72,3,2075]}],v:{"mouseover-mousemove":"hover",mouseleave:"unhover","click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[76,19,2217]}],d:[]}},f:[{t:4,f:[{p:[78,5,2265],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[78,21,2281]}]}}],n:50,r:"icon",p:[77,3,2247]}," ",{t:4,f:[{t:3,x:{r:["iconStackToHTML","icon_stack"],s:"_0(_1)"},p:[81,6,2335]}],n:50,r:"icon_stack",p:[80,3,2310]}," ",{t:16,p:[83,3,2383]}]}]},e.exports=a.extend(r.exports)},{205:205,337:337,338:338}],208:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"display"},f:[{t:4,f:[{p:[3,5,44],t:7,e:"header",f:[{p:[4,7,60],t:7,e:"h3",f:[{t:2,r:"title",p:[4,11,64]}]}," ",{t:4,f:[{p:[6,9,110],t:7,e:"div",a:{"class":"buttonRight"},f:[{t:16,n:"button",p:[6,34,135]}]}],n:50,r:"button",p:[5,7,86]}]}],n:50,r:"title",p:[2,3,25]}," ",{p:[10,3,202],t:7,e:"article",f:[{t:16,p:[11,5,217]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],209:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.on("clear",function(){t.set("value",""),t.find("input").focus()})}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,170],t:7,e:"input",a:{type:"text",value:[{t:2,r:"value",p:[12,27,196]}],placeholder:[{t:2,r:"placeholder",p:[12,51,220]}]}}," ",{p:[13,1,240],t:7,e:"ui-button",a:{icon:"refresh"},v:{press:"clear"}}]},e.exports=a.extend(r.exports)},{205:205}],210:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";e.exports={data:{graph:t(201),xaccessor:function(t){return t.x},yaccessor:function(t){return t.y}},computed:{size:function(){var t=this.get("points");return t[0].length},scale:function(){var t=this.get("points");return Math.max.apply(Math,Array.map(t,function(t){return Math.max.apply(Math,Array.map(t,function(t){return t.y}))}))},xaxis:function(){var t=this.get("xinc"),e=this.get("size");return Array.from(Array(e).keys()).filter(function(e){return e&&e%t==0})},yaxis:function(){var t=this.get("yinc"),e=this.get("scale");return Array.from(Array(t).keys()).map(function(t){return Math.round(e*(++t/100)*10)})}},oninit:function(){var t=this;this.on({enter:function(t){this.set("selected",t.index.count)},exit:function(t){this.set("selected")}}),window.addEventListener("resize",function(e){t.set("width",t.el.clientWidth)})},onrender:function(){this.set("width",this.el.clientWidth)}}}(r),r.exports.template={v:3,t:[" ",{p:[47,1,1269],t:7,e:"svg",a:{"class":"linegraph",width:"100%",height:[{t:2,x:{r:["height"],s:"_0+10"},p:[47,45,1313]}]},f:[{p:[48,3,1334],t:7,e:"g",a:{transform:"translate(0, 5)"},f:[{t:4,f:[{t:4,f:[{p:[51,9,1504],t:7,e:"line",a:{x1:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,19,1514]}],x2:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,38,1533]}],y1:"0",y2:[{t:2,r:"height",p:[51,64,1559]}],stroke:"darkgray"}}," ",{t:4,f:[{p:[53,11,1635],t:7,e:"text",a:{x:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[53,20,1644]}],y:[{t:2,x:{r:["height"],s:"_0-5"},p:[53,38,1662]}],"text-anchor":"middle",fill:"white"},f:[{t:2,x:{r:["size",".","xfactor"],s:"(_0-_1)*_2"},p:[53,88,1712]}," ",{t:2,r:"xunit",p:[53,113,1737]}]}],n:50,x:{r:["@index"],s:"_0%2==0"},p:[52,9,1600]}],n:52,r:"xaxis",p:[50,7,1479]}," ",{t:4,f:[{p:[57,9,1820],t:7,e:"line",a:{x1:"0",x2:[{t:2,r:"width",p:[57,26,1837]}],y1:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,41,1852]}],y2:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,60,1871]}],stroke:"darkgray"}}," ",{p:[58,9,1915],t:7,e:"text",a:{x:"0",y:[{t:2,x:{r:["yscale","."],s:"_0(_1)-5"},p:[58,24,1930]}],"text-anchor":"begin",fill:"white"},f:[{t:2,x:{r:[".","yfactor"],s:"_0*_1"},p:[58,76,1982]}," ",{t:2,r:"yunit",p:[58,92,1998]}]}],n:52,r:"yaxis",p:[56,7,1795]}," ",{t:4,f:[{p:[61,9,2071],t:7,e:"path",a:{d:[{t:2,x:{r:["area.path"],s:"_0.print()"},p:[61,18,2080]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[61,47,2109]}],opacity:"0.1"}}],n:52,i:"curve",r:"curves",p:[60,7,2039]}," ",{t:4,f:[{p:[64,9,2200],t:7,e:"path",a:{d:[{t:2,x:{r:["line.path"],s:"_0.print()"},p:[64,18,2209]}],stroke:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[64,49,2240]}],fill:"none"}}],n:52,i:"curve",r:"curves",p:[63,7,2168]}," ",{t:4,f:[{t:4,f:[{p:[68,11,2375],t:7,e:"circle",a:{transform:["translate(",{t:2,r:".",p:[68,40,2404]},")"],r:[{t:2,x:{r:["selected","count"],s:"_0==_1?10:4"},p:[68,51,2415]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[68,89,2453]}]},v:{mouseenter:"enter",mouseleave:"exit"}}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[67,9,2329]}],n:52,i:"curve",r:"curves",p:[66,7,2297]}," ",{t:4,f:[{t:4,f:[{t:4,f:[{p:[74,13,2678],t:7,e:"text",a:{transform:["translate(",{t:2,r:".",p:[74,40,2705]},") ",{t:2,x:{r:["count","size"],s:'_0<=_1/2?"translate(15, 4)":"translate(-15, 4)"'},p:[74,47,2712]}],"text-anchor":[{t:2,x:{r:["count","size"],s:'_0<=_1/2?"start":"end"'},p:[74,126,2791]}],fill:"white"},f:[{t:2,x:{r:["count","item","yfactor"],s:"_1[_0].y*_2"},p:[75,15,2861]}," ",{t:2,r:"yunit",p:[75,43,2889]}," @ ",{t:2,x:{r:["size","count","item","xfactor"],s:"(_0-_2[_1].x)*_3"},p:[75,55,2901]}," ",{t:2,r:"xunit",p:[75,92,2938]}]}],n:50,x:{r:["selected","count"],s:"_0==_1"},p:[73,11,2638]}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[72,9,2592]}],n:52,i:"curve",r:"curves",p:[71,7,2560]}," ",{t:4,f:[{p:[81,9,3063],t:7,e:"g",a:{transform:["translate(",{t:2,x:{r:["width","curves.length","@index"],s:"(_0/(_1+1))*(_2+1)"},p:[81,33,3087]},", 10)"]},f:[{p:[82,11,3154],t:7,e:"circle",a:{r:"4",fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[82,31,3174]}]}}," ",{p:[83,11,3206],t:7,e:"text",a:{x:"8",y:"4",fill:"white"},f:[{t:2,rx:{r:"legend",m:[{t:30,n:"curve"}]},p:[83,42,3237]}]}]}],n:52,i:"curve",r:"curves",p:[80,7,3031]}],x:{r:["graph","points","xaccessor","yaccessor","width","height"],s:"_0({data:_1,xaccessor:_2,yaccessor:_3,width:_4,height:_5})"},p:[49,5,1371]}]}]}]},e.exports=a.extend(r.exports)},{201:201,205:205}],211:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,24]}]}]},e.exports=a.extend(r.exports)},{205:205}],212:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(337),a=t(339);e.exports={oninit:function(){var t=this,e=a.resize.bind(this),r=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(a,i,o){(0,n.winset)(t.get("config.window"),"can-resize",!a),a?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",r)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",r))}),this.on("resize",function(){return t.toggle("resize")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[28,3,766],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[27,1,742]}]},e.exports=a.extend(r.exports)},{205:205,337:337,339:339}],213:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",a:{"class":[{t:4,f:["candystripe"],r:"candystripe",p:[1,17,16]}]},f:[{t:4,f:[{p:[3,5,84],t:7,e:"span",a:{"class":"label",style:[{t:4,f:["color:",{t:2,r:"labelcolor",p:[3,53,132]}],r:"labelcolor",p:[3,32,111]}]},f:[{t:2,r:"label",p:[3,84,163]},":"]}],n:50,r:"label",p:[2,3,65]}," ",{t:4,f:[{t:16,p:[6,5,215]}],n:50,r:"nowrap",p:[5,3,195]},{t:4,n:51,f:[{p:[8,5,242],t:7,e:"div",a:{"class":"content",style:[{t:4,f:["float:right;"],r:"right",p:[8,33,270]}]},f:[{t:16,p:[9,7,312]}]}],r:"nowrap"}]}]},e.exports=a.extend(r.exports)},{205:205}],214:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,47],t:7,e:"header",f:[{p:[4,7,63],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,67]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,103]}],n:50,r:"button",p:[5,7,89]}]}],n:50,r:"title",p:[2,3,28]}," ",{p:[8,3,156],t:7,e:"article",f:[{t:16,p:[9,5,171]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],215:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.set("active",this.findComponent("tab").get("name")),this.on("switch",function(e){t.set("active",e.node.textContent.trim())}),this.observe("active",function(e,n,a){for(var r=t.findAllComponents("tab"),i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;p.set("shown",p.get("name")===e)}})}}}(r),r.exports.template={v:3,t:[" "," ",{p:[20,1,524],t:7,e:"header",f:[{t:4,f:[{p:[22,5,556],t:7,e:"ui-button",a:{pane:[{t:2,r:".",p:[22,22,573]}]},v:{press:"switch"},f:[{t:2,r:".",p:[22,47,598]}]}],n:52,r:"tabs",p:[21,3,536]}]}," ",{p:[25,1,641],t:7,e:"ui-display",f:[{t:8,r:"content",p:[26,3,657]}]}]},r.exports.components=r.exports.components||{};var i={tab:t(216)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,216:216}],216:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],217:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(338),a=t(337),r=t(339);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this,e=r.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(r,i,o){(0,a.winset)(t.get("config.window"),"titlebar",!r&&t.get("config.titlebar")),r?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",n)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n))}),this.on({drag:function(){this.toggle("drag")},close:function(){(0,a.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,a.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,a.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[50,3,1440],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[51,5,1491],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[51,42,1528]}]}}," ",{p:[52,5,1556],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[52,25,1576]}]}," ",{t:4,f:[{p:[54,7,1626],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[55,7,1696],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[53,5,1598]}]}],n:50,r:"config.titlebar",p:[49,1,1413]}]},e.exports=a.extend(r.exports)},{205:205,337:337,338:338,339:339}],218:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e){var n=document.createElement("div");if(n.innerHTML="",n.getElementsByTagName("span").length)return t}}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,662],t:7,e:"ui-notice",f:[{p:[28,5,679],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,704]},"), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,811],t:7,e:"br"}," ",{p:[29,5,822],t:7,e:"span",f:["To upgrade, click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,898],t:7,e:"br"}," ",{p:[30,5,909],t:7,e:"span",f:["If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,1026],t:7,e:"br"}," ",{p:[31,5,1037],t:7,e:"span",f:["Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1155],t:7,e:"hr"}," ",{p:[33,5,1166],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1240],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1416],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1565],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1738],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1826],t:7,e:"hr"}," ",{p:[43,7,1839],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1857]}]},{p:[43,38,1870],t:7,e:"br"}," ",{p:[44,7,1883],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1901]}]}],n:50,r:"debug",p:[41,5,1805]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,621]}]},e.exports=a.extend(r.exports)},{205:205}],219:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default: return"bad"}},shockState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[22,1,348],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[23,2,384],t:7,e:"ui-section",a:{label:"Main"},f:[{p:[24,3,413],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.main"],s:"_0(_1)"},p:[24,16,426]}]},f:[{t:2,x:{r:["data.power.main"],s:'_0?"Online":"Offline"'},p:[24,49,459]}]}," ",{t:4,f:["[ ",{p:[26,6,567],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"},p:[25,3,512]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.main_timeleft",p:[29,7,674]}," seconds left ]"],n:50,x:{r:["data.power.main_timeleft"],s:"_0>0"},p:[28,4,630]}],x:{r:["data.wires.main_1","data.wires.main_2"],s:"!_0||!_1"}}," ",{p:[32,3,744],t:7,e:"div",a:{style:"float:right"},f:[{p:[33,4,774],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-main",state:[{t:2,x:{r:["data.power.main"],s:'_0?null:"disabled"'},p:[33,63,833]}]},f:["Disrupt"]}]}]}," ",{p:[36,2,922],t:7,e:"ui-section",a:{label:"Backup"},f:[{p:[37,3,953],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.power.backup"],s:"_0(_1)"},p:[37,16,966]}]},f:[{t:2,x:{r:["data.power.backup"],s:'_0?"Online":"Offline"'},p:[37,51,1001]}]}," ",{t:4,f:["[ ",{p:[39,6,1115],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"},p:[38,3,1056]},{t:4,n:51,f:[{t:4,f:["[ ",{t:2,r:"data.power.backup_timeleft",p:[42,7,1224]}," seconds left ]"],n:50,x:{r:["data.power.backup_timeleft"],s:"_0>0"},p:[41,4,1178]}],x:{r:["data.wires.backup_1","data.wires.backup_2"],s:"!_0||!_1"}}," ",{p:[45,3,1296],t:7,e:"div",a:{style:"float:right"},f:[{p:[46,4,1326],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"disrupt-backup",state:[{t:2,x:{r:["data.power.backup"],s:'_0?null:"disabled"'},p:[46,65,1387]}]},f:["Disrupt"]}]}]}," ",{p:[49,2,1478],t:7,e:"ui-section",a:{label:"Electrify"},f:[{p:[50,3,1512],t:7,e:"span",a:{"class":[{t:2,x:{r:["shockState","data.shock"],s:"_0(_1)"},p:[50,16,1525]}]},f:[{t:2,x:{r:["data.shock"],s:'_0==2?"Safe":"Electrified"'},p:[50,44,1553]}]}," ",{t:4,f:["[ ",{p:[52,6,1640],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.shock"],s:"!_0"},p:[51,3,1608]},{t:4,n:51,f:[{t:4,f:["[ ",{p:[55,7,1742],t:7,e:"span",a:{"class":"bad"},f:[{t:2,r:"data.shock_timeleft",p:[55,25,1760]}," seconds left"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0>0"},p:[54,4,1703]}," ",{t:4,f:["[ ",{p:[58,7,1863],t:7,e:"span",a:{"class":"bad"},f:["Permanent"]}," ]"],n:50,x:{r:["data.shock_timeleft"],s:"_0==-1"},p:[57,4,1822]}],x:{r:["data.wires.shock"],s:"!_0"}}," ",{p:[61,3,1926],t:7,e:"div",a:{style:"float:right"},f:[{p:[62,4,1956],t:7,e:"ui-button",a:{icon:"wrench",action:"shock-restore",state:[{t:2,x:{r:["data.wires.shock","data.shock"],s:'_0&&_1==0?null:"disabled"'},p:[62,59,2011]}]},f:["Restore"]}," ",{p:[63,4,2094],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-temp",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[63,54,2144]}]},f:["Set (Temporary)"]}," ",{p:[64,4,2199],t:7,e:"ui-button",a:{icon:"bolt",action:"shock-perm",state:[{t:2,x:{r:["data.wires.shock"],s:"!_0"},p:[64,53,2248]}]},f:["Set (Permanent)"]}]}]}]}," ",{p:[68,1,2341],t:7,e:"ui-display",a:{title:"Access & Door Control"},f:[{p:[69,2,2386],t:7,e:"ui-section",a:{label:"ID Scan"},f:[{t:4,f:["[ ",{p:[71,6,2455],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[70,3,2418]}," ",{p:[73,3,2516],t:7,e:"div",a:{style:"float:right"},f:[{p:[74,4,2546],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[74,22,2564]}],icon:"power-off",action:"idscan-on",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"selected":""'},p:[74,93,2635]}]},f:["Enabled"]}," ",{p:[75,4,2698],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.id_scanner"],s:"!_0"},p:[75,22,2716]}],icon:"close",action:"idscan-off",style:[{t:2,x:{r:["data.id_scanner"],s:'_0?"":"selected"'},p:[75,90,2784]}]},f:["Disabled"]}]}]}," ",{p:[78,2,2872],t:7,e:"ui-section",a:{label:"Emergency Access"},f:[{p:[79,3,2913],t:7,e:"div",a:{style:"float:right"},f:[{p:[80,4,2943],t:7,e:"ui-button",a:{icon:"power-off",action:"emergency-on",style:[{t:2,x:{r:["data.emergency"],s:'_0?"selected":""'},p:[80,61,3e3]}]},f:["Enabled"]}," ",{p:[81,4,3062],t:7,e:"ui-button",a:{icon:"close",action:"emergency-off",style:[{t:2,x:{r:["data.emergency"],s:'_0?"":"selected"'},p:[81,58,3116]}]},f:["Disabled"]}]}]}," ",{p:[84,2,3203],t:7,e:"br"}," ",{p:[85,2,3212],t:7,e:"ui-section",a:{label:"Door bolts"},f:[{t:4,f:["[ ",{p:[87,6,3279],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.bolts"],s:"!_0"},p:[86,3,3247]}," ",{p:[89,3,3340],t:7,e:"div",a:{style:"float:right"},f:[{p:[90,4,3370],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[90,22,3388]}],icon:"unlock",action:"bolt-raise",style:[{t:2,x:{r:["data.locked"],s:'_0?"":"selected"'},p:[90,85,3451]}]},f:["Raised"]}," ",{p:[91,4,3509],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.bolts"],s:"!_0"},p:[91,22,3527]}],icon:"lock",action:"bolt-drop",style:[{t:2,x:{r:["data.locked"],s:'_0?"selected":""'},p:[91,82,3587]}]},f:["Dropped"]}]}]}," ",{p:[94,2,3670],t:7,e:"ui-section",a:{label:"Door bolt lights"},f:[{t:4,f:["[ ",{p:[96,6,3744],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.lights"],s:"!_0"},p:[95,3,3711]}," ",{p:[98,3,3805],t:7,e:"div",a:{style:"float:right"},f:[{p:[99,4,3835],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[99,22,3853]}],icon:"power-off",action:"light-on",style:[{t:2,x:{r:["data.lights"],s:'_0?"selected":""'},p:[99,88,3919]}]},f:["Enabled"]}," ",{p:[100,4,3978],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.lights"],s:"!_0"},p:[100,22,3996]}],icon:"close",action:"light-off",style:[{t:2,x:{r:["data.lights"],s:'_0?"":"selected"'},p:[100,85,4059]}]},f:["Disabled"]}]}]}," ",{p:[103,2,4143],t:7,e:"ui-section",a:{label:"Door force sensors"},f:[{t:4,f:["[ ",{p:[105,6,4217],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.safe"],s:"!_0"},p:[104,3,4186]}," ",{p:[107,3,4278],t:7,e:"div",a:{style:"float:right"},f:[{p:[108,4,4308],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[108,22,4326]}],icon:"power-off",action:"safe-on",style:[{t:2,x:{r:["data.safe"],s:'_0?"selected":""'},p:[108,85,4389]}]},f:["Enabled"]}," ",{p:[109,4,4446],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.safe"],s:"!_0"},p:[109,22,4464]}],icon:"close",action:"safe-off",style:[{t:2,x:{r:["data.safe"],s:'_0?"":"selected"'},p:[109,82,4524]}]},f:["Disabled"]}]}]}," ",{p:[112,2,4606],t:7,e:"ui-section",a:{label:"Door timing saftey"},f:[{t:4,f:["[ ",{p:[114,6,4682],t:7,e:"span",a:{"class":"bad"},f:["Wires have been cut"]}," ]"],n:50,x:{r:["data.wires.timing"],s:"!_0"},p:[113,3,4649]}," ",{p:[116,3,4743],t:7,e:"div",a:{style:"float:right"},f:[{p:[117,4,4773],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[117,22,4791]}],icon:"power-off",action:"speed-on",style:[{t:2,x:{r:["data.speed"],s:'_0?"selected":""'},p:[117,88,4857]}]},f:["Enabled"]}," ",{p:[118,4,4915],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.wires.timing"],s:"!_0"},p:[118,22,4933]}],icon:"close",action:"speed-off",style:[{t:2,x:{r:["data.speed"],s:'_0?"":"selected"'},p:[118,85,4996]}]},f:["Disabled"]}]}]}," ",{p:[121,2,5079],t:7,e:"br"}," ",{p:[122,2,5088],t:7,e:"ui-section",a:{label:"Door control"},f:[{t:4,f:["[ ",{p:[124,6,5166],t:7,e:"span",a:{"class":"bad"},f:["Door is ",{t:2,x:{r:["data.locked","data.welded"],s:'(_0?"bolted":"")+(_0&&_1?" and ":"")+(_1?"welded":"")'},p:[124,32,5192]}]}," ]"],n:50,x:{r:["data.locked","data.welded"],s:"_0||_1"},p:[123,3,5125]}," ",{p:[126,3,5327],t:7,e:"div",a:{style:"float:right"},f:[{p:[127,4,5357],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(_2&&"disabled")'},p:[127,22,5375]}],icon:"sign-out",action:"open-close"},f:["Open door"]}," ",{p:[128,4,5502],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.locked","data.welded","data.opened"],s:'(_0||_1)||(!_2&&"disabled")'},p:[128,22,5520]}],icon:"sign-in",action:"open-close"},f:["Close door"]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],220:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," ",{p:[7,1,267],t:7,e:"ui-notice",f:[{t:4,f:[{p:[9,5,312],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[10,7,355],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[10,24,372]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[10,75,423]}]}]}],n:50,r:"data.siliconUser",p:[8,3,282]},{t:4,n:51,f:[{p:[13,5,514],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,31,540]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[16,1,625],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[19,7,719],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,762],t:7,e:"ui-section",f:[{p:[21,11,786],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,803]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,873]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,937]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1045],t:7,e:"ui-section",f:[{p:[25,11,1069],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1086]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1154]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1236]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1322],t:7,e:"br"}," ",{p:[29,9,1337],t:7,e:"ui-section",f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1494],t:7,e:"ui-section",f:[{p:[33,11,1518],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1657],t:7,e:"ui-section",f:[{p:[36,11,1681],t:7,e:"ui-button",a:{icon:"cog",action:"tgui:view",params:'{"screen": "modes"}'},f:["Operating Mode"]}]}," ",{p:[38,9,1810],t:7,e:"ui-section",f:[{p:[39,11,1834],t:7,e:"ui-button",a:{icon:"bar-chart",action:"tgui:view",params:'{"screen": "thresholds"}'},f:["Alarm Thresholds"]}]}]}],n:50,x:{r:["config.screen"],s:'_0=="home"'},p:[18,3,680]},{t:4,n:51,f:[{t:4,n:50,x:{r:["config.screen"],s:'_0=="vents"'},f:[{p:[43,5,2032],t:7,e:"vents"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&(_0=="scrubbers")'},f:[" ",{p:[45,5,2089],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&(_0=="modes"))'},f:[" ",{p:[47,5,2146],t:7,e:"modes"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&((!(_0=="modes"))&&(_0=="thresholds")))'},f:[" ",{p:[49,5,2204],t:7,e:"thresholds"}]}],x:{r:["config.screen"],s:'_0=="home"'}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[17,1,636]}]},r.exports.components=r.exports.components||{};var i={vents:t(226),modes:t(222),thresholds:t(225),status:t(224),scrubbers:t(223)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,222:222,223:223,224:224,225:225,226:226}],221:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"tgui:view",params:'{"screen": "home"}'},f:["Back"]}]},e.exports=a.extend(r.exports)},{205:205}],222:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,115],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,168],t:7,e:"ui-section",f:[{p:[9,7,188],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,205]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,267]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,361]},"}"]},f:[{t:2,r:"name",p:[11,51,372]}]}]}],n:52,r:"data.modes",p:[7,3,142]}]}]},r.exports.components=r.exports.components||{};var i={back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221}],223:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," ",{p:{button:[{p:[6,5,185],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[9,5,242],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[9,27,264]}]},f:[{p:[10,7,287],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,323],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[11,26,340]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[11,68,382]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[12,46,459]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[12,66,479]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[12,80,493]}]}]}," ",{p:[14,7,558],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[15,9,593],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[15,26,610]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[15,71,655]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[16,50,738]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[16,70,758]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[16,88,776]}]}]}," ",{p:[18,7,858],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[19,9,894],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[19,26,911]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[19,70,955]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,1036]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[20,68,1056]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[20,84,1072]}]}]}," ",{p:[22,7,1148],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[23,9,1186],t:7,e:"filters"}]}]}],n:52,r:"data.scrubbers",p:[8,3,212]},{t:4,n:51,f:[{p:[27,5,1257],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},r.exports.components=r.exports.components||{};var i={filters:t(313),back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221,313:313}],224:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,110],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,129]}]},f:[{p:[5,6,146],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,159]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,237]},{t:2,r:"unit",p:[6,29,261]}]}]}],n:52,r:"adata.environment_data",p:[3,5,70]}," ",{p:[10,5,322],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,363],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,376]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,475]}]}]}," ",{p:[15,5,619],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,659],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,672]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,744]}]}]}],n:50,r:"data.environment_data",p:[2,3,35]},{t:4,n:51,f:[{p:[21,5,876],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,912],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1040],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1076],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,1014]}]}]},e.exports=a.extend(r.exports)},{205:205}],225:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,116],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,143],t:7,e:"table",f:[{p:[8,5,156],t:7,e:"thead",f:[{p:[8,12,163],t:7,e:"tr",f:[{p:[9,7,175],t:7,e:"th"}," ",{p:[10,7,192],t:7,e:"th",f:[{p:[10,11,196],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,238],t:7,e:"th",f:[{p:[11,11,242],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,288],t:7,e:"th",f:[{p:[12,11,292],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{p:[13,7,338],t:7,e:"th",f:[{p:[13,11,342],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,401],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,441],t:7,e:"tr",f:[{p:[17,9,455],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,459]}]}," ",{t:4,f:[{p:[18,27,502],t:7,e:"td",f:[{p:[19,11,518],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,565]},'", "var": "',{t:2,r:"val",p:[19,76,583]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,594]}]}]}],n:52,r:"settings",p:[18,9,484]}]}],n:52,r:"data.thresholds",p:[16,7,416]}]}," ",{p:[23,3,697],t:7,e:"table",f:[]}]}]}," "]},r.exports.components=r.exports.components||{};var i={back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221}],226:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,166],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,188]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,264]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,306]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,383]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,403]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,417]}]}]}," ",{p:[13,7,482],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,517],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,523]}]}]}," ",{p:[16,7,616],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,665],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,698]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,779]},'", "val": ',{t:2,r:"checks",p:[18,68,799]},"}"]},f:["Internal"]}," ",{p:[19,9,842],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,876]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,957]},'", "val": ',{t:2,r:"checks",p:[20,68,977]},"}"]},f:["External"]}]}," ",{t:4,f:[{p:[23,9,1064],t:7,e:"ui-section",a:{label:"Internal Target Pressure"},f:[{p:[24,11,1121],t:7,e:"ui-button",a:{icon:"pencil",action:"set_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,33,1210]},'"}']},f:[{t:2,x:{r:["internal"],s:"Math.fixed(_0)"},p:[25,47,1224]}]}," ",{p:[26,11,1272],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["intdefault"],s:'_0?"disabled":null'},p:[26,44,1305]}],action:"reset_internal_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,33,1407]},'"}']},f:["Reset"]}]}],n:50,r:"incheck",p:[22,7,1039]}," ",{t:4,f:[{p:[31,11,1511],t:7,e:"ui-section",a:{label:"External Target Pressure"},f:[{p:[32,13,1570],t:7,e:"ui-button",a:{icon:"pencil",action:"set_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[33,35,1661]},'"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[33,49,1675]}]}," ",{p:[34,13,1725],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[34,46,1758]}],action:"reset_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[35,35,1862]},'"}']},f:["Reset"]}]}],n:50,r:"excheck",p:[30,7,1484]}]}],n:52,r:"data.vents",p:[7,3,140]},{t:4,n:51,f:[{p:[40,5,1973],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},r.exports.components=r.exports.components||{};var i={back:t(221)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221}],227:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.css=" table {\r\n width: 100%;\r\n border-spacing: 2px;\r\n }\r\n th {\r\n text-align: left;\r\n }\r\n td {\r\n vertical-align: top;\r\n }\r\n td .button {\r\n margin-top: 4px\r\n }",r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",f:[{p:[3,5,34],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,51]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,111]}," Required"]}," ",{p:[4,5,172],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,251],t:7,e:"hr"}," ",{p:[7,3,260],t:7,e:"table",f:[{p:[8,3,271],t:7,e:"thead",f:[{p:[9,4,283],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,315],t:7,e:"th",f:[{p:[10,9,319],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,348]}]}]}],n:52,r:"data.regions",p:[9,8,287]}]}]}," ",{p:[13,3,403],t:7,e:"tbody",f:[{p:[14,4,415],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,447],t:7,e:"td",f:[{t:4,f:[{p:[16,11,481],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,498]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,546]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,621]},'"}']},f:[{t:2,r:"name",p:[17,56,631]}]}," ",{p:[18,9,661],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,451]}]}],n:52,r:"data.regions",p:[14,8,419]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{205:205}],228:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[46,2,1206],t:7,e:"ui-notice",f:[{p:[47,3,1221],t:7,e:"b",f:[{p:[47,6,1224],t:7,e:"h3",f:["SYSTEM FAILURE"]}]}," ",{p:[48,3,1255],t:7,e:"i",f:["I/O regulators malfunction detected! Waiting for system reboot..."]},{p:[48,75,1327],t:7,e:"br"}," Automatic reboot in ",{t:2,r:"data.failTime",p:[49,23,1355]}," seconds... ",{p:[50,3,1387],t:7,e:"ui-button",a:{icon:"refresh",action:"reboot"},f:["Reboot Now"]},{p:[50,67,1451],t:7,e:"br"},{p:[50,71,1455],t:7,e:"br"},{p:[50,75,1459],t:7,e:"br"}]}],n:50,r:"data.failTime",p:[45,1,1182]},{t:4,n:51,f:[{p:[53,2,1491],t:7,e:"ui-notice",f:[{t:4,f:[{p:[55,3,1535],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[56,5,1576],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[56,22,1593]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[56,73,1644]}]}]}],n:50,r:"data.siliconUser",p:[54,4,1507]},{t:4,n:51,f:[{p:[59,3,1732],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[59,29,1758]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[62,2,1846],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[63,4,1884],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[65,5,1967],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[65,18,1980]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[65,57,2019]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[64,3,1921]},{t:4,n:51,f:[{p:[67,5,2079],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[67,22,2096]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[67,75,2149]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[68,21,2212]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[71,4,2293],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[72,3,2332],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[72,16,2345]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[72,52,2381]}]}]}," ",{p:[74,4,2490],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[76,5,2567],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[76,38,2600]}],state:[{t:2,r:"powerCellStatusState",p:[76,71,2633]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[76,97,2659]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[75,3,2525]},{t:4,n:51,f:[{p:[78,5,2724],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[82,3,2830],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[84,4,2913],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[84,17,2926]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[84,55,2964]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[83,5,2868]},{t:4,n:51,f:[{p:[86,4,3026],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[86,21,3043]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[86,71,3093]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[87,22,3156]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[90,6,3236],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[90,19,3249]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[90,56,3286]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[81,4,2790]}]}," ",{p:[94,2,3445],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[96,3,3517],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[96,22,3536]}],nowrap:0},f:[{p:[97,5,3560],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.powerChannels",m:[{t:30,n:"@index"},"powerLoad"]},p:[97,26,3581]}]}," ",{p:[98,5,3634],t:7,e:"div",a:{"class":"content"},f:[{p:[98,26,3655],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[98,39,3668]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[98,73,3702]}]}]}," ",{p:[99,5,3751],t:7,e:"div",a:{"class":"content"},f:["[",{p:[99,27,3773],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[99,33,3779]}]},"]"]}," ",{p:[100,5,3849],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[102,6,3942],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[102,39,3975]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[103,30,4057]}]},f:["Auto"]}," ",{p:[104,6,4102],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[104,41,4137]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[105,13,4204]}]},f:["On"]}," ",{p:[106,6,4245],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[106,37,4276]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[107,13,4343]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[101,4,3895]}]}]}],n:52,r:"data.powerChannels",p:[95,4,3485]}," ",{p:[112,4,4439],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[113,3,4474],t:7,e:"span",a:{"class":"bold"},f:[{t:2,r:"adata.totalLoad",p:[113,22,4493]}]}]}]}," ",{t:4,f:[{p:[117,4,4585],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[118,3,4626],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[120,5,4727],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[120,22,4744]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[120,43,4765]}],action:[{t:2,r:"malfAction",p:[120,97,4819]}]},f:[{t:2,r:"malfButton",p:[120,113,4835]}]}],n:50,r:"data.malfStatus",p:[119,3,4698]}]}],n:50,r:"data.siliconUser",p:[116,2,4556]}," ",{p:[124,2,4903],t:7,e:"ui-notice",f:[{p:[125,4,4919],t:7,e:"ui-section",a:{label:"Emergency Light Fallback"},f:[{t:4,f:[{p:[127,8,5020],t:7,e:"span",f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[127,14,5026]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[126,6,4971]},{t:4,n:51,f:[{p:[129,8,5106],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"emergency_lighting"},f:[{t:2,x:{r:["data.emergencyLights"],s:'_0?"Enabled":"Disabled"'},p:[129,66,5164]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[133,2,5275],t:7,e:"ui-notice",f:[{p:[134,4,5291],t:7,e:"ui-section",a:{label:"Night Shift Lighting"},f:[{t:4,f:[{p:[136,8,5388],t:7,e:"span",f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[136,14,5394]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[135,6,5339]},{t:4,n:51,f:[{p:[138,8,5475],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"toggle_nightshift"},f:[{t:2,x:{r:["data.nightshiftLights"],s:'_0?"Enabled":"Disabled"'},p:[138,65,5532]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}," ",{p:[142,2,5644],t:7,e:"ui-notice",f:[{p:[143,4,5660],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[145,5,5741],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[145,11,5747]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[144,3,5695]},{t:4,n:51,f:[{p:[147,5,5819],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[147,22,5836]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[147,79,5893]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}],r:"data.failTime"}]},e.exports=a.extend(r.exports)},{205:205}],229:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Alarms"},f:[{p:[2,3,31],t:7,e:"ul",f:[{t:4,f:[{p:[4,7,72],t:7,e:"li",f:[{p:[4,11,76],t:7,e:"ui-button",a:{icon:"close",style:"danger",action:"clear",params:['{"zone": "',{t:2,r:".",p:[4,83,148]},'"}']},f:[{t:2,r:".",p:[4,92,157]}]}]}],n:52,r:"data.priority",p:[3,5,41]},{t:4,n:51,f:[{p:[6,7,201],t:7,e:"li",f:[{p:[6,11,205],t:7,e:"span",a:{"class":"good"},f:["No Priority Alerts"]}]}],r:"data.priority"}," ",{t:4,f:[{p:[9,7,303],t:7,e:"li",f:[{p:[9,11,307],t:7,e:"ui-button",a:{icon:"close",style:"caution",action:"clear",params:['{"zone": "',{t:2,r:".",p:[9,84,380]},'"}']},f:[{t:2,r:".",p:[9,93,389]}]}]}],n:52,r:"data.minor",p:[8,5,275]},{t:4,n:51,f:[{p:[11,7,433],t:7,e:"li",f:[{p:[11,11,437],t:7,e:"span",a:{"class":"good"},f:["No Minor Alerts"]}]}],r:"data.minor"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],230:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.tank","data.sensors.0.long_name"],s:"_0?_1:null"},p:[1,20,19]}]},f:[{t:4,f:[{p:[3,5,102],t:7,e:"ui-subdisplay",a:{title:[{t:2,x:{r:["data.tank","long_name"],s:"!_0?_1:null"},p:[3,27,124]}]},f:[{p:[4,7,167],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[5,3,200],t:7,e:"span",f:[{t:2,x:{r:["pressure"],s:"Math.fixed(_0,2)"},p:[5,9,206]}," kPa"]}]}," ",{t:4,f:[{p:[8,9,302],t:7,e:"ui-section",a:{label:"Temperature" -},f:[{p:[9,11,346],t:7,e:"span",f:[{t:2,x:{r:["temperature"],s:"Math.fixed(_0,2)"},p:[9,17,352]}," K"]}]}],n:50,r:"temperature",p:[7,7,273]}," ",{t:4,f:[{p:[13,9,462],t:7,e:"ui-section",a:{label:[{t:2,r:"id",p:[13,28,481]}]},f:[{p:[14,5,495],t:7,e:"span",f:[{t:2,x:{r:["."],s:"Math.fixed(_0,2)"},p:[14,11,501]},"%"]}]}],n:52,i:"id",r:"gases",p:[12,4,434]}]}],n:52,r:"adata.sensors",p:[2,3,73]}]}," ",{t:4,f:[{p:{button:[{p:[23,5,704],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[25,5,792],t:7,e:"ui-section",a:{label:"Input Injector"},f:[{p:[26,7,835],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputting"],s:'_0?"power-off":"close"'},p:[26,24,852]}],style:[{t:2,x:{r:["data.inputting"],s:'_0?"selected":null'},p:[26,75,903]}],action:"input"},f:[{t:2,x:{r:["data.inputting"],s:'_0?"Injecting":"Off"'},p:[27,9,968]}]}]}," ",{p:[29,5,1044],t:7,e:"ui-section",a:{label:"Input Rate"},f:[{p:[30,7,1083],t:7,e:"span",f:[{t:2,x:{r:["adata.inputRate"],s:"Math.fixed(_0)"},p:[30,13,1089]}," L/s"]}]}," ",{p:[32,5,1156],t:7,e:"ui-section",a:{label:"Output Regulator"},f:[{p:[33,7,1201],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputting"],s:'_0?"power-off":"close"'},p:[33,24,1218]}],style:[{t:2,x:{r:["data.outputting"],s:'_0?"selected":null'},p:[33,76,1270]}],action:"output"},f:[{t:2,x:{r:["data.outputting"],s:'_0?"Open":"Closed"'},p:[34,9,1337]}]}]}," ",{p:[36,5,1412],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[37,7,1456],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure"},f:[{t:2,x:{r:["adata.outputPressure"],s:"Math.round(_0)"},p:[37,50,1499]}," kPa"]}]}]}],n:50,r:"data.tank",p:[20,1,618]}]},e.exports=a.extend(r.exports)},{205:205}],231:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,518],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[9,11,524]}," kPa"]}]}," ",{p:[11,3,586],t:7,e:"ui-section",a:{label:"Filter"},f:[{t:4,f:[{p:[13,7,654],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[13,25,672]}],action:"filter",params:['{"mode": ',{t:2,r:"id",p:[14,42,748]},"}"]},f:[{t:2,r:"name",p:[14,51,757]}]}],n:52,r:"data.filter_types",p:[12,5,619]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],232:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,522],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,528]}," kPa"]}]}," ",{p:[11,3,594],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,627],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,666]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,783],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,817]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,935],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,968]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1087],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1125]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1243],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1249]},"%"]}]}," ",{p:[22,3,1319],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1352],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1391]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1508],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1542]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1660],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1693]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1812],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1850]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1968],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1974]},"%"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],233:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,381],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,411]}],action:"rate",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,525],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,531]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{p:[13,5,605],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,649],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,746],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,776]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,906],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,912]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{205:205}],234:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,100]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,145]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,181]}]}," ",{p:[4,5,233],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,285]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,330]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,410],t:7,e:"ui-section",f:[{p:[7,5,428],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,518],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,603],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,609]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,643]}]}," ",{p:[10,5,689],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,772],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,875],t:7,e:"ui-section",f:[{p:[14,7,895],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,999],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1105],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],235:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,167],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,200],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,250]}]}]}," ",{p:[11,3,298],t:7,e:"ui-section",a:{label:"Controls"},f:[{t:4,f:[{p:[13,3,356],t:7,e:"ui-notice",f:[{p:[14,4,372],t:7,e:"span",f:["Bluespace Artillery firing protocols must be globally unlocked from two keycard authentication devices first!"]}]}],n:50,x:{r:["data.unlocked"],s:"!_0"},p:[12,2,330]},{t:4,n:51,f:[{p:[17,3,525],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[17,36,558]}],action:"fire"},f:["FIRE!"]}],x:{r:["data.unlocked"],s:"!_0"}}]}],n:50,r:"data.connected",p:[7,3,141]}," ",{t:4,f:[{p:[22,3,694],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[23,7,734],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[21,3,667]}]}]},e.exports=a.extend(r.exports)},{205:205}],236:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,266],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,301],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,307]}," kPa"]}]}," ",{p:[11,3,373],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,404],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,417]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,462]}]}]}," ",{t:4,f:[{p:[15,3,573],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,608],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,625]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,680]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,722]}]}]}],n:50,r:"data.isPrototype",p:[14,3,544]}]}," ",{p:[22,1,839],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,869],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,912],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,925]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,959]}],value:[{t:2,r:"data.releasePressure",p:[25,14,1002]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1028]}," kPa"]}]}," ",{p:[27,3,1099],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1144],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1177]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1333],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{205:205}],237:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"CentCom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to CentCom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[85,51,2740]},'"}']},f:[{t:2,r:"cost",p:[85,61,2750]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{205:205}],238:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,174],t:7,e:"ui-notice",f:[{t:4,f:[{p:[14,5,220],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[15,7,263],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[15,24,280]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[15,75,331]}]}]}],n:50,r:"data.siliconUser",p:[13,3,189]},{t:4,n:51,f:[{p:[18,5,422],t:7,e:"span",f:["Swipe a QM-Level ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[18,39,456]}," this interface."]}],r:"data.siliconUser"}]}," ",{t:4,f:[{p:[23,3,568],t:7,e:"ui-display",a:{title:"Express Cargo Console"},f:[{p:[24,5,616],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[25,7,652],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[25,13,658]}]}]}," ",{p:[28,5,720],t:7,e:"ui-section",a:{label:"Notice"},f:[{p:[29,7,755],t:7,e:"span",f:[{t:2,r:"data.message",p:[29,13,761]}]}]}]}," ",{p:[32,3,824],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[32,18,839]}]},f:[{t:4,f:[{p:[34,7,886],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[34,18,897]}]},f:[{t:4,f:[{p:[36,11,944],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[36,30,963]}],candystripe:0,right:0},f:[{p:[37,13,1005],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[37,53,1045]},'"}']},f:[{t:2,r:"cost",p:[37,63,1055]}," Credits (Premium Pricing)"]}]}],n:52,r:"packs",p:[35,9,917]}]}],n:52,r:"data.supplies",p:[33,5,855]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[22,1,543]}]},e.exports=a.extend(r.exports)},{205:205}],239:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{205:205}],240:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:[6,1,206],t:7,e:"ui-display",a:{title:"Saved Recipes",button:0},f:[{p:[7,3,251],t:7,e:"ui-section",f:[{p:[8,5,269],t:7,e:"ui-button",a:{icon:"plus",action:"add_recipe"},f:["Add Recipe"]}," ",{p:[9,2,337],t:7,e:"ui-button",a:{icon:"minus",action:"clear_recipes"},f:["Clear Recipes"]}," ",{t:4,f:[{p:[11,7,445],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense_recipe",params:['{"recipe": "',{t:2,r:"contents",p:[11,80,518]},'"}']},f:[{t:2,r:"recipe_name",p:[11,96,534]}]}],n:52,r:"data.recipes",p:[10,5,415]}]}]}," ",{p:{button:[{t:4,f:[{p:[18,7,719],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[18,37,749]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[18,114,826]},"}"]},f:[{t:2,r:".",p:[18,122,834]}]}],n:52,r:"data.beakerTransferAmounts",p:[17,5,675]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[21,3,886],t:7,e:"ui-section",f:[{t:4,f:[{p:[23,7,936],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[23,74,1003]},'"}']},f:[{t:2,r:"title",p:[23,84,1013]}]}],n:52,r:"data.chemicals",p:[22,5,904]}]}]}," ",{p:{button:[{t:4,f:[{p:[30,7,1190],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[30,66,1249]},"}"]},f:[{t:2,r:".",p:[30,74,1257]}]}],n:52,r:"data.beakerTransferAmounts",p:[29,5,1146]}," ",{p:[32,5,1295],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[32,36,1326]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[34,3,1423],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[36,7,1493],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[36,13,1499]},"/",{t:2,r:"data.beakerMaxVolume",p:[36,55,1541]}," Units"]}," ",{p:[37,7,1586],t:7,e:"br"}," ",{t:4,f:[{p:[39,9,1639],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[39,52,1682]}," units of ",{t:2,r:"name",p:[39,87,1717]}]},{p:[39,102,1732],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[38,7,1599]},{t:4,n:51,f:[{p:[41,9,1763],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[35,5,1458]},{t:4,n:51,f:[{p:[44,7,1839],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],241:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,7,831],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,885],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,928]}," units of ",{t:2,r:"name",p:[21,87,963]}]},{p:[21,102,978],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,845]},{t:4,n:51,f:[{p:[23,9,1009],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[26,7,1085],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],242:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,340],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,426],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,445]}," units of ",{t:2,r:"name",p:[13,60,480]}],nowrap:0},f:[{p:[14,7,505],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,555],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,608]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,653],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,706]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,751],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,804]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,851],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,904]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,954],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1007]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1058],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1102]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,390]},{t:4,n:51,f:[{p:[24,5,1184],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,357]},{t:4,n:51,f:[{p:[27,5,1255],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1343],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1374],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1412]}]},f:["Destroy"]}," ",{p:[34,3,1470],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1508]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1577],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1629],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1648]}," units of ",{t:2,r:"name",p:[37,59,1683]}],nowrap:0},f:[{p:[38,6,1707],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1756],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1811]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1855],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1910]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1954],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2009]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2055],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2110]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2159],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2214]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2264],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2308]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1594]}]}]}," ",{t:4,f:[{p:[52,3,2444],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2534],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2568]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2617]}]}," ",{p:[55,5,2698],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2720]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2744]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2497]},{t:4,n:51,f:[{p:[57,5,2796],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2860],t:7,e:"br"}," ",{p:[61,4,2870],t:7,e:"br"}," ",{p:[62,4,2880],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2939]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3023],t:7,e:"br"}," ",{p:[64,4,3033],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3092]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3176],t:7,e:"br"}," ",{p:[66,4,3186],t:7,e:"br"}," ",{p:[67,4,3196],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"], -s:'_0?null:"disabled"'},p:[67,64,3256]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3341],t:7,e:"br"}," ",{p:[69,4,3351],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3411]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3497],t:7,e:"br"}," ",{p:[71,4,3507],t:7,e:"br"}," ",{p:[72,4,3517],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3578]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3664],t:7,e:"br"}," ",{p:[74,4,3674],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3735]}]},f:["Dispense Buffer to Bottles"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2421]},{t:4,n:51,f:[{p:[79,3,3857],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[80,4,3912],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,3971]}]},f:["Create Pack (max 10µ)"]}," ",{p:[81,4,4055],t:7,e:"br"}," ",{p:[82,4,4065],t:7,e:"br"}," ",{p:[83,4,4075],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[83,65,4136]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[87,2,4284],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[87,20,4302]}]},f:[{p:[88,3,4333],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[89,3,4381],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[89,46,4424]}]}," ",{p:[90,3,4467],t:7,e:"br"}," ",{p:[91,3,4476],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[92,3,4518],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[92,23,4538]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[92,69,4584]}]},f:[{t:2,r:"data.analyzeVars.color",p:[92,97,4612]}]}," ",{p:[93,3,4649],t:7,e:"br"}," ",{p:[94,3,4658],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[95,3,4700],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[95,25,4722]}]}," ",{p:[96,3,4759],t:7,e:"br"}," ",{p:[97,3,4768],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[98,3,4824],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[98,25,4846]},"µ/minute"]}," ",{p:[99,3,4894],t:7,e:"br"}," ",{p:[100,3,4903],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[101,3,4958],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[101,25,4980]}]}," ",{p:[102,3,5017],t:7,e:"br"}," ",{p:[103,3,5026],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[104,3,5082],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[104,25,5104]}]}," ",{p:[105,3,5142],t:7,e:"br"}," ",{p:[106,3,5151],t:7,e:"br"}," ",{p:[107,3,5160],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{205:205}],243:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}]}," ",{t:4,f:[{p:[5,3,149],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[6,3,165]}," ",{t:4,f:[{p:[8,4,231],t:7,e:"br"},{p:[8,8,235],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[8,63,290]},'"}']},f:[{t:3,r:"name",p:[8,75,302]}," - ",{t:3,r:"desc",p:[8,88,315]}]}],n:52,r:"data.recollection_categories",p:[7,3,188]}," ",{t:3,r:"data.rec_section",p:[10,3,354]}," ",{t:3,r:"data.rec_binds",p:[11,3,380]}]}],n:50,r:"data.recollection",p:[4,1,120]},{t:4,n:51,f:[{p:[14,2,431],t:7,e:"ui-display",a:{title:"Power",button:0},f:[{p:[15,4,469],t:7,e:"ui-section",f:[{t:3,r:"data.power",p:[16,6,488]}]}]}," ",{p:[19,2,541],t:7,e:"ui-display",f:[{p:[20,3,557],t:7,e:"ui-section",f:[{p:[21,4,574],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[21,22,592]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[22,4,715],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[22,22,733]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[23,4,857],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[23,22,875]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[24,4,1014],t:7,e:"br"},{t:3,r:"data.tier_info",p:[24,8,1018]}]}," ",{p:[26,3,1059],t:7,e:"ui-section",f:[{t:3,r:"data.scripturecolors",p:[27,4,1076]}]},{p:[28,16,1119],t:7,e:"hr"}," ",{p:[29,3,1127],t:7,e:"ui-section",f:[{t:4,f:[{p:[31,4,1172],t:7,e:"div",f:[{p:[31,9,1177],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[31,29,1197]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[31,99,1267]},'"}']},f:["Recite ",{t:3,r:"required",p:[31,118,1286]}]}," ",{t:4,f:[{t:4,f:[{p:[34,6,1362],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[34,53,1409]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[34,72,1428]}]}],n:50,r:"bound",p:[33,5,1342]},{t:4,n:51,f:[{p:[36,6,1472],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[36,53,1519]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[32,6,1319]}," ",{t:3,r:"name",p:[39,6,1586]}," ",{t:3,r:"descname",p:[39,17,1597]}," ",{t:3,r:"invokers",p:[39,32,1612]}]}],n:52,r:"data.scripture",p:[30,3,1143]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{205:205}],244:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve"},f:["ve"]}," ",{p:[26,3,1920],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[26,22,1939]}],action:"odr"},f:["odr"]}," ",{p:[27,3,2021],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[27,22,2040]}],action:"neit"},f:["neit"]}," ",{p:[28,3,2124],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[28,22,2143]}],action:"ci"},f:["ci"]}," ",{p:[29,3,2223],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[29,22,2242]}],action:"quon"},f:["quon"]}," ",{p:[30,3,2326],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[30,22,2345]}],action:"mya"},f:["mya"]}," ",{p:[31,3,2427],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[31,22,2446]}],action:"folth"},f:["folth"]}," ",{p:[32,3,2532],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[32,22,2551]}],action:"wren"},f:["wren"]}," ",{p:[33,3,2635],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[33,22,2654]}],action:"geyr"},f:["geyr"]}," ",{p:[34,3,2738],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[34,22,2757]}],action:"hil"},f:["hil"]}," ",{p:[35,3,2839],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[35,22,2858]}],action:"niet"},f:["niet"]}," ",{p:[36,3,2942],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[36,22,2961]}],action:"twou"},f:["twou"]}," ",{p:[37,3,3045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[37,22,3064]}],action:"phi"},f:["phi"]}," ",{p:[38,3,3146],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[38,22,3165]}],action:"coa"},f:["coa"]}]}," ",{p:[40,5,3268],t:7,e:"ui-section",a:{label:"suffix"},f:[{p:[41,3,3299],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[41,22,3318]}],action:" the Red"},f:["the Red"]}," ",{p:[42,3,3409],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[42,22,3428]}],action:" the Soulless"},f:["the Soulless"]}," ",{p:[43,3,3529],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[43,22,3548]}],action:" the Master"},f:["the Master"]}," ",{p:[44,3,3645],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[44,22,3664]}],action:", the Lord of all things"},f:["the Lord of all things"]}," ",{p:[45,3,3786],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[45,22,3805]}],action:", Jr."},f:["jr"]}]}," ",{p:[47,5,3909],t:7,e:"ui-section",a:{label:"submit"},f:[{p:[48,3,3941],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0>=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],245:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["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.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["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.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["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.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["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.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["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."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{205:205}],246:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],247:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}},computed:{sorted_sensors:function(){var t=this.get("data.sensors");return t.sort(function(t,e){return t.ijob-e.ijob})}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[33,1,1192],t:7,e:"ui-display",f:[{p:[34,2,1207],t:7,e:"ui-section",f:[{p:[35,3,1223],t:7,e:"table",a:{"class":"crew"},f:[{p:[36,3,1247],t:7,e:"thead",f:[{p:[37,3,1258],t:7,e:"tr",f:[{p:[38,4,1267],t:7,e:"th",f:["Name"]}," ",{p:[39,4,1285],t:7,e:"th",f:["Status"]}," ",{p:[40,4,1305],t:7,e:"th",f:["Vitals"]}," ",{p:[41,4,1325],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[43,5,1378],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[42,4,1347]}]}]}," ",{p:[47,3,1432],t:7,e:"tbody",f:[{t:4,f:[{p:[49,4,1472],t:7,e:"tr",f:[{p:[50,5,1482],t:7,e:"td",f:[{p:[51,6,1493],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[51,19,1506]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[51,49,1536]}]},f:[{t:2,r:"name",p:[52,7,1566]}," (",{t:2,r:"assignment",p:[52,17,1576]},") ",{p:[53,6,1598],t:7,e:"span",f:[]}]}]}," ",{p:[55,5,1621],t:7,e:"td",f:[{t:4,f:[{p:[57,7,1662],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[57,27,1682]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[56,6,1632]},{t:4,n:51,f:[{t:4,f:[{p:[60,8,1790],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[59,7,1762]},{t:4,n:51,f:[{p:[62,8,1852],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[66,5,1935],t:7,e:"td",f:[{t:4,f:[{p:[68,7,1976],t:7,e:"span",f:["( ",{p:[70,8,2e3],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[70,26,2018]}]}," / ",{p:[72,8,2054],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[72,28,2074]}]}," / ",{p:[74,8,2110],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[74,27,2129]}]}," / ",{p:[76,8,2166],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[76,28,2186]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[67,6,1946]},{t:4,n:51,f:[{t:4,f:[{p:[81,8,2280],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[80,7,2252]},{t:4,n:51,f:[{p:[83,8,2323],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[87,5,2386],t:7,e:"td",f:[{t:4,f:[{p:[89,6,2424],t:7,e:"span",f:[{t:2,r:"area",p:[89,12,2430]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[88,5,2396]},{t:4,n:51,f:[{p:[91,6,2466],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[95,6,2545],t:7,e:"td",f:[{p:[96,7,2557],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[96,48,2598]}],params:['{"name":"',{t:2,r:"name",p:[96,100,2650]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[94,5,2512]}]}],n:52,r:"sorted_sensors",p:[48,3,1443]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{205:205}],248:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],249:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"], -s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],250:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{205:205}],251:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],252:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{205:205}],253:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{205:205}],254:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{205:205}],255:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{205:205}],256:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{205:205}],257:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],258:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{205:205}],259:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{205:205}],260:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],261:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{205:205}],262:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{205:205}],263:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],264:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{205:205}],265:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{205:205}],266:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],267:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{205:205}],268:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["←"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{205:205}],269:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section", -a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{205:205}],270:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{205:205}],271:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["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."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{205:205}],272:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],273:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],274:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],275:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],276:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],277:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999], -t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],278:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],279:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],280:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],281:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],282:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],283:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],284:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],285:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],286:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{205:205}],287:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"], -s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],288:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[1,1,0]},{p:[6,1,88],t:7,e:"ui-display",f:[{p:[7,2,103],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[9,4,166],t:7,e:"ui-section",a:{label:"State"},f:[{p:[10,5,198],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[10,18,211]}]},f:[{t:2,r:"data.patient.stat",p:[10,46,239]}]}]}," ",{p:[12,4,290],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[13,5,327],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[13,27,349]}]}]}," ",{p:[15,4,406],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[16,5,439],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[16,18,452]}],max:[{t:2,r:"data.patient.maxHealth",p:[16,51,485]}],value:[{t:2,r:"data.patient.health",p:[16,86,520]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[17,12,557]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[17,63,608]}]}]}," ",{t:4,f:[{p:[20,5,840],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[20,24,859]}]},f:[{p:[21,6,877],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[21,27,898]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[21,62,933]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[21,98,969]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[19,4,676]}],n:50,r:"data.patient",p:[8,3,141]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[28,2,1113],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[31,5,1217],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[31,27,1239]}]},f:[{p:[32,6,1256],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[33,7,1294],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[33,29,1316]}]}," ",{t:4,f:[{p:[35,8,1373],t:7,e:"span",a:{"class":"content"},f:[{p:[35,30,1395],t:7,e:"b",f:["Required chemicals:"]},{p:[35,56,1421],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[35,61,1426]}]}],n:50,r:"chems_needed",p:[34,7,1344]}]}," ",{t:4,f:[{p:[39,7,1523],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[40,8,1569],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[40,30,1591]}]}," ",{t:4,f:[{p:[42,9,1661],t:7,e:"span",a:{"class":"content"},f:[{p:[42,31,1683],t:7,e:"b",f:["Required chemicals:"]},{p:[42,57,1709],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[42,62,1714]}]}],n:50,r:"alt_chems_needed",p:[41,8,1627]}]}],n:50,r:"alternative_step",p:[38,6,1491]}]}],n:52,r:"data.procedures",p:[30,4,1186]}],n:50,r:"data.procedures",p:[29,3,1158]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],289:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{p:[49,1,1195],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[50,2,1227],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[51,4,1261],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[54,4,1316],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[57,4,1370],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[59,4,1412],t:7,e:"section",a:{"class":"cell"},f:[{p:[60,5,1440],t:7,e:"ui-button",a:{"class":"center mineral",grid:0,action:"Release",params:'{"id" : "all"}'},f:["Release All"]}]}," ",{p:[64,4,1576],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[69,3,1673],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[70,4,1707],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[71,5,1735]}]}," ",{p:[73,4,1763],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[74,5,1805]}]}," ",{p:[76,4,1835],t:7,e:"section",a:{"class":"cell"},f:[{p:[77,5,1863],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[77,18,1876]}],placeholder:"###","class":"number"}}]}," ",{p:[79,4,1941],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[80,5,1983],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[80,59,2037]}],params:['{ "id" : ',{t:2,r:"id",p:[80,114,2092]},', "sheets" : ',{t:2,r:"sheets",p:[80,133,2111]}," }"]},f:["Release"]}]}," ",{p:[84,4,2178],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[85,5,2220]}]}]}],n:52,r:"data.materials",p:[68,2,1645]}," ",{t:4,f:[{p:[90,3,2298],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[91,4,2332],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[92,5,2360]}]}," ",{p:[94,4,2388],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[95,5,2430]}]}," ",{p:[97,4,2460],t:7,e:"section",a:{"class":"cell"},f:[{p:[98,5,2488],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[98,18,2501]}],placeholder:"###","class":"number"}}]}," ",{p:[100,4,2566],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[101,5,2608],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[101,57,2660]}],params:['{ "id" : ',{t:2,r:"id",p:[101,113,2716]},', "sheets" : ',{t:2,r:"sheets",p:[101,132,2735]}," }"]},f:["Smelt"]}]}," ",{p:[105,4,2799],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,5,2841],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"SmeltAll",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,60,2896]}],params:['{ "id" : ',{t:2,r:"id",p:[106,116,2952]}," }"]},f:["Smelt All"]}]}]}],n:52,r:"data.alloys",p:[89,2,2273]}]}]},e.exports=a.extend(r.exports)},{205:205}],290:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{205:205}],291:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(340);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{205:205,340:340}],292:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{205:205}],293:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(313)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,313:313}],294:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{205:205}],295:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673] -}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{205:205}],296:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(305),circuit:t(297),protolathe:t(303),destruct:t(299),diskopsdesign:t(300),diskopstech:t(301),designview:t(298),nodeview:t(302),techweb:t(306),rdheader:t(304)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306}],297:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{205:205}],298:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{205:205}],299:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy"}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{205:205}],300:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{205:205}],301:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{205:205}],302:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{205:205}],303:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{205:205}],304:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["NanoTrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],305:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{205:205}],306:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{205:205}],307:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],308:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," ",{t:4,f:[{p:[5,2,123],t:7,e:"dirsel"}],n:50,x:{r:["data.mode"],s:"_0>=0"},p:[4,1,98]},{t:4,f:[{p:[8,2,187],t:7,e:"colorsel"}],n:50,x:{r:["data.mode"],s:"_0==-2||_0==0"},p:[7,1,143]},{p:[10,1,209],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[11,2,242],t:7,e:"ui-section",f:[{p:[12,3,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0>=0?"check-square-o":"square-o"'},p:[12,20,275]}],state:[{t:2,x:{r:["data.mode"],s:'_0>=0?"selected":null'},p:[12,79,334]}],action:"mode",params:['{"mode": ',{t:2,r:"data.screen",p:[13,35,409]},"}"]},f:["Lay Pipes"]}]}," ",{p:[15,2,467],t:7,e:"ui-section",f:[{p:[16,3,483],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==-1?"check-square-o":"square-o"'},p:[16,20,500]}],state:[{t:2,x:{r:["data.mode"],s:'_0==-1?"selected":null'},p:[16,80,560]}],action:"mode",params:'{"mode": -1}'},f:["Eat Pipes"]}]}," ",{p:[19,2,681],t:7,e:"ui-section",f:[{p:[20,3,697],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==-2?"check-square-o":"square-o"'},p:[20,20,714]}],state:[{t:2,x:{r:["data.mode"],s:'_0==-2?"selected":null'},p:[20,80,774]}],action:"mode",params:'{"mode": -2}'},f:["Paint Pipes"]}]}]}," ",{p:[24,1,911],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[25,2,943],t:7,e:"ui-section",f:[{p:[26,3,959],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==0?"check-square-o":"square-o"'},p:[26,20,976]}],state:[{t:2,x:{r:["data.screen"],s:'_0==0?"selected":null'},p:[26,81,1037]}],action:"screen",params:'{"screen": 0}'},f:["Atmospherics"]}," ",{p:[28,3,1150],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==2?"check-square-o":"square-o"'},p:[28,20,1167]}],state:[{t:2,x:{r:["data.screen"],s:'_0==2?"selected":null'},p:[28,81,1228]}],action:"screen",params:'{"screen": 2}'},f:["Disposals"]}," ",{p:[30,3,1338],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==3?"check-square-o":"square-o"'},p:[30,20,1355]}],state:[{t:2,x:{r:["data.screen"],s:'_0==3?"selected":null'},p:[30,81,1416]}],action:"screen",params:'{"screen": 3}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[34,3,1573],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[35,4,1611],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[35,22,1629]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[37,4,1751],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[37,22,1769]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[39,4,1891],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[39,22,1909]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.screen"],s:"_0==0"},p:[33,2,1545]}]}," ",{t:4,f:[{p:[45,2,2098],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[45,21,2117]}]},f:[{t:4,f:[{p:[47,4,2157],t:7,e:"ui-section",f:[{p:[48,5,2175],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[48,23,2193]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[49,28,2274]},', "category": ',{t:2,r:"cat_name",p:[49,56,2302]},"}"]},f:[{t:2,r:"pipe_name",p:[49,71,2317]}]}]}],n:52,r:"recipes",p:[46,3,2135]}]}],n:52,r:"data.categories",p:[44,1,2070]}]},r.exports.components=r.exports.components||{};var i={colorsel:t(309),dirsel:t(310)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,309:309,310:310}],309:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{205:205}],310:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{205:205}],311:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{205:205}],312:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Recipient Contents"},f:[{p:[2,2,42],t:7,e:"ui-section",f:[{p:[3,3,58],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[3,34,89]}],action:"eject"},f:["Eject"]}," ",{p:[4,3,170],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[4,35,202]}],action:"input"},f:["Input"]}," ",{p:[5,3,283],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"disabled":null'},p:[5,33,313]}],action:"makecup"},f:["Create Cup"]}]}]}," ",{p:[8,1,430],t:7,e:"ui-display",a:{title:"Recipient"},f:[{p:[9,2,463],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[11,4,528],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[11,10,534]},"/",{t:2,r:"data.beakerMaxVolume",p:[11,52,576]}," Units"]}," ",{t:4,f:[{p:[13,5,654],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,48,697]}," units of ",{t:2,r:"name",p:[13,83,732]}]},{p:[13,98,747],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[12,4,618]},{t:4,n:51,f:[{p:[15,5,771],t:7,e:"span",a:{"class":"bad"},f:["Recipient Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[10,3,496]},{t:4,n:51,f:[{p:[18,4,842],t:7,e:"span",a:{"class":"average"},f:["No Recipient"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],313:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{ -t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],314:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(315),templates:t(317),status:t(316)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,315:315,316:316,317:317}],315:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{205:205}],316:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,27],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,46]}," (",{t:2,r:"id",p:[2,32,56]},")"]},f:[{t:2,r:"status",p:[3,5,71]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[5,8,109]},")"],n:50,r:"timer",p:[4,5,87]}," ",{p:[7,5,141],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[7,67,203]},'"}']},f:["Jump To"]}," ",{p:[10,5,252],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[10,53,300]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[10,70,317]}]},f:["Fast Travel"]}]}],n:52,r:"data.shuttles",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],317:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{205:205}],318:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{p:[18,5,985],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[19,9,1021],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[19,22,1034]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[19,68,1080]}]}]}," ",{p:[21,5,1163],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[22,9,1199],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[22,22,1212]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[22,68,1258]}]}]}," ",{p:[24,5,1342],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[26,11,1429],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[26,54,1472]}," units of ",{t:2,r:"name",p:[26,89,1507]}]},{p:[26,104,1522],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[25,9,1384]},{t:4,n:51,f:[{p:[28,11,1557],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[33,1,1653],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[34,2,1685],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[35,5,1716],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[35,22,1733]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[35,71,1782]}]}]}," ",{p:[37,3,1847],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[39,7,1908],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[39,38,1939]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[39,122,2023]},'"}']},f:[{t:2,r:"name",p:[39,132,2033]}]},{p:[39,152,2053],t:7,e:"br"}],n:52,r:"data.chems",p:[38,5,1880]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],319:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],320:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{205:205}],321:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]},"   [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],322:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{205:205}],323:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],324:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],325:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],326:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],327:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{205:205}],328:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],329:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"], -s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],330:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{205:205}],331:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],332:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{205:205}],333:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,333],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[17,4,373],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[18,5,404]}]}," ",{p:[20,4,450],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[21,5,483]}]}," ",{p:[23,4,531],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,5,564],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[24,26,585]}],value:[{t:2,r:"adata.vr_avatar.health",p:[24,64,623]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[24,99,658]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[24,140,699]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[24,179,738]}]}]}]}],n:50,r:"data.vr_avatar",p:[15,2,307]},{t:4,n:51,f:[{p:[28,3,826],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[32,2,922],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[33,3,958],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[33,20,975]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[34,4,1042]}," the VR Sleeper"]}," ",{t:4,f:[{p:[37,4,1144],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[36,3,1116]}," ",{t:4,f:[{p:[42,4,1267],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[41,3,1240]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],334:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{205:205}],335:[function(t,e,n){(function(e){"use strict";var n=t(205),a=e.interopRequireDefault(n);t(194),t(1),t(190),t(193);var r=t(336),i=e.interopRequireDefault(r),o=t(337),s=t(191),p=t(192),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(341)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(338),text:t(342),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,190:190,191:191,192:192,193:193,194:194,205:205,336:336,337:337,338:338,341:341,342:342,"babel/external-helpers":"babel/external-helpers"}],336:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(337),a=t(339);e.exports={components:{"ui-bar":t(206),"ui-button":t(207),"ui-display":t(208),"ui-input":t(209),"ui-linegraph":t(210),"ui-notice":t(211),"ui-section":t(213),"ui-subdisplay":t(214),"ui-tabs":t(215)},events:{enter:t(203).enter,space:t(203).space},transitions:{fade:t(204)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(219),airalarm:t(220),"airalarm/back":t(221),"airalarm/modes":t(222),"airalarm/scrubbers":t(223),"airalarm/status":t(224),"airalarm/thresholds":t(225),"airalarm/vents":t(226),airlock_electronics:t(227),apc:t(228),atmos_alert:t(229),atmos_control:t(230),atmos_filter:t(231),atmos_mixer:t(232),atmos_pump:t(233),brig_timer:t(234),bsa:t(235),canister:t(236),cargo:t(237),cargo_express:t(238),cellular_emporium:t(239),chem_dispenser:t(240),chem_heater:t(241),chem_master:t(242),clockwork_slab:t(243),codex_gigas:t(244),computer_fabricator:t(245),crayon:t(246),crew:t(247),cryo:t(248),disposal_unit:t(249),dna_vault:t(250),dogborg_sleeper:t(251),eightball:t(252),emergency_shuttle_console:t(253),engraved_message:t(254),error:t(255),"exofab - Copia":t(256),exonet_node:t(257),firealarm:t(258),gps:t(259),gulag_console:t(260),gulag_item_reclaimer:t(261),holodeck:t(262),implantchair:t(263),intellicard:t(264),keycard_auth:t(265),labor_claim_console:t(266),language_menu:t(267),launchpad_remote:t(268),mech_bay_power_console:t(269),mulebot:t(270),ntnet_relay:t(271),ntos_ai_restorer:t(272),ntos_card:t(273),ntos_configuration:t(274),ntos_file_manager:t(275),ntos_main:t(276),ntos_net_chat:t(277),ntos_net_dos:t(278),ntos_net_downloader:t(279),ntos_net_monitor:t(280),ntos_net_transfer:t(281),ntos_power_monitor:t(282),ntos_revelation:t(283),ntos_station_alert:t(284),ntos_supermatter_monitor:t(285),ntosheader:t(286),nuclear_bomb:t(287),operating_computer:t(288),ore_redemption_machine:t(289),pandemic:t(290),personal_crafting:t(291),portable_pump:t(292),portable_scrubber:t(293),power_monitor:t(294),radio:t(295),rdconsole:t(296),"rdconsole/circuit":t(297),"rdconsole/designview":t(298),"rdconsole/destruct":t(299),"rdconsole/diskopsdesign":t(300),"rdconsole/diskopstech":t(301),"rdconsole/nodeview":t(302),"rdconsole/protolathe":t(303),"rdconsole/rdheader":t(304),"rdconsole/settings":t(305),"rdconsole/techweb":t(306),reagentgrinder:t(307),rpd:t(308),"rpd/colorsel":t(309),"rpd/dirsel":t(310),sat_control:t(311),scp_294:t(312),scrubbing_types:t(313),shuttle_manipulator:t(314),"shuttle_manipulator/modification":t(315),"shuttle_manipulator/status":t(316),"shuttle_manipulator/templates":t(317),sleeper:t(318),slime_swap_body:t(319),smartvend:t(320),smes:t(321),smoke_machine:t(322),solar_control:t(323),space_heater:t(324),spawners_menu:t(325),station_alert:t(326),suit_storage_unit:t(327),tank_dispenser:t(328),tanks:t(329),thermomachine:t(330),turbine_computer:t(331),uplink:t(332),vr_sleeper:t(333),wires:t(334)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(218),titlebar:t(217),resize:t(212)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,263:263,264:264,265:265,266:266,267:267,268:268,269:269,270:270,271:271,272:272,273:273,274:274,275:275,276:276,277:277,278:278,279:279,280:280,281:281,282:282,283:283,284:284,285:285,286:286,287:287,288:288,289:289,290:290,291:291,292:292,293:293,294:294,295:295,296:296,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306,307:307,308:308,309:309,310:310,311:311,312:312,313:313,314:314,315:315,316:316,317:317,318:318,319:319,320:320,321:321,322:322,323:323,324:324,325:325,326:326,327:327,328:328,329:329,330:330,331:331,332:332,333:333,334:334,337:337,339:339}],337:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],338:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],339:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(337)},{337:337}],340:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],341:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],342:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{205:205}],237:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"CentCom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to CentCom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"desc",p:[85,31,2720]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[85,90,2779]},'"}']},f:[{t:2,r:"cost",p:[85,100,2789]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{205:205}],238:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.exports.template={v:3,t:[" ",{p:[12,1,174],t:7,e:"ui-notice",f:[{t:4,f:[{p:[14,5,220],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[15,7,263],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[15,24,280]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[15,75,331]}]}]}],n:50,r:"data.siliconUser",p:[13,3,189]},{t:4,n:51,f:[{p:[18,5,422],t:7,e:"span",f:["Swipe a QM-Level ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[18,39,456]}," this interface."]}],r:"data.siliconUser"}]}," ",{t:4,f:[{p:[23,3,568],t:7,e:"ui-display",a:{title:"Express Cargo Console"},f:[{p:[24,5,616],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[25,7,652],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[25,13,658]}]}]}," ",{p:[28,5,720],t:7,e:"ui-section",a:{label:"Notice"},f:[{p:[29,7,755],t:7,e:"span",f:[{t:2,r:"data.message",p:[29,13,761]}]}]}]}," ",{p:[32,3,824],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[32,18,839]}]},f:[{t:4,f:[{p:[34,7,886],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[34,18,897]}]},f:[{t:4,f:[{p:[36,11,944],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[36,30,963]}],candystripe:0,right:0},f:[{p:[37,13,1005],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"desc",p:[37,33,1025]}],"tooltip-side":"left",action:"add",params:['{"id": "',{t:2,r:"id",p:[37,92,1084]},'"}']},f:[{t:2,r:"cost",p:[37,102,1094]}," Credits"]}]}],n:52,r:"packs",p:[35,9,917]}]}],n:52,r:"data.supplies",p:[33,5,855]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[22,1,543]}]},e.exports=a.extend(r.exports)},{205:205}],239:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{205:205}],240:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:[6,1,206],t:7,e:"ui-display",a:{title:"Saved Recipes",button:0},f:[{p:[7,3,251],t:7,e:"ui-section",f:[{p:[8,5,269],t:7,e:"ui-button",a:{icon:"plus",action:"add_recipe"},f:["Add Recipe"]}," ",{p:[9,2,337],t:7,e:"ui-button",a:{icon:"minus",action:"clear_recipes"},f:["Clear Recipes"]}," ",{t:4,f:[{p:[11,7,445],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense_recipe",params:['{"recipe": "',{t:2,r:"contents",p:[11,80,518]},'"}']},f:[{t:2,r:"recipe_name",p:[11,96,534]}]}],n:52,r:"data.recipes",p:[10,5,415]}]}]}," ",{p:{button:[{t:4,f:[{p:[18,7,719],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[18,37,749]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[18,114,826]},"}"]},f:[{t:2,r:".",p:[18,122,834]}]}],n:52,r:"data.beakerTransferAmounts",p:[17,5,675]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[21,3,886],t:7,e:"ui-section",f:[{t:4,f:[{p:[23,7,936],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[23,74,1003]},'"}']},f:[{t:2,r:"title",p:[23,84,1013]}]}],n:52,r:"data.chemicals",p:[22,5,904]}]}]}," ",{p:{button:[{t:4,f:[{p:[30,7,1190],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[30,66,1249]},"}"]},f:[{t:2,r:".",p:[30,74,1257]}]}],n:52,r:"data.beakerTransferAmounts",p:[29,5,1146]}," ",{p:[32,5,1295],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[32,36,1326]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[34,3,1423],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[36,7,1493],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[36,13,1499]},"/",{t:2,r:"data.beakerMaxVolume",p:[36,55,1541]}," Units"]}," ",{p:[37,7,1586],t:7,e:"br"}," ",{t:4,f:[{p:[39,9,1639],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[39,52,1682]}," units of ",{t:2,r:"name",p:[39,87,1717]}]},{p:[39,102,1732],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[38,7,1599]},{t:4,n:51,f:[{p:[41,9,1763],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[35,5,1458]},{t:4,n:51,f:[{p:[44,7,1839],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],241:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,7,831],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,885],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,928]}," units of ",{t:2,r:"name",p:[21,87,963]}]},{p:[21,102,978],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,845]},{t:4,n:51,f:[{p:[23,9,1009],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[26,7,1085],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],242:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,340],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,426],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,445]}," units of ",{t:2,r:"name",p:[13,60,480]}],nowrap:0},f:[{p:[14,7,505],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,555],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,608]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,653],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,706]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,751],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,804]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,851],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,904]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,954],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1007]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1058],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1102]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,390]},{t:4,n:51,f:[{p:[24,5,1184],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,357]},{t:4,n:51,f:[{p:[27,5,1255],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1343],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1374],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1412]}]},f:["Destroy"]}," ",{p:[34,3,1470],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1508]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1577],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1629],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1648]}," units of ",{t:2,r:"name",p:[37,59,1683]}],nowrap:0},f:[{p:[38,6,1707],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1756],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1811]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1855],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1910]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1954],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2009]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2055],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2110]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2159],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2214]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2264],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2308]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1594]}]}]}," ",{t:4,f:[{p:[52,3,2444],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2534],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2568]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2617]}]}," ",{p:[55,5,2698],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2720]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2744]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2497]},{t:4,n:51,f:[{p:[57,5,2796],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2860],t:7,e:"br"}," ",{p:[61,4,2870],t:7,e:"br"}," ",{p:[62,4,2880],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2939]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3023],t:7,e:"br"}," ",{p:[64,4,3033],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3092]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3176],t:7,e:"br"}," ",{p:[66,4,3186],t:7, +e:"br"}," ",{p:[67,4,3196],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3256]}]},f:["Create Patch (max 40µ)"]}," ",{p:[68,4,3341],t:7,e:"br"}," ",{p:[69,4,3351],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3411]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3497],t:7,e:"br"}," ",{p:[71,4,3507],t:7,e:"br"}," ",{p:[72,4,3517],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3578]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3664],t:7,e:"br"}," ",{p:[74,4,3674],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3735]}]},f:["Dispense Buffer to Bottles"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2421]},{t:4,n:51,f:[{p:[79,3,3857],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[80,4,3912],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,3971]}]},f:["Create Pack (max 10µ)"]}," ",{p:[81,4,4055],t:7,e:"br"}," ",{p:[82,4,4065],t:7,e:"br"}," ",{p:[83,4,4075],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[83,65,4136]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[87,2,4284],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[87,20,4302]}]},f:[{p:[88,3,4333],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[89,3,4381],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[89,46,4424]}]}," ",{p:[90,3,4467],t:7,e:"br"}," ",{p:[91,3,4476],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[92,3,4518],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[92,23,4538]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[92,69,4584]}]},f:[{t:2,r:"data.analyzeVars.color",p:[92,97,4612]}]}," ",{p:[93,3,4649],t:7,e:"br"}," ",{p:[94,3,4658],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[95,3,4700],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[95,25,4722]}]}," ",{p:[96,3,4759],t:7,e:"br"}," ",{p:[97,3,4768],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[98,3,4824],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[98,25,4846]},"µ/minute"]}," ",{p:[99,3,4894],t:7,e:"br"}," ",{p:[100,3,4903],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[101,3,4958],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[101,25,4980]}]}," ",{p:[102,3,5017],t:7,e:"br"}," ",{p:[103,3,5026],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[104,3,5082],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[104,25,5104]}]}," ",{p:[105,3,5142],t:7,e:"br"}," ",{p:[106,3,5151],t:7,e:"br"}," ",{p:[107,3,5160],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{205:205}],243:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}]}," ",{t:4,f:[{p:[5,3,149],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[6,3,165]}," ",{t:4,f:[{p:[8,4,231],t:7,e:"br"},{p:[8,8,235],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[8,63,290]},'"}']},f:[{t:3,r:"name",p:[8,75,302]}," - ",{t:3,r:"desc",p:[8,88,315]}]}],n:52,r:"data.recollection_categories",p:[7,3,188]}," ",{t:3,r:"data.rec_section",p:[10,3,354]}," ",{t:3,r:"data.rec_binds",p:[11,3,380]}]}],n:50,r:"data.recollection",p:[4,1,120]},{t:4,n:51,f:[{p:[14,2,431],t:7,e:"ui-display",a:{title:"Power",button:0},f:[{p:[15,4,469],t:7,e:"ui-section",f:[{t:3,r:"data.power",p:[16,6,488]}]}]}," ",{p:[19,2,541],t:7,e:"ui-display",f:[{p:[20,3,557],t:7,e:"ui-section",f:[{p:[21,4,574],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[21,22,592]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[22,4,715],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[22,22,733]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[23,4,857],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[23,22,875]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[24,4,1014],t:7,e:"br"},{t:3,r:"data.tier_info",p:[24,8,1018]}]}," ",{p:[26,3,1059],t:7,e:"ui-section",f:[{t:3,r:"data.scripturecolors",p:[27,4,1076]}]},{p:[28,16,1119],t:7,e:"hr"}," ",{p:[29,3,1127],t:7,e:"ui-section",f:[{t:4,f:[{p:[31,4,1172],t:7,e:"div",f:[{p:[31,9,1177],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[31,29,1197]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[31,99,1267]},'"}']},f:["Recite ",{t:3,r:"required",p:[31,118,1286]}]}," ",{t:4,f:[{t:4,f:[{p:[34,6,1362],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[34,53,1409]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[34,72,1428]}]}],n:50,r:"bound",p:[33,5,1342]},{t:4,n:51,f:[{p:[36,6,1472],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[36,53,1519]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[32,6,1319]}," ",{t:3,r:"name",p:[39,6,1586]}," ",{t:3,r:"descname",p:[39,17,1597]}," ",{t:3,r:"invokers",p:[39,32,1612]}]}],n:52,r:"data.scripture",p:[30,3,1143]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{205:205}],244:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve"},f:["ve"]}," ",{p:[26,3,1920],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[26,22,1939]}],action:"odr"},f:["odr"]}," ",{p:[27,3,2021],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[27,22,2040]}],action:"neit"},f:["neit"]}," ",{p:[28,3,2124],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[28,22,2143]}],action:"ci"},f:["ci"]}," ",{p:[29,3,2223],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[29,22,2242]}],action:"quon"},f:["quon"]}," ",{p:[30,3,2326],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[30,22,2345]}],action:"mya"},f:["mya"]}," ",{p:[31,3,2427],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[31,22,2446]}],action:"folth"},f:["folth"]}," ",{p:[32,3,2532],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[32,22,2551]}],action:"wren"},f:["wren"]}," ",{p:[33,3,2635],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[33,22,2654]}],action:"geyr"},f:["geyr"]}," ",{p:[34,3,2738],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[34,22,2757]}],action:"hil"},f:["hil"]}," ",{p:[35,3,2839],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[35,22,2858]}],action:"niet"},f:["niet"]}," ",{p:[36,3,2942],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[36,22,2961]}],action:"twou"},f:["twou"]}," ",{p:[37,3,3045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[37,22,3064]}],action:"phi"},f:["phi"]}," ",{p:[38,3,3146],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[38,22,3165]}],action:"coa"},f:["coa"]}]}," ",{p:[40,5,3268],t:7,e:"ui-section",a:{label:"suffix"},f:[{p:[41,3,3299],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[41,22,3318]}],action:" the Red"},f:["the Red"]}," ",{p:[42,3,3409],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[42,22,3428]}],action:" the Soulless"},f:["the Soulless"]}," ",{p:[43,3,3529],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[43,22,3548]}],action:" the Master"},f:["the Master"]}," ",{p:[44,3,3645],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[44,22,3664]}],action:", the Lord of all things"},f:["the Lord of all things"]}," ",{p:[45,3,3786],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[45,22,3805]}],action:", Jr."},f:["jr"]}]}," ",{p:[47,5,3909],t:7,e:"ui-section",a:{label:"submit"},f:[{p:[48,3,3941],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0>=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],245:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["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.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["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.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["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.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["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.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["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."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{205:205}],246:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],247:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{isHead:function(t){return t%10==0},dept_class:function(t){return 0==t?"dept-cap":t>=10&&20>t?"dept-sec":t>=20&&30>t?"dept-med":t>=30&&40>t?"dept-sci":t>=40&&50>t?"dept-eng":t>=50&&60>t?"dept-cargo":t>=200&&230>t?"dept-cent":"dept-other"},health_state:function(t,e,n,a){var r=t+e+n+a;return 0>=r?"health-5":25>=r?"health-4":50>=r?"health-3":75>=r?"health-2":"health-0"}},computed:{sorted_sensors:function(){var t=this.get("data.sensors");return t.sort(function(t,e){return t.ijob-e.ijob})}}}}(r),r.exports.css=" .health {\r\n width: 16px;\r\n height: 16px;\r\n background-color: #FFF;\r\n border: 1px solid #434343;\r\n position: relative;\r\n top: 2px;\r\n display: inline-block;\r\n }\r\n .health-5 { background-color: #17d568; }\r\n .health-4 { background-color: #2ecc71; }\r\n .health-3 { background-color: #e67e22; }\r\n .health-2 { background-color: #ed5100; }\r\n .health-1 { background-color: #e74c3c; }\r\n .health-0 { background-color: #ed2814; }\r\n\r\n .dept-cap {color : #C06616;}\r\n .dept-sec {color : #E74C3C;}\r\n .dept-med {color : #3498DB;}\r\n .dept-sci {color : #9B59B6;}\r\n .dept-eng {color : #F1C40F;}\r\n .dept-cargo {color : #F39C12;}\r\n .dept-cent {color : #00C100;}\r\n .dept-other {color: #C38312;}\r\n\r\n .oxy { color : #3498db; }\r\n .toxin { color : #2ecc71; }\r\n .burn { color : #e67e22; }\r\n .brute { color : #e74c3c; }\r\n\r\n table.crew{\r\n border-collapse: collapse;\r\n }\r\n\r\n table.crew td {\r\n padding : 0px 10px;\r\n }",r.exports.template={v:3,t:[" ",{p:[33,1,1192],t:7,e:"ui-display",f:[{p:[34,2,1207],t:7,e:"ui-section",f:[{p:[35,3,1223],t:7,e:"table",a:{"class":"crew"},f:[{p:[36,3,1247],t:7,e:"thead",f:[{p:[37,3,1258],t:7,e:"tr",f:[{p:[38,4,1267],t:7,e:"th",f:["Name"]}," ",{p:[39,4,1285],t:7,e:"th",f:["Status"]}," ",{p:[40,4,1305],t:7,e:"th",f:["Vitals"]}," ",{p:[41,4,1325],t:7,e:"th",f:["Position"]}," ",{t:4,f:[{p:[43,5,1378],t:7,e:"th",f:["Tracking"]}],n:50,r:"data.link_allowed",p:[42,4,1347]}]}]}," ",{p:[47,3,1432],t:7,e:"tbody",f:[{t:4,f:[{p:[49,4,1472],t:7,e:"tr",f:[{p:[50,5,1482],t:7,e:"td",f:[{p:[51,6,1493],t:7,e:"span",a:{"class":[{t:2,x:{r:["isHead","ijob"],s:'_0(_1)?"bold ":""'},p:[51,19,1506]},{t:2,x:{r:["dept_class","ijob"],s:"_0(_1)"},p:[51,49,1536]}]},f:[{t:2,r:"name",p:[52,7,1566]}," (",{t:2,r:"assignment",p:[52,17,1576]},") ",{p:[53,6,1598],t:7,e:"span",f:[]}]}]}," ",{p:[55,5,1621],t:7,e:"td",f:[{t:4,f:[{p:[57,7,1662],t:7,e:"span",a:{"class":["health ",{t:2,x:{r:["health_state","oxydam","toxdam","burndam","brutedam"],s:"_0(_1,_2,_3,_4)"},p:[57,27,1682]}]}}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[56,6,1632]},{t:4,n:51,f:[{t:4,f:[{p:[60,8,1790],t:7,e:"span",a:{"class":"health health-5"}}],n:50,r:"life_status",p:[59,7,1762]},{t:4,n:51,f:[{p:[62,8,1852],t:7,e:"span",a:{"class":"health health-0"}}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[66,5,1935],t:7,e:"td",f:[{t:4,f:[{p:[68,7,1976],t:7,e:"span",f:["( ",{p:[70,8,2e3],t:7,e:"span",a:{"class":"oxy"},f:[{t:2,r:"oxydam",p:[70,26,2018]}]}," / ",{p:[72,8,2054],t:7,e:"span",a:{"class":"toxin"},f:[{t:2,r:"toxdam",p:[72,28,2074]}]}," / ",{p:[74,8,2110],t:7,e:"span",a:{"class":"burn"},f:[{t:2,r:"burndam",p:[74,27,2129]}]}," / ",{p:[76,8,2166],t:7,e:"span",a:{"class":"brute"},f:[{t:2,r:"brutedam",p:[76,28,2186]}]}," )"]}],n:50,x:{r:["oxydam"],s:"_0!=null"},p:[67,6,1946]},{t:4,n:51,f:[{t:4,f:[{p:[81,8,2280],t:7,e:"span",f:["Alive"]}],n:50,r:"life_status",p:[80,7,2252]},{t:4,n:51,f:[{p:[83,8,2323],t:7,e:"span",f:["Dead"]}],r:"life_status"}],x:{r:["oxydam"],s:"_0!=null"}}]}," ",{p:[87,5,2386],t:7,e:"td",f:[{t:4,f:[{p:[89,6,2424],t:7,e:"span",f:[{t:2,r:"area",p:[89,12,2430]}]}],n:50,x:{r:["pos_x"],s:"_0!=null"},p:[88,5,2396]},{t:4,n:51,f:[{p:[91,6,2466],t:7,e:"span",f:["N/A"]}],x:{r:["pos_x"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[95,6,2545],t:7,e:"td",f:[{p:[96,7,2557],t:7,e:"ui-button",a:{action:"select_person",state:[{t:2,x:{r:["can_track"],s:'_0?null:"disabled"'},p:[96,48,2598]}],params:['{"name":"',{t:2,r:"name",p:[96,100,2650]},'"}']},f:["Track"]}]}],n:50,r:"data.link_allowed",p:[94,5,2512]}]}],n:52,r:"sorted_sensors",p:[48,3,1443]}]}]}]}]}," "]},e.exports=a.extend(r.exports)},{205:205}],248:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,189],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,223],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,236]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,265]}]}]}," ",{p:[9,4,317],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[10,6,356],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.temperaturestatus",p:[10,19,369]}]},f:[{t:2,r:"data.occupant.bodyTemperature",p:[10,56,406]}," K"]}]}," ",{p:[12,5,472],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[13,7,507],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[13,20,520]}],max:[{t:2,r:"data.occupant.maxHealth",p:[13,54,554]}],value:[{t:2,r:"data.occupant.health",p:[13,90,590]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[14,16,632]}]},f:[{t:2,r:"data.occupant.health",p:[14,68,684]}]}]}," ",{t:4,f:[{p:[17,7,908],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[17,26,927]}]},f:[{p:[18,9,948],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[18,30,969]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,66,1005]}],state:"bad"},f:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[18,103,1042]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[16,5,742]}],n:50,r:"data.hasOccupant",p:[5,3,159]}]}," ",{p:[23,1,1138],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[24,3,1167],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[25,5,1199],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[25,22,1216]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[26,14,1276]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[27,14,1332]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[28,22,1391]}]}]}," ",{p:[30,3,1459],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,3,1495],t:7,e:"span",a:{"class":[{t:2,r:"data.temperaturestatus",p:[31,16,1508]}]},f:[{t:2,r:"data.cellTemperature",p:[31,44,1536]}," K"]}]}," ",{p:[33,2,1588],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[34,5,1619],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[34,22,1636]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[34,73,1687]}]}," ",{p:[35,5,1740],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[35,22,1757]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[35,86,1821]}]}]}]}," ",{p:{button:[{p:[40,5,1967],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[40,36,1998]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[42,3,2101],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[45,9,2211],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,r:"volume",p:[45,52,2254]}," units of ",{t:2,r:"name",p:[45,72,2274]}]},{p:[45,87,2289],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[44,7,2171]},{t:4,n:51,f:[{p:[47,9,2320],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[43,5,2136]},{t:4,n:51,f:[{p:[50,7,2396],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],249:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null' +},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],250:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{205:205}],251:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,183],t:7,e:"ui-section",a:{label:"Items in storage"},f:[{p:[7,4,225],t:7,e:"span",f:[{t:2,r:"data.items",p:[7,10,231]}]}]}],n:50,r:"data.items",p:[5,3,159]}," ",{t:4,f:[{p:[11,5,310],t:7,e:"ui-section",a:{label:"State"},f:[{p:[12,7,344],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[12,20,357]}]},f:[{t:2,r:"data.occupant.stat",p:[12,49,386]}]}]}," ",{p:[14,5,439],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[15,7,474],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[15,20,487]}],max:[{t:2,r:"data.occupant.maxHealth",p:[15,54,521]}],value:[{t:2,r:"data.occupant.health",p:[15,90,557]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[16,16,599]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[16,68,651]}]}]}," ",{t:4,f:[{p:[19,7,888],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[19,26,907]}]},f:[{p:[20,9,928],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[20,30,949]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[20,66,985]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[20,103,1022]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[18,5,722]}," ",{p:[23,5,1109],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[24,9,1145],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[24,22,1158]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[24,68,1204]}]}]}," ",{p:[26,5,1287],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[27,9,1323],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[27,22,1336]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[27,68,1382]}]}]}," ",{p:[29,5,1466],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[31,11,1553],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[31,54,1596]}," units of ",{t:2,r:"name",p:[31,89,1631]}]},{p:[31,104,1646],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[30,9,1508]},{t:4,n:51,f:[{p:[33,11,1681],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[10,3,283]}]}," ",{p:[38,1,1777],t:7,e:"ui-display",a:{title:"Operations"},f:[{p:[39,3,1812],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[41,7,1872],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied"],s:'_0?null:"disabled"'},p:[41,38,1903]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[41,111,1976]},'"}']},f:[{t:2,r:"name",p:[41,121,1986]}]},{p:[41,141,2006],t:7,e:"br"}],n:52,r:"data.chem",p:[40,5,1845]}]}," ",{p:[44,2,2046],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[45,6,2079],t:7,e:"ui-button",a:{icon:"sign-out",action:"eject"},f:["Eject Contents"]}]}," ",{p:[47,2,2166],t:7,e:"ui-section",a:{label:"Self Cleaning"},f:[{p:[48,3,2204],t:7,e:"ui-button",a:{icon:"recycle",action:"cleaning"},f:["Self-Clean Cycle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],252:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{205:205}],253:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=a.extend(r.exports)},{205:205}],254:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{205:205}],255:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=a.extend(r.exports)},{205:205}],256:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,20],t:7,e:"ui-notice",f:["Currently syncing with the database"]}],n:50,r:"data.sync",p:[1,1,0]},{t:4,n:51,f:[{p:{button:[{p:[8,4,163],t:7,e:"ui-button",a:{icon:"eject",action:"eject_all"},f:["Eject all"]}," ",{p:[9,4,232],t:7,e:"ui-button",a:{icon:["toggle-",{t:2,x:{r:["data.show_materials"],s:'_0?"off":"on"'},p:[9,28,256]}],action:"toggle_materials_visibility"},f:[{t:2,x:{r:["data.show_materials"],s:'_0?"Hide":"Show"'},p:[10,5,339]}]}]},t:7,e:"ui-display",a:{title:"Materials",button:0},f:[" ",{t:4,f:[{p:[14,4,449],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[15,5,484],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[16,6,520],t:7,e:"section",a:{"class":"cell"}}," ",{p:[17,6,559],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[20,6,620],t:7,e:"section",a:{"class":"cell"},f:["Amount"]}," ",{p:[23,6,680],t:7,e:"section",a:{"class":"cell"}}," ",{p:[24,6,719],t:7,e:"section",a:{"class":"cell"}}]}," ",{t:4,f:[{p:[27,6,808],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[28,7,845],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[29,8,876]}]}," ",{p:[31,7,910],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"amount",p:[32,8,941]}]}," ",{p:[34,7,977],t:7,e:"section",a:{"class":"cell"},f:[{p:[35,8,1008],t:7,e:"ui-button",a:{icon:"eject"},f:["Release amount"]}]}," ",{p:[37,7,1084],t:7,e:"section",a:{"class":"cell",style:"width: 40px;"},f:[{p:[38,8,1136],t:7,e:"ui-button",a:{icon:"eject"},f:["Release all"]}]}]}],n:52,r:"data.all_materials",p:[26,5,773]}]}],n:50,r:"data.show_materials",p:[13,3,417]}]}," ",{p:[45,2,1274],t:7,e:"ui-display",a:{title:"Categories"},f:[{t:4,f:[{p:[47,4,1334],t:7,e:"ui-button",f:[{t:2,r:".",p:[47,15,1345]}]}],r:"data.categories",p:[46,3,1309]}]}],r:"data.sync"}]},e.exports=a.extend(r.exports)},{205:205}],257:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,5,49],t:7,e:"ui-button",a:{action:"toggle_power",style:[{t:2,x:{r:["data.toggle"],s:'_0?"selected":null'},p:[5,18,111]}]},f:["Turn ",{t:2,x:{r:["data.toggle"],s:'_0?"off":"on"'},p:[6,16,166]}]}]}," ",{p:[9,3,235],t:7,e:"ui-display",a:{title:"Logging"},f:[{t:4,f:[{p:[11,3,292],t:7,e:"ui-section",a:{label:">"},f:[{t:2,r:".",p:[11,25,314]},{p:[11,30,319],t:7,e:"ui-section",f:[]}]}],n:52,r:"data.logs",p:[10,5,269]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],258:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=a.extend(r.exports)},{205:205}],259:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{205:205}],260:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],261:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{205:205}],262:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{205:205}],263:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],264:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{205:205}],265:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{205:205}],266:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],267:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{205:205}],268:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["←"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{205:205}],269:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"; +}}}}(r),r.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=a.extend(r.exports)},{205:205}],270:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=a.extend(r.exports)},{205:205}],271:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["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."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{205:205}],272:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],273:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';"},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],274:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],275:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],276:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],277:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7, +e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],278:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],279:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],280:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],281:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],282:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}]}]}," ",{p:[55,5,1528],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1563],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1569]}]}]}],r:"config.fancy"}]}," ",{p:[60,1,1638],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1668],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1693],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1730],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1769],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1806],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1845],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1887],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1928],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2013],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2032]}],nowrap:0},f:[{p:[72,7,2057],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2078]}," %"]}," ",{p:[73,7,2136],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[73,28,2157]}]}," ",{p:[74,7,2199],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2220],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2233]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2262]}]}]}," ",{p:[75,7,2309],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2330],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2343]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2366]}," [",{p:[75,87,2389],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2395]}]},"]"]}]}," ",{p:[76,7,2444],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2465],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2478]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2501]}," [",{p:[76,87,2524],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2530]}]},"]"]}]}," ",{p:[77,7,2579],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2600],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2613]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2636]}," [",{p:[77,87,2659],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2665]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1987]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],283:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],284:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],285:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(286)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,286:286}],286:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{205:205}],287:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"' +},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],288:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,25],t:7,e:"ui-notice",f:["No table detected!"]}],n:51,r:"data.table",p:[1,1,0]},{p:[6,1,88],t:7,e:"ui-display",f:[{p:[7,2,103],t:7,e:"ui-display",a:{title:"Patient State"},f:[{t:4,f:[{p:[9,4,166],t:7,e:"ui-section",a:{label:"State"},f:[{p:[10,5,198],t:7,e:"span",a:{"class":[{t:2,r:"data.patient.statstate",p:[10,18,211]}]},f:[{t:2,r:"data.patient.stat",p:[10,46,239]}]}]}," ",{p:[12,4,290],t:7,e:"ui-section",a:{label:"Blood Type"},f:[{p:[13,5,327],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.patient.blood_type",p:[13,27,349]}]}]}," ",{p:[15,4,406],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[16,5,439],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.patient.minHealth",p:[16,18,452]}],max:[{t:2,r:"data.patient.maxHealth",p:[16,51,485]}],value:[{t:2,r:"data.patient.health",p:[16,86,520]}],state:[{t:2,x:{r:["data.patient.health"],s:'_0>=0?"good":"average"'},p:[17,12,557]}]},f:[{t:2,x:{r:["adata.patient.health"],s:"Math.round(_0)"},p:[17,63,608]}]}]}," ",{t:4,f:[{p:[20,5,840],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[20,24,859]}]},f:[{p:[21,6,877],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.patient.maxHealth",p:[21,27,898]}],value:[{t:2,rx:{r:"data.patient",m:[{t:30,n:"type"}]},p:[21,62,933]}],state:"bad"},f:[{t:2,x:{r:["type","adata.patient"],s:"Math.round(_1[_0])"},p:[21,98,969]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Burn",type:"fireLoss"},{label:"Toxin",type:"toxLoss"},{label:"Respiratory",type:"oxyLoss"}]'},p:[19,4,676]}],n:50,r:"data.patient",p:[8,3,141]},{t:4,n:51,f:["No patient detected."],r:"data.patient"}]}," ",{p:[28,2,1113],t:7,e:"ui-display",a:{title:"Initiated Procedures"},f:[{t:4,f:[{t:4,f:[{p:[31,5,1217],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[31,27,1239]}]},f:[{p:[32,6,1256],t:7,e:"ui-section",a:{label:"Next Step"},f:[{p:[33,7,1294],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"next_step",p:[33,29,1316]}]}," ",{t:4,f:[{p:[35,8,1373],t:7,e:"span",a:{"class":"content"},f:[{p:[35,30,1395],t:7,e:"b",f:["Required chemicals:"]},{p:[35,56,1421],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[35,61,1426]}]}],n:50,r:"chems_needed",p:[34,7,1344]}]}," ",{t:4,f:[{p:[39,7,1523],t:7,e:"ui-section",a:{label:"Alternative Step"},f:[{p:[40,8,1569],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"alternative_step",p:[40,30,1591]}]}," ",{t:4,f:[{p:[42,9,1661],t:7,e:"span",a:{"class":"content"},f:[{p:[42,31,1683],t:7,e:"b",f:["Required chemicals:"]},{p:[42,57,1709],t:7,e:"br"}," ",{t:2,r:"chems_needed",p:[42,62,1714]}]}],n:50,r:"alt_chems_needed",p:[41,8,1627]}]}],n:50,r:"alternative_step",p:[38,6,1491]}]}],n:52,r:"data.procedures",p:[30,4,1186]}],n:50,r:"data.procedures",p:[29,3,1158]},{t:4,n:51,f:["No active procedures."],r:"data.procedures"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],289:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{p:[49,1,1195],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[50,2,1227],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[51,4,1261],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[54,4,1316],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[57,4,1370],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[59,4,1412],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[61,4,1454],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[66,3,1551],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[67,4,1585],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[68,5,1613]}]}," ",{p:[70,4,1641],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[71,5,1683]}]}," ",{p:[73,4,1713],t:7,e:"section",a:{"class":"cell"},f:[{p:[74,5,1741],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[74,18,1754]}],placeholder:"###","class":"number"}}]}," ",{p:[76,4,1819],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[77,5,1861],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[77,59,1915]}],params:['{ "id" : ',{t:2,r:"id",p:[77,114,1970]},', "sheets" : ',{t:2,r:"sheets",p:[77,133,1989]}," }"]},f:["Release"]}]}," ",{p:[81,4,2056],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[82,5,2098]}]}]}],n:52,r:"data.materials",p:[65,2,1523]}," ",{t:4,f:[{p:[87,3,2176],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[88,4,2210],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[89,5,2238]}]}," ",{p:[91,4,2266],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[92,5,2308]}]}," ",{p:[94,4,2338],t:7,e:"section",a:{"class":"cell"},f:[{p:[95,5,2366],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[95,18,2379]}],placeholder:"###","class":"number"}}]}," ",{p:[97,4,2444],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[98,5,2486],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[98,57,2538]}],params:['{ "id" : ',{t:2,r:"id",p:[98,113,2594]},', "sheets" : ',{t:2,r:"sheets",p:[98,132,2613]}," }"]},f:["Smelt"]}]}," ",{p:[102,4,2677],t:7,e:"section",a:{"class":"cell",align:"right"},f:[]}]}],n:52,r:"data.alloys",p:[86,2,2151]}]}]},e.exports=a.extend(r.exports)},{205:205}],290:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,4,87],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[4,36,119]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[7,4,231],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[7,35,262]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[10,4,358],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[10,35,389]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[15,4,528],t:7,e:"ui-section",f:[{t:4,f:[{p:[17,6,578],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[16,5,546]},{t:4,n:51,f:[{p:[19,6,644],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[21,8,712],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[21,38,742]}]}," ",{p:[22,8,782],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[22,39,813]}]}],n:50,r:"data.has_blood",p:[20,7,681]},{t:4,n:51,f:[{p:[24,8,870],t:7,e:"ui-section",f:[{p:[25,9,892],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[14,3,500]},{t:4,n:51,f:[{p:[32,4,1054],t:7,e:"ui-section",f:[{p:[33,5,1072],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[38,3,1188],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[43,8,1343],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[43,64,1399]}],params:['{"index": ',{t:2,r:"index",p:[43,116,1451]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[42,7,1320]}," ",{p:[47,7,1538],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[47,69,1600]}],params:['{"index": ',{t:2,r:"index",p:[47,124,1655]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,24,1269]}],button:0},f:[" ",{p:[51,6,1749],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[51,40,1783]}]}," ",{p:[52,6,1812],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[52,38,1844]}]}," ",{p:[53,6,1879],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[53,33,1906]}]}," ",{p:[54,6,1936],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[54,40,1970]}]}," ",{t:4,f:[{p:[56,7,2021],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[58,9,2087],t:7,e:"ui-button",a:{action:"symptom_details",state:"",params:['{"picked_symptom": ',{t:2,r:"sym_index",p:[58,81,2159]},', "index": ',{t:2,r:"index",p:[58,105,2183]},"}"]},f:[{t:2,r:"name",p:[59,10,2206]}," "]},{p:[60,21,2236],t:7,e:"br"}],n:52,r:"symptoms",p:[57,8,2059]}]}," ",{p:[63,7,2289],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[63,38,2320]}]}," ",{p:[64,7,2355],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[64,35,2383]}]}," ",{p:[65,7,2415],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[65,39,2447]}]}," ",{p:[66,7,2483],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[66,44,2520]}]}],n:50,r:"is_adv",p:[55,6,1999]}]}],n:52,r:"data.viruses",p:[39,4,1222]},{t:4,n:51,f:[{p:[70,5,2601],t:7,e:"ui-section",f:[{p:[71,6,2620],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[75,3,2743],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[77,5,2811],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[77,24,2830]}]},f:[{p:[78,7,2848],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[78,43,2884]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[78,129,2970]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[76,4,2779]},{t:4,n:51,f:[{p:[83,5,3067],t:7,e:"ui-section",f:[{p:[84,6,3086],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[37,2,1162]}],n:50,x:{r:["data.mode"],s:"_0==1"},p:[1,1,0]},{t:4,n:51,f:[{p:[90,2,3231],t:7,e:"ui-button",a:{icon:"undo",state:"",action:"back"},f:["Back"]}," ",{t:4,f:[{p:[94,4,3330],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[94,23,3349]}]},f:[{p:[95,4,3364],t:7,e:"ui-section",f:[{t:2,r:"desc",p:[96,5,3382]}," ",{t:4,f:[{p:[98,5,3417],t:7,e:"br"}," ",{p:[99,5,3428],t:7,e:"b",f:["This symptom has been neutered, and has no effect. It will still affect the virus' statistics."]}],n:50,r:"neutered",p:[97,4,3395]}]}," ",{p:[102,4,3564],t:7,e:"ui-section",f:[{p:[103,5,3582],t:7,e:"ui-section",a:{label:"Level"},f:[{t:2,r:"level",p:[103,31,3608]}]}," ",{p:[104,5,3636],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[104,36,3667]}]}," ",{p:[105,5,3700],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[105,33,3728]}]}," ",{p:[106,5,3758],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[106,37,3790]}]}," ",{p:[107,5,3824],t:7,e:"ui-section",a:{label:"Transmittability"},f:[{t:2,r:"transmission",p:[107,42,3861]}]}]}," ",{p:[109,4,3913],t:7,e:"ui-subdisplay",a:{title:"Effect Thresholds"},f:[{p:[110,5,3960],t:7,e:"ui-section",f:[{t:3,r:"threshold_desc",p:[110,17,3972]}]}]}]}],n:53,r:"data.symptom",p:[93,2,3303]}],x:{r:["data.mode"],s:"_0==1"}}]},e.exports=a.extend(r.exports)},{205:205}],291:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(340);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{205:205,340:340}],292:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=a.extend(r.exports)},{205:205}],293:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[3,1,69],t:7,e:"ui-notice",f:[{p:[4,3,84],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[4,23,104]}," connected to a tank."]}]}," ",{p:[6,1,182],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[7,3,220],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[8,5,255],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[8,11,261]}," kPa"]}]}," ",{p:[10,3,323],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[11,5,354],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[11,18,367]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[11,59,408]}]}]}]}," ",{p:[14,1,499],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[15,3,530],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[16,5,562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[16,22,579]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[17,14,630]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[18,22,687]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[24,7,856],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[24,38,887]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[23,5,828]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[28,3,1007],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[29,4,1038]}]}," ",{p:[31,3,1080],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[32,4,1114]}," kPa"]}],n:50,r:"data.holding",p:[27,3,983]},{t:4,n:51,f:[{p:[35,3,1188],t:7,e:"ui-section",f:[{p:[36,4,1205],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}," ",{p:[40,1,1293],t:7,e:"ui-display",a:{title:"Filters"},f:[{t:4,f:[{p:[42,5,1345],t:7,e:"filters"}],n:53,r:"data",p:[41,3,1325]}]}]},r.exports.components=r.exports.components||{};var i={filters:t(313)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,313:313}],294:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(r),r.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}]}]}," ",{p:[52,5,1464],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1499],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1505]}]}]}],r:"config.fancy"}]}," ",{p:[57,1,1574],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1604],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1629],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1666],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1705],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1742],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1781],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1823],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1864],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1949],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1968]}],nowrap:0},f:[{p:[69,7,1993],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2014]}," %"]}," ",{p:[70,7,2072],t:7,e:"div",a:{"class":"content"},f:[{t:2,rx:{r:"adata.areas",m:[{t:30,n:"@index"},"load"]},p:[70,28,2093]}]}," ",{p:[71,7,2135],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2156],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2169]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2198]}]}]}," ",{p:[72,7,2245],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2266],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2279]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2302]}," [",{p:[72,87,2325],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2331]}]},"]"]}]}," ",{p:[73,7,2380],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2401],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2414]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2437]}," [",{p:[73,87,2460],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2466]}]},"]"]}]}," ",{p:[74,7,2515],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2536],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2549]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2572]}," [",{p:[74,87,2595],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2601]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1923]}]}]},e.exports=a.extend(r.exports)},{205:205}],295:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7, +e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=a.extend(r.exports)},{205:205}],296:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," "," "," "," "," "," "," "," ",{p:[11,1,560],t:7,e:"rdheader"}," ",{t:4,f:[{p:[13,2,595],t:7,e:"ui-display",a:{title:"CONSOLE LOCKED"},f:[{p:[14,3,634],t:7,e:"ui-button",a:{action:"Unlock"},f:["Unlock"]}]}],n:50,r:"data.locked",p:[12,1,573]},{t:4,f:[{p:[18,2,729],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[18,17,744]}]},f:[{p:[19,3,763],t:7,e:"tab",a:{name:"Technology"},f:[{p:[20,4,791],t:7,e:"techweb"}]}," ",{p:[22,3,815],t:7,e:"tab",a:{name:"View Node"},f:[{p:[23,4,842],t:7,e:"nodeview"}]}," ",{p:[25,3,867],t:7,e:"tab",a:{name:"View Design"},f:[{p:[26,4,896],t:7,e:"designview"}]}," ",{p:[28,3,923],t:7,e:"tab",a:{name:"Disk Operations - Design"},f:[{p:[29,4,965],t:7,e:"diskopsdesign"}]}," ",{p:[31,3,995],t:7,e:"tab",a:{name:"Disk Operations - Technology"},f:[{p:[32,4,1041],t:7,e:"diskopstech"}]}," ",{p:[34,3,1069],t:7,e:"tab",a:{name:"Deconstructive Analyzer"},f:[{p:[35,4,1110],t:7,e:"destruct"}]}," ",{p:[37,3,1135],t:7,e:"tab",a:{name:"Protolathe"},f:[{p:[38,4,1163],t:7,e:"protolathe"}]}," ",{p:[40,3,1190],t:7,e:"tab",a:{name:"Circuit Imprinter"},f:[{p:[41,4,1225],t:7,e:"circuit"}]}," ",{p:[43,3,1249],t:7,e:"tab",a:{name:"Settings"},f:[{p:[44,4,1275],t:7,e:"settings"}]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[17,1,706]}]},r.exports.components=r.exports.components||{};var i={settings:t(305),circuit:t(297),protolathe:t(303),destruct:t(299),diskopsdesign:t(300),diskopstech:t(301),designview:t(298),nodeview:t(302),techweb:t(306),rdheader:t(304)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306}],297:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,58],t:7,e:"ui-display",a:{title:"Circuit Imprinter Busy!"}}],n:50,r:"data.circuitbusy",p:[2,2,30]},{t:4,n:51,f:[{p:[5,3,130],t:7,e:"ui-display",f:[{p:[6,4,147],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,189],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,202]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,261],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "circuit", "inputText" : ',{t:2,r:"textsearch",p:[8,84,340]},"}"]},f:["Search"]}]}," ",{p:[10,4,398],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.circuitmats",p:[10,27,421]}," / ",{t:2,r:"data.circuitmaxmats",p:[10,50,444]}]}," ",{p:[11,4,485],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.circuitchems",p:[11,26,507]}," / ",{t:2,r:"data.circuitmaxchems",p:[11,50,531]}]}," ",{p:[12,3,572],t:7,e:"ui-display",f:[{p:[14,3,590],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,605]}]},f:[{p:[15,4,631],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,696],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.circuitcat"],s:'_0=="{{name}}"?"selected":null'},p:[17,43,733]}],params:['{"type" : "circuit", "cat" : "',{t:2,r:"name",p:[17,135,825]},'"}']},f:[{t:2,r:"name",p:[17,147,837]}]}],n:52,r:"data.circuitcats",p:[16,5,663]}]}," ",{p:[20,4,888],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,956],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,968]},{t:2,r:"matstring",p:[22,26,976]}," ",{p:[23,7,997],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[23,40,1030]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[23,119,1109]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitdes",p:[21,5,924]}]}," ",{p:[27,4,1187],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[29,6,1254],t:7,e:"ui-section",f:[{t:2,r:"name",p:[29,18,1266]},{t:2,r:"matstring",p:[29,26,1274]}," ",{p:[30,7,1295],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[30,40,1328]}],params:['{"latheType" : "circuit", "id" : "',{t:2,r:"id",p:[30,119,1407]},'"}']},f:["Print"]}]}],n:52,r:"data.circuitmatch",p:[28,5,1220]}]}," ",{p:[34,4,1485],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[36,6,1550],t:7,e:"ui-section",f:[{t:2,r:"name",p:[36,18,1562]}," : ",{t:2,r:"amount",p:[36,29,1573]}," cm3 - ",{t:4,f:[{p:[38,7,1623],t:7,e:"input",a:{value:[{t:2,r:"number",p:[38,20,1636]}],placeholder:["1-",{t:2,r:"sheets",p:[38,46,1662]}],"class":"number"}}," ",{p:[39,7,1698],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "circuit", "mat_id" : ',{t:2,r:"mat_id",p:[39,84,1775]},', "sheets" : ',{t:2,r:"number",p:[39,107,1798]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[37,6,1597]}]}],n:52,r:"data.circuitmat_list",p:[35,5,1513]}]}," ",{p:[44,4,1895],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[46,6,1961],t:7,e:"ui-section",f:[{t:2,r:"name",p:[46,18,1973]}," : ",{t:2,r:"amount",p:[46,29,1984]}," - ",{p:[47,7,2005],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "circuit", "name" : ',{t:2,r:"name",p:[47,80,2078]},', "id" : ',{t:2,r:"reagentid",p:[47,97,2095]},"}"]},f:["Purge"]}]}],n:52,r:"data.circuitchem_list",p:[45,5,1923]}]}]}]}]}],r:"data.circuitbusy"}],n:50,r:"data.circuit_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[55,2,2216],t:7,e:"ui-display",a:{title:"No Linked Circuit Imprinter"}}],r:"data.circuit_linked"}]},e.exports=a.extend(r.exports)},{205:205}],298:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,31],t:7,e:"ui-display",a:{title:[{t:2,r:"data.sdesign_name",p:[2,21,50]}]},f:[{p:[3,3,77],t:7,e:"ui-section",a:{title:"Description"},f:[{t:2,r:"data.sdesign_desc",p:[3,35,109]}]}]}," ",{p:[5,2,162],t:7,e:"ui-display",a:{title:"Lathe Types"},f:[{t:4,f:[{p:[7,4,239],t:7,e:"ui-section",a:{title:"Circuit Imprinter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&1"},p:[6,3,198]}," ",{t:4,f:[{p:[10,4,346],t:7,e:"ui-section",a:{title:"Protolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&2"},p:[9,3,305]}," ",{t:4,f:[{p:[13,4,446],t:7,e:"ui-section",a:{title:"Autolathe"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&4"},p:[12,3,405]}," ",{t:4,f:[{p:[16,4,545],t:7,e:"ui-section",a:{title:"Crafting Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&8"},p:[15,3,504]}," ",{t:4,f:[{p:[19,4,655],t:7,e:"ui-section",a:{title:"Exosuit Fabricator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&16"},p:[18,3,613]}," ",{t:4,f:[{p:[22,4,764],t:7,e:"ui-section",a:{title:"Biogenerator"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&32"},p:[21,3,722]}," ",{t:4,f:[{p:[25,4,867],t:7,e:"ui-section",a:{title:"Limb Grower"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&64"},p:[24,3,825]}," ",{t:4,f:[{p:[28,4,970],t:7,e:"ui-section",a:{title:"Ore Smelter"}}],n:50,x:{r:["data.sdesign_buildtype"],s:"_0&128"},p:[27,3,927]}]}," ",{p:[31,2,1045],t:7,e:"ui-display",a:{title:"Materials"},f:[{t:4,f:[{p:[33,4,1116],t:7,e:"ui-section",a:{title:[{t:2,r:"matname",p:[33,23,1135]}]},f:[{t:2,r:"matamt",p:[33,36,1148]}," cm^3"]}],n:52,r:"data.sdesign_materials",p:[32,3,1079]}]}],n:50,r:"data.design_selected",p:[1,1,0]},{t:4,f:[{p:[38,2,1248],t:7,e:"ui-display",a:{title:"No Design Selected."}}],n:50,x:{r:["data.design_selected"],s:"!_0"},p:[37,1,1216]}]},e.exports=a.extend(r.exports)},{205:205}],299:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[4,3,60],t:7,e:"ui-display",a:{title:"Destructive Analyzer Busy!"}}],n:50,r:"data.destroybusy",p:[3,2,32]},{t:4,n:51,f:[{t:4,f:[{p:[7,4,168],t:7,e:"ui-display",a:{title:"Destructive Analyzer Unloaded"}}],n:50,x:{r:["data.destroy_loaded"],s:"!_0"},p:[6,3,135]},{t:4,n:51,f:[{p:[9,4,248],t:7,e:"ui-display",a:{title:"Loaded Item"},f:[{p:[10,4,285],t:7,e:"ui-section",a:{title:"Name"},f:[{t:2,r:"data.destroy_name",p:[10,29,310]}]}]}," ",{p:[12,4,367],t:7,e:"ui-display",a:{title:"Boost Nodes"},f:[{t:4,f:[{p:[14,6,438],t:7,e:"ui-section",a:{title:[{t:2,r:"name",p:[14,25,457]}," | ",{t:2,r:"value",p:[14,36,468]}]},f:[{p:[15,7,487],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["allow"],s:'_0?null:"disabled"'},p:[15,25,505]}],action:"deconstruct",params:['{"id":',{t:2,r:"id",p:[15,90,570]},"}"]},f:["Deconstruct and Boost"]}]}],n:52,r:"data.boost_paths",p:[13,5,405]}]}," ",{p:[19,4,670],t:7,e:"ui-button",a:{action:"eject_da"},f:["Eject Item"]}],x:{r:["data.destroy_loaded"],s:"!_0"}}],r:"data.destroybusy"}],n:50,r:"data.destroy_linked",p:[2,1,2]},{t:4,n:51,f:[{p:[23,2,755],t:7,e:"ui-display",a:{title:"No Linked Destructive Analyzer"}}],r:"data.destroy_linked"}]},e.exports=a.extend(r.exports)},{205:205}],300:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Design Disk Loaded"}}],n:50,x:{r:["data.ddisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,121],t:7,e:"ui-display",a:{title:"Design Disk Updating"}}],n:50,r:"data.ddisk_update",p:[5,2,92]},{t:4,n:51,f:[{t:4,f:[{p:[9,4,221],t:7,e:"ui-display",a:{title:"Design Disk"},f:[{p:[10,5,259],t:7,e:"ui-section",a:{title:"Disk Space"},f:["Disk Capacity: ",{t:2,r:"data.ddisk_size",p:[10,51,305]}," blueprints."]}," ",{p:[11,5,355],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[11,33,383],t:7,e:"ui-button",a:{action:"ddisk_upall"},f:["Upload all designs"]}]}," ",{p:[12,5,464],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[12,36,495],t:7,e:"ui-button",a:{action:"clear_designdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[13,5,591],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[13,36,622],t:7,e:"ui-button",a:{action:"eject_designdisk"},f:["Eject Disk"]}]}]}," ",{p:[15,4,717],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[17,6,792],t:7,e:"ui-section",a:{title:"Number"},f:["#",{t:2,r:"pos",p:[17,34,820]},": ",{t:4,f:[{p:[19,8,866],t:7,e:"ui-button",a:{action:"upload_empty_ddisk_slot",params:['{"slot": "',{t:2,r:"pos",p:[19,70,928]},'"}']},f:["Upload to Empty Slot"]}],n:50,x:{r:["id"],s:'_0=="null"'},p:[18,7,837]},{t:4,n:51,f:[{p:[21,8,996],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[21,58,1046]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[21,75,1063]}]},f:[{t:2,r:"name",p:[21,122,1110]}]}," ",{p:[22,8,1139],t:7,e:"ui-button",a:{action:"ddisk_erasepos",style:"danger",params:['{"id": "',{t:2,r:"id",p:[22,74,1205]},'"}'],state:[{t:2,x:{r:["id"],s:'_0=="null"?"disabled":null'},p:[22,91,1222]}]},f:["Delete Slot"]}],x:{r:["id"],s:'_0=="null"'}}]}],n:52,r:"data.ddisk_designs",p:[16,5,757]}]}],n:50,x:{r:["data.ddisk_upload"],s:"!_0"},p:[8,3,190]},{t:4,n:51,f:[{p:[28,4,1367],t:7,e:"ui-display",a:{title:"Upload Design to Disk"},f:[{p:[28,46,1409],t:7,e:"ui-section",f:["Available Designs:"]}]}," ",{t:4,f:[{p:[30,5,1513],t:7,e:"ui-section",f:[{p:[30,17,1525],t:7,e:"ui-button",a:{action:"ddisk_uploaddesign",params:['{"id": "',{t:2,r:"id",p:[30,72,1580]},'"}']},f:[{t:2,r:"name",p:[30,82,1590]}]}]}],n:52,r:"data.ddisk_possible_designs",p:[29,4,1470]}],x:{r:["data.ddisk_upload"],s:"!_0"}}],r:"data.ddisk_update"}],x:{r:["data.ddisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{205:205}],301:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[3,2,24],t:7,e:"ui-display",a:{title:"No Technology Disk Loaded"}}],n:50,x:{r:["data.tdisk"],s:"!_0"},p:[2,1,2]},{t:4,n:51,f:[{t:4,f:[{p:[6,3,125],t:7,e:"ui-display",a:{title:"Technology Disk Updating"}}],n:50,r:"data.tdisk_update",p:[5,2,96]},{t:4,n:51,f:[{p:[8,3,198],t:7,e:"ui-display",a:{title:"Technology Disk"},f:[{p:[9,4,239],t:7,e:"ui-section",a:{title:"Disk IO"},f:[{p:[9,32,267],t:7,e:"ui-button",a:{action:"tdisk_down"},f:["Download Research to Disk"]},{p:[9,100,335],t:7,e:"ui-button",a:{action:"tdisk_up"},f:["Upload Research from Disk"]}," ",{p:[10,4,406],t:7,e:"ui-section",a:{title:"Clear Disk"},f:[{p:[10,35,437],t:7,e:"ui-button",a:{action:"clear_techdisk",style:"danger"},f:["WIPE ALL DATA"]}]}," ",{p:[11,4,530],t:7,e:"ui-section",a:{title:"Eject Disk"},f:[{p:[11,35,561],t:7,e:"ui-button",a:{action:"eject_techdisk"},f:["Eject Disk"]}]}]}]}," ",{p:[13,3,652],t:7,e:"ui-display",a:{title:"Disk Contents"},f:[{t:4,f:[{p:[15,5,723],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,53,771]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,70,788]}]},f:[{t:2,r:"display_name",p:[15,115,833]}]}],n:52,r:"data.tdisk_nodes",p:[14,4,691]}]}],r:"data.tdisk_update"}],x:{r:["data.tdisk"],s:"!_0"}}]},e.exports=a.extend(r.exports)},{205:205}],302:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,2,29],t:7,e:"ui-display",a:{title:[{t:2,r:"data.snode_name",p:[2,21,48]}]},f:[{p:[3,3,73],t:7,e:"ui-section",a:{title:"Description"},f:["Description: ",{t:2,r:"data.snode_desc",p:[3,48,118]}]}," ",{p:[4,3,154],t:7,e:"ui-section",a:{title:"Point Cost"},f:["Point Cost: ",{t:2,r:"data.snode_cost",p:[4,46,197]}]}," ",{p:[5,3,233],t:7,e:"ui-section",a:{title:"Export Price"},f:["Export Price: ",{t:2,r:"data.snode_export",p:[5,50,280]}]}," ",{p:[6,3,318],t:7,e:"ui-button",a:{action:"research_node",params:['{"id"="',{t:2,r:"id",p:[6,52,367]},'"}'],state:[{t:2,x:{r:["data.snode_researched"],s:'_0?"disabled":null'},p:[6,69,384]}]},f:[{t:2,x:{r:["data.snode_researched"],s:'_0?"Researched":"Research Node"'},p:[6,115,430]}]}]}," ",{p:[8,2,518],t:7,e:"ui-display",a:{title:"Prerequisites"},f:[{t:4,f:[{p:[10,4,588],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[10,52,636]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[10,69,653]}]},f:[{t:2,r:"display_name",p:[10,114,698]}]}],n:52,r:"data.node_prereqs",p:[9,3,556]}]}," ",{p:[13,2,759],t:7,e:"ui-display",a:{title:"Unlocks"},f:[{t:4,f:[{p:[15,4,823],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[15,52,871]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[15,69,888]}]},f:[{t:2,r:"display_name",p:[15,114,933]}]}],n:52,r:"data.node_unlocks",p:[14,3,791]}]}," ",{p:[18,2,994],t:7,e:"ui-display",a:{title:"Designs"},f:[{t:4,f:[{p:[20,4,1058],t:7,e:"ui-button",a:{action:"select_design",params:['{"id": "',{t:2,r:"id",p:[20,54,1108]},'"}'],state:[{t:2,x:{r:["data.sdesign_id","id"],s:'_0==_1?"selected":null'},p:[20,71,1125]}]},f:[{t:2,r:"name",p:[20,118,1172]}]}],n:52,r:"data.node_designs",p:[19,3,1026]}]}],n:50,r:"data.node_selected",p:[1,1,0]},{t:4,f:[{p:[25,2,1263],t:7,e:"ui-display",a:{title:"No Node Selected."}}],n:50,x:{r:["data.node_selected"],s:"!_0"},p:[24,1,1233]}]},e.exports=a.extend(r.exports)},{205:205}],303:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:4,f:[{p:[3,3,59],t:7,e:"ui-display",a:{title:"Protolathe Busy!"}}],n:50,r:"data.protobusy",p:[2,2,33]},{t:4,n:51,f:[{p:[5,3,124],t:7,e:"ui-display",f:[{p:[6,4,141],t:7,e:"ui-section",f:["Search Available Designs: ",{p:[7,4,183],t:7,e:"input",a:{value:[{t:2,r:"textsearch",p:[7,17,196]}],placeholder:"Type Here","class":"text"}}," ",{p:[8,5,255],t:7,e:"ui-button",a:{action:"textSearch",params:['{"latheType" : "proto", "inputText" : ',{t:2,r:"textsearch",p:[8,82,332]},"}"]},f:["Search"]}]}," ",{p:[10,4,390],t:7,e:"ui-section",f:["Materials: ",{t:2,r:"data.protomats",p:[10,27,413]}," / ",{t:2,r:"data.protomaxmats",p:[10,48,434]}]}," ",{p:[11,4,473],t:7,e:"ui-section",f:["Reagents: ",{t:2,r:"data.protochems",p:[11,26,495]}," / ",{t:2,r:"data.protomaxchems",p:[11,48,517]}]}," ",{p:[12,3,556],t:7,e:"ui-display",f:[{p:[14,3,574],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.lathe_tabs",p:[14,18,589]}]},f:[{p:[15,4,615],t:7,e:"tab",a:{name:"Category List"},f:[{t:4,f:[{p:[17,6,678],t:7,e:"ui-button",a:{action:"switchcat",state:[{t:2,x:{r:["data.protocat","name"],s:'_0==_1?"selected":null'},p:[17,43,715]}],params:['{"type" : "proto", "cat" : "',{t:2,r:"name",p:[17,125,797]},'"}']},f:[{t:2,r:"name",p:[17,137,809]}]}],n:52,r:"data.protocats",p:[16,5,647]}]}," ",{p:[20,4,860],t:7,e:"tab",a:{name:"Selected Category"},f:[{t:4,f:[{p:[22,6,926],t:7,e:"ui-section",f:[{t:2,r:"name",p:[22,18,938]},{t:2,r:"matstring",p:[22,26,946]}," ",{t:4,f:[{p:[24,8,996],t:7,e:"input",a:{value:[{t:2,r:"number",p:[24,21,1009]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[24,47,1035]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[23,7,967]}," ",{p:[26,7,1108],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[26,40,1141]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[26,117,1218]},'", "amount" : "',{t:2,r:"number",p:[26,138,1239]},'"}']},f:["Print"]}]}],n:52,r:"data.protodes",p:[21,5,896]}]}," ",{p:[30,4,1321],t:7,e:"tab",a:{name:"Search Results"},f:[{t:4,f:[{p:[32,6,1386],t:7,e:"ui-section",f:[{t:2,r:"name",p:[32,18,1398]},{t:2,r:"matstring",p:[32,26,1406]}," ",{t:4,f:[{p:[34,8,1456],t:7,e:"input",a:{value:[{t:2,r:"number",p:[34,21,1469]}],placeholder:["1-",{t:2,x:{r:["canprint"],s:"_0>10?10:_0"},p:[34,47,1495]}],"class":"number"}}],n:50,x:{r:["canprint"],s:"_0>1"},p:[33,7,1427]}," ",{p:[36,7,1568],t:7,e:"ui-button",a:{action:"print",state:[{t:2,x:{r:["canprint"],s:'_0>1?null:"disabled"'},p:[36,40,1601]}],params:['{"latheType" : "proto", "id" : "',{t:2,r:"id",p:[36,117,1678]},'", "amount" : "',{t:2,r:"number",p:[36,138,1699]},'"}']},f:["Print"]}]}],n:52,r:"data.protomatch",p:[31,5,1354]}]}," ",{p:[40,4,1781],t:7,e:"tab",a:{name:"Materials"},f:[{t:4,f:[{p:[42,6,1844],t:7,e:"ui-section",f:[{t:2,r:"name",p:[42,18,1856]}," : ",{t:2,r:"amount",p:[42,29,1867]}," cm3 - ",{t:4,f:[{p:[44,7,1917],t:7,e:"input",a:{value:[{t:2,r:"number",p:[44,20,1930]}],placeholder:["1-",{t:2,r:"sheets",p:[44,46,1956]}],"class":"number"}}," ",{p:[45,7,1992],t:7,e:"ui-button",a:{action:"releasemats",params:['{"latheType" : "proto", "mat_id" : ',{t:2,r:"mat_id",p:[45,82,2067]},', "sheets" : ',{t:2,r:"number",p:[45,105,2090]},"}"]},f:["Release"]}],n:50,x:{r:["sheets"],s:"_0>0"},p:[43,6,1891]}]}],n:52,r:"data.protomat_list",p:[41,5,1809]}]}," ",{p:[50,4,2187],t:7,e:"tab",a:{name:"Chemicals"},f:[{t:4,f:[{p:[52,6,2251],t:7,e:"ui-section",f:[{t:2,r:"name",p:[52,18,2263]}," : ",{t:2,r:"amount",p:[52,29,2274]}," - ",{p:[53,7,2295],t:7,e:"ui-button",a:{action:"purgechem",params:['{"latheType" : "proto", "name" : ',{t:2,r:"name",p:[53,78,2366]},', "id" : ',{t:2,r:"reagentid",p:[53,95,2383]},"}"]},f:["Purge"]}]}],n:52,r:"data.protochem_list",p:[51,5,2215]}]}]}]}]}],r:"data.protobusy"}],n:50,r:"data.protolathe_linked",p:[1,1,0]},{t:4,n:51,f:[{p:[61,2,2504],t:7,e:"ui-display",a:{title:"No Linked Protolathe"}}],r:"data.protolathe_linked"}]},e.exports=a.extend(r.exports)},{205:205}],304:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,1,14],t:7,e:"span",a:{"class":"memoedit"},f:["NanoTrasen R&D Console"]},{p:[2,53,66],t:7,e:"br"}," Available Points: ",{p:[3,19,91],t:7,e:"ui-section",a:{title:"Research Points"},f:[{t:2,r:"data.research_points_stored",p:[3,55,127]}]}," ",{p:[4,1,173],t:7,e:"ui-section",a:{title:["Page Selection - ",{t:2,r:"page",p:[4,37,209]}]},f:[{p:[4,47,219],t:7,e:"input",a:{value:[{t:2,r:"pageselect",p:[4,60,232]}],placeholder:"1","class":"number"}}," Select Page: ",{p:[5,14,294],t:7,e:"ui-button",a:{action:"page",params:['{"num" : "',{t:2,r:"pageselect",p:[5,57,337]},'"}']},f:["[Go]"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],305:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"span",a:{"class":"bad"},f:["Settings"]},{p:[1,34,33],t:7,e:"br"},{p:[1,39,38],t:7,e:"br"}," ",{p:[2,1,45],t:7,e:"ui-button",a:{action:"Resync"},f:["RESYNC MACHINERY"]},{p:[2,56,100],t:7,e:"br"}," ",{p:[3,1,107],t:7,e:"ui-button",a:{action:"Lock"},f:["LOCK"]}," ",{p:[4,1,150],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "destroy"}',state:[{t:2,x:{r:["data.destroy_linked"],s:'_0?null:"disabled"'},p:[4,71,220]}]},f:["Disconnect Destructive Analyzer"]}," ",{p:[5,1,309],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "lathe"}',state:[{t:2,x:{r:["data.protolathe_linked"],s:'_0?null:"disabled"'},p:[5,69,377]}]},f:["Disconnect Protolathe"]}," ",{p:[6,1,459],t:7,e:"ui-button",a:{action:"disconnect",params:'{"type" : "imprinter"}',state:[{t:2,x:{r:["data.circuit_linked"],s:'_0?null:"disabled"'},p:[6,73,531]}]},f:["Disconnect Circuit Imprinter"]}]},e.exports=a.extend(r.exports)},{205:205}],306:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Available for Research"},f:[{t:4,f:[{p:[3,3,78],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[3,51,126]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[3,68,143]}]},f:[{t:2,r:"display_name",p:[3,113,188]}]}],n:52,r:"data.techweb_avail",p:[2,2,46]}]}," ",{p:[6,1,245],t:7,e:"ui-display",a:{title:"Locked Nodes"},f:[{t:4,f:[{p:[8,3,314],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[8,51,362]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[8,68,379]}]},f:[{t:2,r:"display_name",p:[8,113,424]}]}],n:52,r:"data.techweb_locked",p:[7,2,281]}]}," ",{p:[11,1,482],t:7,e:"ui-display",a:{title:"Researched Nodes"},f:[{t:4,f:[{p:[13,3,559],t:7,e:"ui-button",a:{action:"select_node",params:['{"id": "',{t:2,r:"id",p:[13,51,607]},'"}'],state:[{t:2,x:{r:["data.snode_id","id"],s:'_0==_1?"selected":null'},p:[13,68,624]}]},f:[{t:2,r:"display_name",p:[13,113,669]}]}],n:52,r:"data.techweb_researched",p:[12,2,522]}]}]},e.exports=a.extend(r.exports)},{205:205}],307:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,1,25],t:7,e:"ui-notice",f:[{p:[3,3,40],t:7,e:"span",f:["The grinder is currently processing and cannot be used."]}]}],n:50,r:"data.processing",p:[1,1,0]},{p:{button:[{p:[8,5,208],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[8,36,239]}],action:"eject"},f:["Eject Contents"]}]},t:7,e:"ui-display",a:{title:"Processing Chamber",button:0},f:[" ",{p:[10,3,364],t:7,e:"ui-section",a:{label:"Grinding"},f:[{p:[11,5,399],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.operating"],s:'_0?"average":"good"'},p:[11,18,412]}]},f:[{t:2,x:{r:["data.operating"],s:'_0?"Busy":"Ready"'},p:[11,59,453]}]}," ",{p:[12,2,500],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.operating","data.contents"],s:'(_0==0)&&_1?null:"disabled"'},p:[12,35,533]}],action:"grind"},f:["Activate"]}]}," ",{p:[14,3,653],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[17,9,755],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:["The ",{t:2,r:"name",p:[17,56,802]}]},{p:[17,71,817],t:7,e:"br"}],n:52,r:"adata.contentslist",p:[16,7,717]},{t:4,n:51,f:[{p:[19,9,848],t:7,e:"span",f:["No Contents"]}],r:"adata.contentslist"}],n:50,r:"data.contents",p:[15,5,688]},{t:4,n:51,f:[{p:[22,7,911],t:7,e:"span",f:["No Contents"]}],r:"data.contents"}]}]}," ",{p:{button:[{p:[28,5,1047],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.operating","data.isBeakerLoaded"],s:'(_0==0)&&_1?null:"disabled"'},p:[28,36,1078]}],action:"detach"},f:["Detach"]}]},t:7,e:"ui-display",a:{title:"Container",button:0},f:[" ",{p:[30,3,1202],t:7,e:"ui-section",a:{label:"Reagents"},f:[{t:4,f:[{p:[32,7,1272],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[32,13,1278]},"/",{t:2,r:"data.beakerMaxVolume",p:[32,55,1320]}," Units"]}," ",{p:[33,7,1365],t:7,e:"br"}," ",{t:4,f:[{p:[35,9,1418],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[35,52,1461]}," units of ",{t:2,r:"name",p:[35,87,1496]}]},{p:[35,102,1511],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[34,7,1378]},{t:4,n:51,f:[{p:[37,9,1542],t:7,e:"span",a:{"class":"bad"},f:["Container Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[31,5,1237]},{t:4,n:51,f:[{p:[40,7,1621],t:7,e:"span",a:{"class":"average"},f:["No Container"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],308:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," ",{t:4,f:[{p:[5,2,123],t:7,e:"dirsel"}],n:50,x:{r:["data.mode"],s:"_0>=0"},p:[4,1,98]},{t:4,f:[{p:[8,2,187],t:7,e:"colorsel"}],n:50,x:{r:["data.mode"],s:"_0==-2||_0==0"},p:[7,1,143]},{p:[10,1,209],t:7,e:"ui-display",a:{title:"Utilities"},f:[{p:[11,2,242],t:7,e:"ui-section",f:[{p:[12,3,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0>=0?"check-square-o":"square-o"'},p:[12,20,275]}],state:[{t:2,x:{r:["data.mode"],s:'_0>=0?"selected":null'},p:[12,79,334]}],action:"mode",params:['{"mode": ',{t:2,r:"data.screen",p:[13,35,409]},"}"]},f:["Lay Pipes"]}]}," ",{p:[15,2,467],t:7,e:"ui-section",f:[{p:[16,3,483],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==-1?"check-square-o":"square-o"'},p:[16,20,500]}],state:[{t:2,x:{r:["data.mode"],s:'_0==-1?"selected":null'},p:[16,80,560]}],action:"mode",params:'{"mode": -1}'},f:["Eat Pipes"]}]}," ",{p:[19,2,681],t:7,e:"ui-section",f:[{p:[20,3,697],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==-2?"check-square-o":"square-o"'},p:[20,20,714]}],state:[{t:2,x:{r:["data.mode"],s:'_0==-2?"selected":null'},p:[20,80,774]}],action:"mode",params:'{"mode": -2}'},f:["Paint Pipes"]}]}]}," ",{p:[24,1,911],t:7,e:"ui-display",a:{title:"Category"},f:[{p:[25,2,943],t:7,e:"ui-section",f:[{p:[26,3,959],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==0?"check-square-o":"square-o"'},p:[26,20,976]}],state:[{t:2,x:{r:["data.screen"],s:'_0==0?"selected":null'},p:[26,81,1037]}],action:"screen",params:'{"screen": 0}'},f:["Atmospherics"]}," ",{p:[28,3,1150],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==2?"check-square-o":"square-o"'},p:[28,20,1167]}],state:[{t:2,x:{r:["data.screen"],s:'_0==2?"selected":null'},p:[28,81,1228]}],action:"screen",params:'{"screen": 2}'},f:["Disposals"]}," ",{p:[30,3,1338],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.screen"],s:'_0==3?"check-square-o":"square-o"'},p:[30,20,1355]}],state:[{t:2,x:{r:["data.screen"],s:'_0==3?"selected":null'},p:[30,81,1416]}],action:"screen",params:'{"screen": 3}'},f:["Transit Tubes"]}]}," ",{t:4,f:[{p:[34,3,1573],t:7,e:"ui-section",a:{label:"Piping Layer"},f:[{p:[35,4,1611],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==1?"selected":null'},p:[35,22,1629]}],action:"piping_layer",params:'{"piping_layer": 1}'},f:["1"]}," ",{p:[37,4,1751],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==2?"selected":null'},p:[37,22,1769]}],action:"piping_layer",params:'{"piping_layer": 2}'},f:["2"]}," ",{p:[39,4,1891],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.piping_layer"],s:'_0==3?"selected":null'},p:[39,22,1909]}],action:"piping_layer",params:'{"piping_layer": 3}'},f:["3"]}]}],n:50,x:{r:["data.screen"],s:"_0==0"},p:[33,2,1545]}]}," ",{t:4,f:[{p:[45,2,2098],t:7,e:"ui-display",a:{title:[{t:2,r:"cat_name",p:[45,21,2117]}]},f:[{t:4,f:[{p:[47,4,2157],t:7,e:"ui-section",f:[{p:[48,5,2175],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[48,23,2193]}],action:"pipe_type",params:['{"pipe_type": ',{t:2,r:"pipe_index",p:[49,28,2274]},', "category": ',{t:2,r:"cat_name",p:[49,56,2302]},"}"]},f:[{t:2,r:"pipe_name",p:[49,71,2317]}]}]}],n:52,r:"recipes",p:[46,3,2135]}]}],n:52,r:"data.categories",p:[44,1,2070]}]},r.exports.components=r.exports.components||{};var i={colorsel:t(309),dirsel:t(310)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,309:309,310:310}],309:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Color"},f:[{t:4,f:[{p:[3,3,60],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[3,21,78]}],action:"color",params:['{"paint_color": ',{t:2,r:"color_name",p:[4,28,155]},"}"]},f:[{t:2,r:"color_name",p:[4,45,172]}]}],n:52,r:"data.paint_colors",p:[2,2,29]}]}]},e.exports=a.extend(r.exports)},{205:205}],310:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Direction"},f:[{t:4,f:[{p:[3,3,64],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,5,105],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[5,23,123]}],action:"setdir",params:['{"dir": ',{t:2,r:"dir",p:[6,22,195]},', "flipped": ',{t:2,r:"flipped",p:[6,42,215]},"}"]},f:[{p:[6,56,229],t:7,e:"img",a:{src:["pipe.",{t:2,r:"dir",p:[6,71,244]},".",{t:2,r:"icon_state",p:[6,79,252]},".png"],title:[{t:2,r:"dir_name",p:[6,106,279]}]}}]}],n:52,r:"previews",p:[4,4,81]}]}],n:52,r:"data.preview_rows",p:[2,2,33]}]}]},e.exports=a.extend(r.exports)},{205:205}],311:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{205:205}],312:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Recipient Contents"},f:[{p:[2,2,42],t:7,e:"ui-section",f:[{p:[3,3,58],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[3,34,89]}],action:"ejectBeaker"},f:["Eject"]}," ",{p:[4,3,176],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[4,35,208]}],action:"input"},f:["Input"]}," ",{p:[5,3,289],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"disabled":null'},p:[5,33,319]}],action:"makecup"},f:["Create Cup"]}]}]}," ",{p:[8,1,436],t:7,e:"ui-display",a:{title:"Recipient"},f:[{p:[9,2,469],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[11,4,534],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[11,10,540]},"/",{t:2,r:"data.beakerMaxVolume",p:[11,52,582]}," Units"]}," ",{t:4,f:[{p:[13,5,660],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,48,703]}," units of ",{t:2,r:"name",p:[13,83,738]}]},{p:[13,98,753],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[12,4,624]},{t:4,n:51,f:[{p:[15,5,777],t:7,e:"span",a:{"class":"bad"},f:["Recipient Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[10,3,502]},{t:4,n:51,f:[{p:[18,4,848],t:7,e:"span",a:{"class":"average"},f:["No Recipient"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],313:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,26],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"check-square-o":"square-o"'},p:[2,20,43]}],style:[{t:2,x:{r:["enabled"],s:'_0?"selected":null'},p:[2,72,95]}],action:"toggle_filter",params:['{"id_tag": "',{t:2,r:"id_tag",p:[3,48,176]},'", "val": ',{t:2,r:"gas_id",p:[3,68,196]},"}"]},f:[{t:2,r:"gas_name",p:[3,81,209]}]}],n:52,r:"filter_types",p:[1,1,0]}]},e.exports=a.extend(r.exports); +},{205:205}],314:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(315),templates:t(317),status:t(316)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,315:315,316:316,317:317}],315:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=a.extend(r.exports)},{205:205}],316:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,27],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,46]}," (",{t:2,r:"id",p:[2,32,56]},")"]},f:[{t:2,r:"status",p:[3,5,71]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[5,8,109]},")"],n:50,r:"timer",p:[4,5,87]}," ",{p:[7,5,141],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[7,67,203]},'"}']},f:["Jump To"]}," ",{p:[10,5,252],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[10,53,300]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[10,70,317]}]},f:["Fast Travel"]}]}],n:52,r:"data.shuttles",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],317:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=a.extend(r.exports)},{205:205}],318:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[2,3,33],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[3,3,66],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[3,9,72]}]}]}," ",{t:4,f:[{p:[6,5,186],t:7,e:"ui-section",a:{label:"State"},f:[{p:[7,7,220],t:7,e:"span",a:{"class":[{t:2,r:"data.occupant.statstate",p:[7,20,233]}]},f:[{t:2,r:"data.occupant.stat",p:[7,49,262]}]}]}," ",{p:[9,5,315],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[10,7,350],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[10,20,363]}],max:[{t:2,r:"data.occupant.maxHealth",p:[10,54,397]}],value:[{t:2,r:"data.occupant.health",p:[10,90,433]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[11,16,475]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[11,68,527]}]}]}," ",{t:4,f:[{p:[14,7,764],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[14,26,783]}]},f:[{p:[15,9,804],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[15,30,825]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[15,66,861]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[15,103,898]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[13,5,598]}," ",{p:[18,5,985],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[19,9,1021],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[19,22,1034]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[19,68,1080]}]}]}," ",{p:[21,5,1163],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[22,9,1199],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[22,22,1212]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[22,68,1258]}]}]}," ",{p:[24,5,1342],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[26,11,1429],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[26,54,1472]}," units of ",{t:2,r:"name",p:[26,89,1507]}]},{p:[26,104,1522],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[25,9,1384]},{t:4,n:51,f:[{p:[28,11,1557],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[5,3,159]}]}," ",{p:[33,1,1653],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[34,2,1685],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[35,5,1716],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[35,22,1733]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[35,71,1782]}]}]}," ",{p:[37,3,1847],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[39,7,1908],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[39,38,1939]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[39,122,2023]},'"}']},f:[{t:2,r:"name",p:[39,132,2033]}]},{p:[39,152,2053],t:7,e:"br"}],n:52,r:"data.chems",p:[38,5,1880]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],319:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:4,f:["You Are Here"],n:50,x:{r:["occupied"],s:'_0=="owner"'},p:[10,7,491]},{t:4,n:51,f:[{t:4,f:["Occupied"],n:50,x:{r:["occupied"],s:'_0=="stranger"'},p:[13,9,566]},{t:4,n:51,f:["Swap"],x:{r:["occupied"],s:'_0=="stranger"'}}],x:{r:["occupied"],s:'_0=="owner"'}}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],320:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,23,82],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.drying"],s:'_0?"stop":"tint"'},p:[4,40,99]}],action:"Dry"},f:[{t:2,x:{r:["data.drying"],s:'_0?"Stop drying":"Dry"'},p:[4,88,147]}]}],n:50,r:"data.isdryer",p:[4,3,62]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[7,3,258],t:7,e:"ui-notice",f:[{p:[8,5,275],t:7,e:"span",f:["Unfortunately, this ",{t:2,r:"data.name",p:[8,31,301]}," is empty."]}]}],n:50,x:{r:["data.contents.length"],s:"_0==0"},p:[6,1,221]},{t:4,n:51,f:[{p:[11,1,359],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[12,2,391],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[13,4,425],t:7,e:"section",a:{"class":"cell bold"},f:["Item"]}," ",{p:[16,4,482],t:7,e:"section",a:{"class":"cell bold"},f:["Quantity"]}," ",{p:[19,4,543],t:7,e:"section",a:{"class":"cell bold",align:"center"},f:[{t:4,f:[{t:2,r:"data.verb",p:[20,22,608]}],n:50,r:"data.verb",p:[20,5,591]},{t:4,n:51,f:["Dispense"],r:"data.verb"}]}]}," ",{t:4,f:[{p:[24,3,703],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[25,4,737],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[26,5,765]}]}," ",{p:[28,4,793],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[29,5,835]}]}," ",{p:[31,4,865],t:7,e:"section",a:{"class":"table",alight:"right"},f:[{p:[32,5,909],t:7,e:"section",a:{"class":"cell"}}," ",{p:[33,5,947],t:7,e:"section",a:{"class":"cell"},f:[{p:[34,6,976],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[34,45,1015]}],params:['{ "name" : ',{t:2,r:"name",p:[34,102,1072]},', "amount" : 1 }']},f:["One"]}]}," ",{p:[38,5,1151],t:7,e:"section",a:{"class":"cell"},f:[{p:[39,6,1180],t:7,e:"ui-button",a:{grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>1)?null:"disabled"'},p:[39,45,1219]}],params:['{ "name" : ',{t:2,r:"name",p:[39,101,1275]}," }"]},f:["Many"]}]}]}]}],n:52,r:"data.contents",p:[23,2,676]}]}],x:{r:["data.contents.length"],s:"_0==0"}}]}]},e.exports=a.extend(r.exports)},{205:205}],321:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,r:"adata.inputLevel_text",p:[37,78,1447]}]}]}," ",{p:[39,3,1501],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1540],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1579]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1674],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1708]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1804],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1894],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1927]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2039],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2077]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2204],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2238],t:7,e:"span",f:[{t:2,r:"adata.inputAvailable",p:[47,9,2244]}]}]}]}," ",{p:[50,1,2308],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2339],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2377],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2394]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2449]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2519]}]},"   [",{p:[55,6,2587],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2600]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2617]}]},"]"]}," ",{p:[57,3,2724],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2764],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2785]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2817]}]},f:[{t:2,r:"adata.outputLevel_text",p:[58,80,2839]}]}]}," ",{p:[60,3,2894],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2934],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,2973]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3070],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3104]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3202],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3293],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3326]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3441],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3479]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3609],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3644],t:7,e:"span",f:[{t:2,r:"adata.outputUsed",p:[68,9,3650]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],322:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:["\ufeff",{t:4,f:[" ",{p:[2,2,33],t:7,e:"ui-display",a:{title:"Dispersal Tank"},f:[{p:[3,3,73],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[4,4,104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.active"],s:'_0?"power-off":"close"'},p:[4,21,121]}],style:[{t:2,x:{r:["data.active"],s:'_0?"selected":null'},p:[5,12,174]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[6,12,223]}],action:"power"},f:[{t:2,x:{r:["data.active"],s:'_0?"On":"Off"'},p:[7,20,286]}]}]}," ",{p:[10,3,354],t:7,e:"ui-section",a:{label:"Smoke Radius Setting"},f:[{p:[11,5,401],t:7,e:"div",a:{"class":"content",style:"float:left"},f:[{p:[12,6,448],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=1?null:"disabled"'},p:[12,36,478]}],style:[{t:2,x:{r:["data.setting"],s:'_0==1?"selected":null'},p:[12,89,531]}],action:"setting",params:'{"amount": 1}'},f:["3"]}," ",{p:[13,6,634],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=2?null:"disabled"'},p:[13,36,664]}],style:[{t:2,x:{r:["data.setting"],s:'_0==2?"selected":null'},p:[13,89,717]}],action:"setting",params:'{"amount": 2}'},f:["6"]}," ",{p:[14,6,820],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=3?null:"disabled"'},p:[14,36,850]}],style:[{t:2,x:{r:["data.setting"],s:'_0==3?"selected":null'},p:[14,89,903]}],action:"setting",params:'{"amount": 3}'},f:["9"]}," ",{p:[15,6,1006],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=4?null:"disabled"'},p:[15,36,1036]}],style:[{t:2,x:{r:["data.setting"],s:'_0==4?"selected":null'},p:[15,89,1089]}],action:"setting",params:'{"amount": 4}'},f:["12"]}," ",{p:[16,6,1193],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.maxSetting"],s:'_0>=5?null:"disabled"'},p:[16,36,1223]}],style:[{t:2,x:{r:["data.setting"],s:'_0==5?"selected":null'},p:[16,89,1276]}],action:"setting",params:'{"amount": 5}'},f:["15"]}]}]}," ",{p:[19,3,1410],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[21,6,1476],t:7,e:"span",f:[{t:2,x:{r:["adata.TankCurrentVolume"],s:"Math.round(_0)"},p:[21,12,1482]},"/",{t:2,r:"data.TankMaxVolume",p:[21,52,1522]}," Units"]}," ",{p:[22,6,1564],t:7,e:"br"}," ",{p:[23,5,1575],t:7,e:"br"}," ",{t:4,f:[{p:[25,7,1623],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[25,50,1666]}," units of ",{t:2,r:"name",p:[25,85,1701]}]},{p:[25,100,1716],t:7,e:"br"}],n:52,r:"adata.TankContents",p:[24,6,1587]}],n:50,r:"data.isTankLoaded",p:[20,4,1444]},{t:4,n:51,f:[{p:[28,6,1757],t:7,e:"span",a:{"class":"bad"},f:["Tank Empty"]}],r:"data.isTankLoaded"}," ",{p:[30,4,1809],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Eject":"Close"'},p:[30,21,1826]}],style:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"selected":null'},p:[31,12,1881]}],state:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?null:"disabled"'},p:[32,12,1936]}],action:"purge"},f:[{t:2,x:{r:["data.isTankLoaded"],s:'_0?"Purge Contents":"No chemicals detected"'},p:[33,20,1999]}]}]}]}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,2,1]}]},e.exports=a.extend(r.exports)},{205:205}],323:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],324:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],325:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:{button:[{p:[4,8,97],t:7,e:"ui-button",a:{action:"jump",params:['{"name" : ',{t:2,r:"name",p:[4,51,140]},"}"]},f:["Jump"]}," ",{p:[7,9,195],t:7,e:"ui-button",a:{action:"spawn",params:['{"name" : ',{t:2,r:"name",p:[7,53,239]},"}"]},f:["Spawn"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[2,22,46]}],button:0},f:[" ",{p:[11,3,308],t:7,e:"ui-section",a:{label:"Description"},f:[{p:[12,5,346],t:7,e:"span",f:[{t:3,r:"desc",p:[12,11,352]}]}]}," ",{p:[14,3,390],t:7,e:"ui-section",a:{label:"Spawners left"},f:[{p:[15,5,430],t:7,e:"span",f:[{t:2,r:"amount_left",p:[15,11,436]}]}]}]}],n:52,r:"data.spawners",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],326:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],327:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=a.extend(r.exports)},{205:205}],328:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],329:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button", +a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],330:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=a.extend(r.exports)},{205:205}],331:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 1:return"good";default:return"bad"}}}}}(r),r.exports.template={v:3,t:[" ",{p:[13,1,173],t:7,e:"ui-notice",f:[{p:[14,2,187],t:7,e:"ui-section",a:{label:"Reconnect"},f:[{p:[15,3,221],t:7,e:"div",a:{style:"float:right"},f:[{p:[16,4,251],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]}]}]}," ",{p:[20,1,359],t:7,e:"ui-display",a:{title:"Turbine Controller"},f:[{p:[21,2,401],t:7,e:"ui-section",a:{label:"Status"},f:[{t:4,f:[{p:[23,4,456],t:7,e:"span",a:{"class":"bad"},f:["Broken"]}],n:50,r:"data.broken",p:[22,3,432]},{t:4,n:51,f:[{p:[25,4,504],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.online"],s:"_0(_1)"},p:[25,17,517]}]},f:[{t:2,x:{r:["data.online","data.compressor_broke","data.turbine_broke"],s:'_0&&!(_1||_2)?"Online":"Offline"'},p:[25,46,546]}]}],r:"data.broken"}," ",{p:[27,3,656],t:7,e:"div",a:{style:"float:right"},f:[{p:[28,4,686],t:7,e:"ui-button",a:{icon:"power-off",action:"power-on",state:[{t:2,r:"data.broken",p:[28,57,739]}],style:[{t:2,x:{r:["data.online"],s:'_0?"selected":""'},p:[28,81,763]}]},f:["On"]}," ",{p:[29,4,817],t:7,e:"ui-button",a:{icon:"close",action:"power-off",state:[{t:2,r:"data.broken",p:[29,54,867]}],style:[{t:2,x:{r:["data.online"],s:'_0?"":"selected"'},p:[29,78,891]}]},f:["Off"]}]}," ",{t:4,f:[{p:[32,4,989],t:7,e:"br"}," [ ",{p:[33,6,1e3],t:7,e:"span",a:{"class":"bad"},f:["Compressor is inoperable"]}," ]"],n:50,r:"data.compressor_broke",p:[31,3,955]}," ",{t:4,f:[{p:[36,4,1097],t:7,e:"br"}," [ ",{p:[37,6,1108],t:7,e:"span",a:{"class":"bad"},f:["Turbine is inoperable"]}," ]"],n:50,r:"data.turbine_broke",p:[35,3,1066]}]}]}," ",{p:[41,1,1200],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[42,2,1230],t:7,e:"ui-section",a:{label:"Turbine Speed"},f:[{p:[43,3,1268],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.rpm"],s:'_0?"--":_1'},p:[43,9,1274]}," RPM"]}]}," ",{p:[45,2,1337],t:7,e:"ui-section",a:{label:"Internal Temp"},f:[{p:[46,3,1375],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.temp"],s:'_0?"--":_1'},p:[46,9,1381]}," K"]}]}," ",{p:[48,2,1443],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{p:[49,3,1483],t:7,e:"span",f:[{t:2,x:{r:["data.broken","data.power"],s:'_0?"--":_1'},p:[49,9,1489]}]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],332:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{205:205}],333:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,333],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[17,4,373],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[18,5,404]}]}," ",{p:[20,4,450],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[21,5,483]}]}," ",{p:[23,4,531],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,5,564],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[24,26,585]}],value:[{t:2,r:"adata.vr_avatar.health",p:[24,64,623]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[24,99,658]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[24,140,699]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[24,179,738]}]}]}]}],n:50,r:"data.vr_avatar",p:[15,2,307]},{t:4,n:51,f:[{p:[28,3,826],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[32,2,922],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[33,3,958],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[33,20,975]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[34,4,1042]}," the VR Sleeper"]}," ",{t:4,f:[{p:[37,4,1144],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[36,3,1116]}," ",{t:4,f:[{p:[42,4,1267],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[41,3,1240]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],334:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=a.extend(r.exports)},{205:205}],335:[function(t,e,n){(function(e){"use strict";var n=t(205),a=e.interopRequireDefault(n);t(194),t(1),t(190),t(193);var r=t(336),i=e.interopRequireDefault(r),o=t(337),s=t(191),p=t(192),u=e.interopRequireDefault(p);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(341)),window.initialize=function(e){window.tgui=window.tgui||new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(338),text:t(342),config:n.config,data:n.data,adata:n.data}}})};var c=document.getElementById("data"),l=c.textContent,d=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(d,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var f=new u["default"]("FontAwesome");f.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,190:190,191:191,192:192,193:193,194:194,205:205,336:336,337:337,338:338,341:341,342:342,"babel/external-helpers":"babel/external-helpers"}],336:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(337),a=t(339);e.exports={components:{"ui-bar":t(206),"ui-button":t(207),"ui-display":t(208),"ui-input":t(209),"ui-linegraph":t(210),"ui-notice":t(211),"ui-section":t(213),"ui-subdisplay":t(214),"ui-tabs":t(215)},events:{enter:t(203).enter,space:t(203).space},transitions:{fade:t(204)},onconfig:function(){var e=this.get("config.interface"),n={ai_airlock:t(219),airalarm:t(220),"airalarm/back":t(221),"airalarm/modes":t(222),"airalarm/scrubbers":t(223),"airalarm/status":t(224),"airalarm/thresholds":t(225),"airalarm/vents":t(226),airlock_electronics:t(227),apc:t(228),atmos_alert:t(229),atmos_control:t(230),atmos_filter:t(231),atmos_mixer:t(232),atmos_pump:t(233),brig_timer:t(234),bsa:t(235),canister:t(236),cargo:t(237),cargo_express:t(238),cellular_emporium:t(239),chem_dispenser:t(240),chem_heater:t(241),chem_master:t(242),clockwork_slab:t(243),codex_gigas:t(244),computer_fabricator:t(245),crayon:t(246),crew:t(247),cryo:t(248),disposal_unit:t(249),dna_vault:t(250),dogborg_sleeper:t(251),eightball:t(252),emergency_shuttle_console:t(253),engraved_message:t(254),error:t(255),"exofab - Copia":t(256),exonet_node:t(257),firealarm:t(258),gps:t(259),gulag_console:t(260),gulag_item_reclaimer:t(261),holodeck:t(262),implantchair:t(263),intellicard:t(264),keycard_auth:t(265),labor_claim_console:t(266),language_menu:t(267),launchpad_remote:t(268),mech_bay_power_console:t(269),mulebot:t(270),ntnet_relay:t(271),ntos_ai_restorer:t(272),ntos_card:t(273),ntos_configuration:t(274),ntos_file_manager:t(275),ntos_main:t(276),ntos_net_chat:t(277),ntos_net_dos:t(278),ntos_net_downloader:t(279),ntos_net_monitor:t(280),ntos_net_transfer:t(281),ntos_power_monitor:t(282),ntos_revelation:t(283),ntos_station_alert:t(284),ntos_supermatter_monitor:t(285),ntosheader:t(286),nuclear_bomb:t(287),operating_computer:t(288),ore_redemption_machine:t(289),pandemic:t(290),personal_crafting:t(291),portable_pump:t(292),portable_scrubber:t(293),power_monitor:t(294),radio:t(295),rdconsole:t(296),"rdconsole/circuit":t(297),"rdconsole/designview":t(298),"rdconsole/destruct":t(299),"rdconsole/diskopsdesign":t(300),"rdconsole/diskopstech":t(301),"rdconsole/nodeview":t(302),"rdconsole/protolathe":t(303),"rdconsole/rdheader":t(304),"rdconsole/settings":t(305),"rdconsole/techweb":t(306),reagentgrinder:t(307),rpd:t(308),"rpd/colorsel":t(309),"rpd/dirsel":t(310),sat_control:t(311),scp_294:t(312),scrubbing_types:t(313),shuttle_manipulator:t(314),"shuttle_manipulator/modification":t(315),"shuttle_manipulator/status":t(316),"shuttle_manipulator/templates":t(317),sleeper:t(318),slime_swap_body:t(319),smartvend:t(320),smes:t(321),smoke_machine:t(322),solar_control:t(323),space_heater:t(324),spawners_menu:t(325),station_alert:t(326),suit_storage_unit:t(327),tank_dispenser:t(328),tanks:t(329),thermomachine:t(330),turbine_computer:t(331),uplink:t(332),vr_sleeper:t(333),wires:t(334)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(218),titlebar:t(217),resize:t(212)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,263:263,264:264,265:265,266:266,267:267,268:268,269:269,270:270,271:271,272:272,273:273,274:274,275:275,276:276,277:277,278:278,279:279,280:280,281:281,282:282,283:283,284:284,285:285,286:286,287:287,288:288,289:289,290:290,291:291,292:292,293:293,294:294,295:295,296:296,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306,307:307,308:308,309:309,310:310,311:311,312:312,313:313,314:314,315:315,316:316,317:317,318:318,319:319,320:320,321:321,322:322,323:323,324:324,325:325,326:326,327:327,328:328,329:329,330:330,331:331,332:332,333:333,334:334,337:337,339:339}],337:[function(t,e,n){"use strict";function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],338:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],339:[function(t,e,n){"use strict";function a(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function r(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(337)},{337:337}],340:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var p=s;a||p.textContent.toLowerCase().includes(e)?p.style.display="":p.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],341:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],342:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var p=Array(o),u=0;o>u;u++)p[u]=arguments[u+3];n.children=p}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(p){r("throw",p)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(p){return void n(p)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=t[a]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e {{#each packs}} - {{cost}} Credits + {{cost}} Credits {{/each}} diff --git a/tgui/src/interfaces/cargo_express.ract b/tgui/src/interfaces/cargo_express.ract index 4df4517310..ca03b5311b 100644 --- a/tgui/src/interfaces/cargo_express.ract +++ b/tgui/src/interfaces/cargo_express.ract @@ -34,7 +34,7 @@ {{#each packs}} - {{cost}} Credits (Premium Pricing) + {{cost}} Credits {{/each}} diff --git a/tgui/src/interfaces/ore_redemption_machine.ract b/tgui/src/interfaces/ore_redemption_machine.ract index 7d8b86982e..4015d95c3c 100644 --- a/tgui/src/interfaces/ore_redemption_machine.ract +++ b/tgui/src/interfaces/ore_redemption_machine.ract @@ -57,9 +57,6 @@
    - - Release All -
    Ore Value @@ -103,9 +100,6 @@
    - = 1) ? null : 'disabled'}} params='{ "id" : {{id}} }'> - Smelt All -
    {{/each}} diff --git a/tgui/src/interfaces/scp_294.ract b/tgui/src/interfaces/scp_294.ract index e2b36785a2..e0b302bf0c 100644 --- a/tgui/src/interfaces/scp_294.ract +++ b/tgui/src/interfaces/scp_294.ract @@ -1,6 +1,6 @@ - Eject + Eject Input Create Cup diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index 6a2bbc228f..e2039869d1 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -216,7 +216,7 @@ function tag_pr($payload, $opened) { $tags[] = 'Removal'; } - $remove = array(); + $remove = array('Test Merge Candidate'); $mergeable = $payload['pull_request']['mergeable']; if($mergeable === TRUE) //only look for the false value