diff --git a/.gitignore b/.gitignore index 626ef179a5..b1cb02811c 100644 --- a/.gitignore +++ b/.gitignore @@ -198,4 +198,3 @@ tools/MapAtmosFixer/MapAtmosFixer/obj/x86/Debug/MapAtmosFixer.csproj.CoreCompile #GitHub Atom .atom-build.json -cfg/admin.txt 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/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/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..cd7ef8de04 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -6091,7 +6091,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 279f479f10..92f72fd46a 100644 --- a/_maps/cit_map_files/BoxStation/BoxStation.dmm +++ b/_maps/cit_map_files/BoxStation/BoxStation.dmm @@ -37291,6 +37291,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/chair/comfy/black, /turf/open/floor/plasteel/white, /area/science/xenobiology) "bPz" = ( @@ -37317,13 +37318,15 @@ /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 }, -/obj/structure/table/glass, /turf/open/floor/plasteel, /area/science/xenobiology) "bPB" = ( @@ -37413,10 +37416,10 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bPI" = ( +/obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel, /area/science/xenobiology) "bPJ" = ( @@ -38354,9 +38357,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/machinery/light{ - dir = 1 - }, /turf/open/floor/plasteel, /area/science/xenobiology) "bRZ" = ( @@ -40062,9 +40062,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/machinery/light{ - dir = 1 - }, /turf/open/floor/plasteel, /area/science/xenobiology) "bWn" = ( @@ -41536,9 +41533,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/machinery/light{ - dir = 1 - }, /turf/open/floor/plasteel, /area/science/xenobiology) "bZX" = ( @@ -43967,18 +43961,12 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cgl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 2; + external_pressure_bound = 120; + name = "killroom vent" }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio0"; - name = "containment blast door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/engine, +/turf/open/floor/circuit/killroom, /area/science/xenobiology) "cgm" = ( /obj/structure/cable{ @@ -44376,21 +44364,9 @@ /turf/closed/wall, /area/maintenance/starboard/aft) "chs" = ( -/obj/machinery/door/window/northleft{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio0"; - name = "containment blast door" - }, -/turf/open/floor/engine, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/circuit/killroom, /area/science/xenobiology) "chv" = ( /obj/structure/cable{ @@ -47996,8 +47972,8 @@ /area/space/nearstation) "csk" = ( /obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/science/xenobiology) +/turf/open/floor/plating/airless, +/area/space/nearstation) "csl" = ( /obj/structure/transit_tube/curved{ dir = 4 @@ -50012,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 @@ -52386,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 @@ -52425,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{ @@ -52539,26 +52549,6 @@ /obj/machinery/bookbinder, /turf/open/floor/plasteel/white, /area/science/circuit) -"fmO" = ( -/obj/structure/window/reinforced, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio7"; - 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 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "fmW" = ( /obj/effect/turf_decal/loading_area/white, /obj/effect/turf_decal/stripes/white/corner{ @@ -52580,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{ @@ -52763,6 +52760,11 @@ }, /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, @@ -52886,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, @@ -52959,6 +52975,9 @@ /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, @@ -53112,6 +53131,20 @@ 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 @@ -53158,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 @@ -53234,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 @@ -53307,18 +53351,6 @@ /obj/structure/falsewall, /turf/open/floor/plating, /area/maintenance/bar) -"mHe" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio0"; - name = "containment blast door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/engine, -/area/science/xenobiology) "mLm" = ( /obj/structure/cable{ icon_state = "1-8" @@ -53382,26 +53414,11 @@ dir = 8 }, /area/security/brig) -"nvr" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio0"; - name = "Containment Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) +"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, @@ -53511,6 +53528,15 @@ }, /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{ @@ -53642,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; @@ -53832,6 +53864,18 @@ "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, @@ -53892,6 +53936,17 @@ /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" @@ -53952,25 +54007,6 @@ /obj/item/shovel/spade, /turf/open/floor/plasteel/hydrofloor, /area/hallway/secondary/service) -"syV" = ( -/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) "sAz" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -96729,7 +96765,7 @@ bDb bDb bDb bDb -bDb +cNW cNW cQB czY @@ -96982,11 +97018,11 @@ bJN bRT bEm bEm -bJN -bRT -bEm -bEm bDb +iRn +eeP +bDb +aaa cNW cQB czY @@ -97225,7 +97261,7 @@ bJJ bKY bMi bNo -bOx +foQ bPA bJN bRU @@ -97239,12 +97275,12 @@ bJN bRU bEm bEm -bJN -bRU -bEm -bEm bDb -cNW +jxR +mmW +kHd +aaa +cOT cQB czY cOT @@ -97496,12 +97532,12 @@ bJN bRU bEm cBz -bJN -bRU -bEm -cBz bDb -cNW +jxR +mmW +kHd +aaa +cOT cQB czY cOT @@ -97740,7 +97776,7 @@ bLa bMi bNo bPy -syV +bPA bJN bRW bTb @@ -97753,11 +97789,11 @@ bJN bZV caV cbS -bJN +bDb cgl chs -mHe bDb +aaa cNW cQB czY @@ -98010,11 +98046,11 @@ bVi bRV bTa cbR -bVi -bRV -bTa -nvr bDb +hfn +rPW +bDb +aaa cNW cBN czY @@ -98267,12 +98303,12 @@ bZa bMi bMi bRZ -bZa -bMi -bMi -bRZ -bDb -cNW +plc +kGu +cyA +kHd +aaf +cOT cQB cAa cOT @@ -98523,13 +98559,13 @@ bUf bTc bRX bTc -bUf -bTc -bRX -bTc cbT +kHN +kHN +dkZ +lqu csk -cko +nuC czU czZ cOT @@ -98781,12 +98817,12 @@ bZb bRZ bMi bMi -bZb -bRZ -bMi -bMi -bDb -cNW +ock +eiu +rgF +kHd +aaf +cOT cgm czY cOT @@ -99038,11 +99074,11 @@ bVi bZW bTd bUg -bVi -fmO -bTd -bUg bDb +bDb +bDb +bDb +aaa cNW cgm czY @@ -99295,11 +99331,11 @@ bJN bZX caW cbU -bJN -bWn -bXg -bYh bDb +aaf +aaf +aaa +aaa cNW cgm czY @@ -99552,12 +99588,12 @@ bJN bEm bEm bRU -bJN -bEm -bEm -bRU bDb -cNW +aaf +aaa +aaa +aaa +cOT cgm czY cOT @@ -99809,12 +99845,12 @@ bJN bEm bEm bRU -bJN -bEm -bEm -bRU bDb -cNW +aaf +aaa +aaa +aaa +cOT cgm czY cOT @@ -100066,12 +100102,12 @@ bJN bEm bEm bUi -bJN -bEm -bEm -bUi bDb -cNW +aaf +aaf +aaa +aaa +cOT cgm czY cOT @@ -100324,10 +100360,10 @@ bDb bDb bDb bDb -bDb -bDb -bDb -bDb +cNW +cNW +cNW +cNW cNW czX cAc diff --git a/_maps/cit_map_files/Deltastation/DeltaStation2.dmm b/_maps/cit_map_files/Deltastation/DeltaStation2.dmm index 70f7862e09..a95d74ee74 100644 --- a/_maps/cit_map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/cit_map_files/Deltastation/DeltaStation2.dmm @@ -67542,9 +67542,7 @@ name = "xenobiology camera"; network = list("ss13","xeno","rd") }, -/turf/open/floor/plasteel/vault{ - dir = 5 - }, +/turf/open/floor/plasteel/vault/killroom, /area/science/xenobiology) "cNj" = ( /obj/structure/closet/crate{ @@ -69718,6 +69716,7 @@ 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" = ( @@ -69728,7 +69727,7 @@ icon_state = "2-8" }, /obj/machinery/door/airlock/research/glass{ - name = "Xenobiology Isolation Pin"; + name = "Xenobiology Kill Room"; req_access_txt = "47" }, /obj/effect/turf_decal/stripes/line{ @@ -70518,19 +70517,13 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cTR" = ( -/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 +/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" = ( @@ -72226,6 +72219,9 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "cXm" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, /obj/machinery/status_display{ pixel_x = 32 }, @@ -100786,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 @@ -100927,10 +100929,21 @@ "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, @@ -101036,6 +101049,21 @@ /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, @@ -101070,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{ @@ -101191,12 +101222,11 @@ dir = 5 }, /area/medical/morgue) -"vyI" = ( -/obj/machinery/status_display{ - pixel_x = 32 +"vOd" = ( +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 8 }, -/obj/structure/reagent_dispensers/watertank/high, -/turf/open/floor/circuit/green, +/turf/open/floor/plasteel/vault/killroom, /area/science/xenobiology) "wei" = ( /obj/effect/turf_decal/stripes/line, @@ -132544,9 +132574,9 @@ cHA cjp cKl cLI -cNd -cNd -cNd +kwP +kwP +kwP cNc cTQ cVI @@ -132801,9 +132831,9 @@ cHB cjp cKj cLI -cNd -cNd -cNd +kwP +nGW +vOd cSf cTR cVP @@ -133059,8 +133089,8 @@ caE cKm cLI cNi -cNd -cNd +pqQ +gPz cSg cTS cVQ @@ -133315,9 +133345,9 @@ cHB cjp cKk cLI -cNd -cNd -cNd +kwP +jRX +npb cSh cTT cVR @@ -133572,9 +133602,9 @@ cHA ceb cKk cLI -cNd -cNd -cNd +kwP +kwP +kwP cNc cTU cVS @@ -133837,7 +133867,7 @@ cTV cVT cXm cZb -vyI +cXm dcu ddV cMY diff --git a/_maps/cit_map_files/MetaStation/MetaStation.dmm b/_maps/cit_map_files/MetaStation/MetaStation.dmm index b158c0e3b4..74cdbe936c 100644 --- a/_maps/cit_map_files/MetaStation/MetaStation.dmm +++ b/_maps/cit_map_files/MetaStation/MetaStation.dmm @@ -35104,6 +35104,9 @@ /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" = ( @@ -40974,8 +40977,11 @@ /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/maintenance/department/science/xenobiology) +/area/science/xenobiology) "bIw" = ( /obj/machinery/light, /obj/machinery/camera{ @@ -71575,7 +71581,7 @@ "cTT" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, -/area/maintenance/department/science/xenobiology) +/area/science/xenobiology) "cUH" = ( /obj/structure/table/optable, /turf/open/floor/plasteel/white, @@ -72192,6 +72198,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, /obj/machinery/light/small{ dir = 1 }, @@ -72201,14 +72210,15 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/maintenance/department/science/xenobiology) +/area/science/xenobiology) "daS" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/maintenance/department/science/xenobiology) +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "daW" = ( /obj/machinery/button/door{ id = "engpa"; @@ -72343,10 +72353,8 @@ "dbv" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/small, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/maintenance/department/science/xenobiology) +/turf/open/floor/circuit/killroom, +/area/science/xenobiology) "dbE" = ( /obj/machinery/plantgenes, /obj/effect/turf_decal/stripes/line{ @@ -72753,18 +72761,15 @@ /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 = 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 + dir = 9 }, /turf/open/floor/plasteel, /area/science/xenobiology) @@ -72788,6 +72793,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, +/obj/machinery/computer/camera_advanced/xenobio, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -72857,6 +72863,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, +/obj/structure/chair/comfy/black{ + dir = 1 + }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -72871,6 +72880,9 @@ /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 }, @@ -72948,13 +72960,18 @@ /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 }, -/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel/white, /area/science/xenobiology) "dcK" = ( @@ -73380,8 +73397,11 @@ }, /obj/structure/chair, /obj/item/cigbutt, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, /turf/open/floor/plasteel/white, -/area/maintenance/department/science/xenobiology) +/area/science/xenobiology) "ddy" = ( /turf/open/floor/plating{ icon_state = "platingdmg1" @@ -73389,8 +73409,9 @@ /area/maintenance/department/science/xenobiology) "ddz" = ( /obj/effect/spawner/structure/window/reinforced, -/turf/closed/wall/r_wall, -/area/maintenance/department/science/xenobiology) +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plating, +/area/science/xenobiology) "ddA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -73400,15 +73421,15 @@ opacity = 0; req_access_txt = "55" }, -/turf/closed/wall/r_wall, -/area/maintenance/department/science/xenobiology) +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "ddC" = ( /obj/structure/disposalpipe/trunk{ dir = 1 }, /obj/structure/disposaloutlet, /turf/open/floor/plating/airless, -/area/maintenance/department/science/xenobiology) +/area/science/xenobiology) "ddE" = ( /obj/effect/landmark/start/cook, /obj/machinery/holopad, @@ -74831,6 +74852,9 @@ /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"; @@ -74841,7 +74865,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/maintenance/department/science/xenobiology) +/area/science/xenobiology) "dmr" = ( /obj/machinery/door/airlock/research{ glass = 1; @@ -74853,7 +74877,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/maintenance/department/science/xenobiology) +/area/science/xenobiology) "dmD" = ( /obj/structure/displaycase/trophy, /turf/open/floor/wood, @@ -76142,6 +76166,15 @@ }, /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 @@ -76257,6 +76290,9 @@ /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 @@ -76303,6 +76339,14 @@ /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{ @@ -76455,6 +76499,15 @@ }, /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) @@ -76485,10 +76538,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) -"jzw" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/department/science/xenobiology) "jFx" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -76905,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" @@ -110259,7 +110317,7 @@ cRi cRi cRi daP -cTA +pPA dlV aaa aaa @@ -110516,10 +110574,10 @@ daF daJ cRi bvT -dlV -dlV -dlV -dlV +cRi +cRi +cRi +cRi aaa aai aaa @@ -110773,10 +110831,10 @@ cSn cSn cRi dmq -dlV -ddj -ddj -dlV +cRi +ffK +ffK +cRi aaf aag aaa @@ -111031,9 +111089,9 @@ cSn cRi ddx ddz -ddj -ddj -jzw +dYv +ffK +cRe aaa aaa aaa @@ -111545,9 +111603,9 @@ daK cRi bIv ddz -ddj -ddj -jzw +gha +ffK +cRe aaa aaf aaa @@ -111801,10 +111859,10 @@ cSn daN cRi dmr -dlV -ddj -ddj -dlV +cRi +ffK +jwP +cRi aaa aag aaa @@ -112058,10 +112116,10 @@ daI daM cRi cTA -dlV -dlV -dlV -dlV +cRi +cRi +cRi +cRi aaf aag aaa diff --git a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm index 6bf52ab60a..b21ac7ff8c 100644 --- a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm @@ -12686,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{ @@ -27811,6 +27810,9 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "brQ" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, /obj/machinery/camera{ c_tag = "Xenobiology Port"; dir = 8; @@ -28602,11 +28604,11 @@ /turf/open/floor/plating, /area/science/xenobiology) "btD" = ( -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/science/xenobiology) "btE" = ( /obj/effect/decal/remains/xeno, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/science/xenobiology) "btF" = ( /obj/structure/chair{ @@ -29227,7 +29229,12 @@ /obj/machinery/light/small{ dir = 4 }, -/turf/open/floor/plating, +/obj/machinery/camera{ + c_tag = "Xenobiology Kill Room"; + dir = 8; + network = list("ss13","rd") + }, +/turf/open/floor/plating/airless, /area/science/xenobiology) "bva" = ( /turf/closed/wall, @@ -31294,22 +31301,16 @@ /turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bzi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/item/extinguisher{ + pixel_x = 4; + pixel_y = 3 }, -/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, +/obj/structure/table/glass, +/turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bzj" = ( +/obj/structure/reagent_dispensers/watertank, /obj/machinery/requests_console{ department = "Science"; departmentType = 2; @@ -31317,7 +31318,6 @@ pixel_x = 32; receive_ore_updates = 1 }, -/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bzk" = ( @@ -33793,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, @@ -35454,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 @@ -36332,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 @@ -49831,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, @@ -50435,6 +50431,12 @@ }, /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) @@ -93281,7 +93283,7 @@ bkE aht bnd boh -bpn +uPm bqx brQ btr diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index fd936f5205..a23b4ac9d4 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, @@ -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" @@ -1203,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" @@ -1812,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{ @@ -2364,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, @@ -2438,6 +2589,19 @@ }, /turf/open/floor/plating, /area/security/main) +"agd" = ( +/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, @@ -2523,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" @@ -2583,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, @@ -3008,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" @@ -3233,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" @@ -3638,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 @@ -3929,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" @@ -3950,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 @@ -4086,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{ @@ -4725,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" = ( @@ -15508,7 +15734,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" }, @@ -18049,7 +18275,7 @@ /turf/open/floor/plasteel, /area/bridge) "aVp" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/structure/cable{ icon_state = "4-8" }, @@ -22759,7 +22985,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" = ( @@ -24553,7 +24779,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" = ( @@ -25192,7 +25418,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" = ( @@ -27307,7 +27533,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 }, @@ -34201,8 +34427,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" = ( @@ -35591,7 +35817,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" = ( @@ -37286,13 +37512,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"bPy" = ( -/obj/effect/landmark/start/scientist, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bPz" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers{ @@ -37316,16 +37535,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"bPA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/table/glass, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bPB" = ( /obj/structure/table/glass, /obj/item/paper_bin{ @@ -37412,13 +37621,6 @@ /obj/item/clothing/glasses/science, /turf/open/floor/plasteel, /area/science/xenobiology) -"bPI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/reagent_dispensers/watertank/high, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bPJ" = ( /obj/structure/table/glass, /obj/item/stack/sheet/mineral/plasma{ @@ -38339,26 +38541,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 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bRZ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -39507,7 +39689,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" = ( @@ -40047,26 +40229,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 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bWn" = ( /obj/structure/cable{ icon_state = "0-2" @@ -41521,26 +41683,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 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bZX" = ( /obj/structure/cable{ icon_state = "0-2" @@ -41995,7 +42137,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" = ( @@ -43966,20 +44108,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cgl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio0"; - name = "containment blast door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/engine, -/area/science/xenobiology) "cgm" = ( /obj/structure/cable{ icon_state = "4-8" @@ -44375,23 +44503,6 @@ }, /turf/closed/wall, /area/maintenance/starboard/aft) -"chs" = ( -/obj/machinery/door/window/northleft{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio0"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) "chv" = ( /obj/structure/cable{ icon_state = "1-4" @@ -46048,7 +46159,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" = ( @@ -47363,7 +47474,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" = ( @@ -47519,7 +47630,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" = ( @@ -47994,10 +48105,6 @@ }, /turf/open/space, /area/space/nearstation) -"csk" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/science/xenobiology) "csl" = ( /obj/structure/transit_tube/curved{ dir = 4 @@ -52386,37 +52493,6 @@ dir = 6 }, /area/security/brig) -"dnf" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio0"; - name = "containment blast door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/engine, -/area/science/xenobiology) -"dos" = ( -/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) "dAS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -52519,26 +52595,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningdock) -"ezw" = ( -/obj/structure/window/reinforced, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio7"; - 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 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "eBn" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -52960,11 +53016,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 }, @@ -54331,33 +54387,13 @@ /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) -"vDd" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio0"; - name = "Containment Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "vHQ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -96729,7 +96765,7 @@ bDb bDb bDb bDb -bDb +cNW cNW cQB czY @@ -96982,11 +97018,11 @@ bJN bRT bEm bEm -bJN -bRT -bEm -bEm bDb +aco +agd +bDb +aaa cNW cQB czY @@ -97225,8 +97261,8 @@ bJJ bKY bMi bNo -bOx -bPA +aab +aad bJN bRU bEm @@ -97239,12 +97275,12 @@ bJN bRU bEm bEm -bJN -bRU -bEm -bEm bDb -cNW +acq +age +ajC +aaa +cOT cQB czY cOT @@ -97496,12 +97532,12 @@ bJN bRU bEm cBz -bJN -bRU -bEm -cBz bDb -cNW +acq +age +ajC +aaa +cOT cQB czY cOT @@ -97739,8 +97775,8 @@ bJL bLa bMi bNo -bPy -dos +aac +aad bJN bRW bTb @@ -97753,11 +97789,11 @@ bJN bZV caV cbS -bJN -cgl -chs -dnf bDb +acw +ago +bDb +aaa cNW cQB czY @@ -98010,11 +98046,11 @@ bVi bRV bTa cbR -bVi -bRV -bTa -vDd bDb +adr +agv +bDb +aaa cNW cBN czY @@ -98267,12 +98303,12 @@ bZa bMi bMi bRZ -bZa -bMi -bMi -bRZ -bDb -cNW +abI +aeF +ahw +ajC +aaf +cOT cQB cAa cOT @@ -98523,13 +98559,13 @@ bUf bTc bRX bTc -bUf -bTc -bRX -bTc cbT -csk -cko +abJ +abJ +ahR +ajG +ajX +ajY czU czZ cOT @@ -98781,12 +98817,12 @@ bZb bRZ bMi bMi -bZb -bRZ -bMi -bMi -bDb -cNW +abP +afQ +aiN +ajC +aaf +cOT cgm czY cOT @@ -99027,22 +99063,22 @@ bIv bIR bPE bLe -bRY +abm bTd bUg bVi -bWm +abn bTd bUg bVi -bZW -bTd -bUg -bVi -ezw +abH bTd bUg bDb +bDb +bDb +bDb +aaa cNW cgm czY @@ -99295,11 +99331,11 @@ bJN bZX caW cbU -bJN -bWn -bXg -bYh bDb +aaf +aaf +aaa +aaa cNW cgm czY @@ -99552,12 +99588,12 @@ bJN bEm bEm bRU -bJN -bEm -bEm -bRU bDb -cNW +aaf +aaa +aaa +aaa +cOT cgm czY cOT @@ -99809,12 +99845,12 @@ bJN bEm bEm bRU -bJN -bEm -bEm -bRU bDb -cNW +aaf +aaa +aaa +aaa +cOT cgm czY cOT @@ -100053,11 +100089,7 @@ bJN bMp bNp bOx -bPI -bJN -bEm -bEm -bUi +aaR bJN bEm bEm @@ -100071,7 +100103,11 @@ bEm bEm bUi bDb -cNW +aaf +aaf +aaa +aaa +cOT cgm czY cOT @@ -100324,10 +100360,10 @@ bDb bDb bDb bDb -bDb -bDb -bDb -bDb +cNW +cNW +cNW +cNW cNW czX cAc diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index b1b3f234f9..3bd62d448b 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) @@ -26364,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 }, @@ -35704,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 }, @@ -45268,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 }, @@ -46320,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 }, @@ -47105,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" }, @@ -53410,7 +53509,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 }, @@ -58216,7 +58315,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 }, @@ -60886,7 +60985,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" = ( @@ -61257,7 +61356,7 @@ /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 }, @@ -67532,20 +67631,6 @@ dir = 5 }, /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{ - dir = 5 - }, -/area/science/xenobiology) "cNj" = ( /obj/structure/closet/crate{ icon_state = "crateopen" @@ -69232,8 +69317,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 }, @@ -69713,32 +69798,6 @@ }, /turf/open/floor/plating, /area/science/xenobiology) -"cSf" = ( -/obj/structure/cable/white{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/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 Isolation Pin"; - 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" @@ -70517,22 +70576,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/xenobiology) -"cTR" = ( -/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) "cTS" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -72225,12 +72268,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/science/xenobiology) -"cXm" = ( -/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{ @@ -74856,7 +74893,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" = ( @@ -75510,7 +75547,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" = ( @@ -77248,7 +77285,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 }, @@ -77486,7 +77523,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) @@ -77818,7 +77855,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 }, @@ -88762,7 +88799,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; @@ -89819,7 +89856,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, @@ -91509,7 +91546,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) @@ -93879,7 +93916,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" = ( @@ -100613,7 +100650,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 }, @@ -100634,8 +100671,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 }, @@ -100665,7 +100702,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" = ( @@ -101123,13 +101160,6 @@ "saw" = ( /turf/closed/wall, /area/science/circuit) -"shc" = ( -/obj/machinery/status_display{ - pixel_x = 32 - }, -/obj/structure/reagent_dispensers/watertank/high, -/turf/open/floor/circuit/green, -/area/science/xenobiology) "tdp" = ( /obj/effect/turf_decal/stripes/line{ dir = 2 @@ -132544,9 +132574,9 @@ cHA cjp cKl cLI -cNd -cNd -cNd +aap +aap +aap cNc cTQ cVI @@ -132801,11 +132831,11 @@ cHB cjp cKj cLI -cNd -cNd -cNd -cSf -cTR +aap +aar +aax +aaF +aaH cVP cXi cYX @@ -133058,10 +133088,10 @@ cHD caE cKm cLI -cNi -cNd -cNd -cSg +aaq +aav +aay +aaG cTS cVQ cXj @@ -133315,9 +133345,9 @@ cHB cjp cKk cLI -cNd -cNd -cNd +aap +aaw +aaz cSh cTT cVR @@ -133572,9 +133602,9 @@ cHA ceb cKk cLI -cNd -cNd -cNd +aap +aap +aap cNc cTU cVS @@ -133835,9 +133865,9 @@ cMY cMY cTV cVT -cXm +aaI cZb -shc +aaI dcu ddV cMY diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index e32792718e..867f45a834 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 @@ -5314,6 +5463,11 @@ "alq" = ( /turf/closed/wall, /area/maintenance/starboard) +"alr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plating, +/area/science/xenobiology) "als" = ( /obj/machinery/light{ dir = 8 @@ -6120,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, @@ -6365,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, @@ -6801,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{ @@ -7485,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 @@ -7537,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, @@ -7580,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, @@ -8038,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, @@ -8230,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, @@ -8884,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 }, @@ -9296,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 @@ -13152,7 +13366,7 @@ /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, /turf/open/floor/plasteel, /area/engine/engineering) @@ -13161,7 +13375,7 @@ /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, /turf/open/floor/plasteel, /area/engine/engineering) @@ -15317,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 }, @@ -18754,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" = ( @@ -21494,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" = ( @@ -29499,7 +29713,7 @@ }, /area/bridge) "bkF" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /obj/structure/cable/yellow{ icon_state = "1-2" }, @@ -31939,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" = ( @@ -33370,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) @@ -35100,12 +35314,6 @@ dir = 5 }, /area/hallway/primary/port) -"bvT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/science/xenobiology) "bvU" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -36475,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 }, @@ -40762,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 @@ -40973,9 +41181,6 @@ }, /turf/open/floor/plasteel/bar, /area/crew_quarters/bar) -"bIv" = ( -/turf/open/floor/plasteel/white, -/area/maintenance/department/science/xenobiology) "bIw" = ( /obj/machinery/light, /obj/machinery/camera{ @@ -41570,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 }, @@ -41883,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 }, @@ -50925,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 }, @@ -53408,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" = ( @@ -53561,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 }, @@ -54044,7 +54249,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" = ( @@ -56179,7 +56384,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" = ( @@ -63636,7 +63841,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" = ( @@ -65507,7 +65712,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) @@ -69856,7 +70061,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 }, @@ -71572,10 +71777,6 @@ /obj/effect/landmark/xmastree, /turf/open/floor/wood, /area/crew_quarters/bar) -"cTT" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/maintenance/department/science/xenobiology) "cUH" = ( /obj/structure/table/optable, /turf/open/floor/plasteel/white, @@ -72124,7 +72325,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" = ( @@ -72188,27 +72389,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/science/xenobiology) -"daP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/science/xenobiology) -"daQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel/white, -/area/maintenance/department/science/xenobiology) -"daS" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/maintenance/department/science/xenobiology) "daW" = ( /obj/machinery/button/door{ id = "engpa"; @@ -72340,13 +72520,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"dbv" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/small, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/maintenance/department/science/xenobiology) "dbE" = ( /obj/machinery/plantgenes, /obj/effect/turf_decal/stripes/line{ @@ -72752,22 +72925,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"dcm" = ( -/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) "dcn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -72784,18 +72941,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"dco" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/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" @@ -72853,15 +72998,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"dcv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "dcw" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -72869,13 +73005,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/xenobiology) -"dcx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) "dcy" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/white, @@ -72947,16 +73076,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"dcJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/reagent_dispensers/watertank/high, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "dcK" = ( /obj/machinery/disposal/bin, /obj/structure/sign/warning/deathsposal{ @@ -73374,41 +73493,11 @@ }, /turf/open/floor/plating, /area/maintenance/department/science/xenobiology) -"ddx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/chair, -/obj/item/cigbutt, -/turf/open/floor/plasteel/white, -/area/maintenance/department/science/xenobiology) "ddy" = ( /turf/open/floor/plating{ icon_state = "platingdmg1" }, /area/maintenance/department/science/xenobiology) -"ddz" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/closed/wall/r_wall, -/area/maintenance/department/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/closed/wall/r_wall, -/area/maintenance/department/science/xenobiology) -"ddC" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/disposaloutlet, -/turf/open/floor/plating/airless, -/area/maintenance/department/science/xenobiology) "ddE" = ( /obj/effect/landmark/start/cook, /obj/machinery/holopad, @@ -74827,33 +74916,6 @@ "dlV" = ( /turf/closed/wall/r_wall, /area/maintenance/department/science/xenobiology) -"dmq" = ( -/obj/structure/disposalpipe/segment{ - 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/maintenance/department/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/maintenance/department/science/xenobiology) "dmD" = ( /obj/structure/displaycase/trophy, /turf/open/floor/wood, @@ -76455,10 +76517,6 @@ }, /turf/open/floor/plating/airless, /area/engine/engineering) -"jot" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/department/science/xenobiology) "jwW" = ( /turf/closed/wall/mineral/plastitanium, /area/crew_quarters/fitness/recreation) @@ -77193,7 +77251,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" = ( @@ -110258,8 +110316,8 @@ cRi cRi cRi cRi -daP -cTA +aaX +aju dlV aaa aaa @@ -110515,11 +110573,11 @@ cSn daF daJ cRi -bvT -dlV -dlV -dlV -dlV +abd +cRi +cRi +cRi +cRi aaa aai aaa @@ -110772,11 +110830,11 @@ cSn cSn cSn cRi -dmq -dlV -ddj -ddj -dlV +acd +cRi +anz +anz +cRi aaf aag aaa @@ -111003,8 +111061,8 @@ aaa aaf cRe cRS -dcm -dcv +aab +aae cRC dcG cSe @@ -111029,11 +111087,11 @@ daB daG cSn cRi -ddx -ddz -ddj -ddj -jot +aeD +alr +aov +anz +cRe aaa aaa aaa @@ -111286,12 +111344,12 @@ cSn cSn daL cRi -daQ -ddA -daS -dbv -cTT -ddC +afQ +amV +apP +aqe +arF +atC aaf aaa aaa @@ -111517,8 +111575,8 @@ aaa aaf cRe cRS -dco -dcx +aad +aaU dcA dcI cRR @@ -111543,11 +111601,11 @@ cSn daH daK cRi -bIv -ddz -ddj -ddj -jot +ahT +alr +apX +anz +cRe aaa aaf aaa @@ -111777,7 +111835,7 @@ dcb cZa dDI dcB -dcJ +aaW cRa cSm cSw @@ -111800,11 +111858,11 @@ cSn cSn daN cRi -dmr -dlV -ddj -ddj -dlV +ajk +cRi +anz +arh +cRi aaa aag aaa @@ -112058,10 +112116,10 @@ daI daM cRi cTA -dlV -dlV -dlV -dlV +cRi +cRi +cRi +cRi aaf aag 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 6bf52ab60a..38973ea85e 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -1455,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" = ( @@ -7515,7 +7515,7 @@ }, /area/bridge) "atU" = ( -/obj/item/device/radio/beacon, +/obj/item/device/beacon, /turf/open/floor/plasteel/darkblue/side{ dir = 1 }, @@ -9537,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" = ( @@ -12686,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{ @@ -16445,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 @@ -25241,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 }, @@ -25812,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 }, @@ -25991,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 }, @@ -27811,6 +27810,9 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "brQ" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, /obj/machinery/camera{ c_tag = "Xenobiology Port"; dir = 8; @@ -28602,11 +28604,11 @@ /turf/open/floor/plating, /area/science/xenobiology) "btD" = ( -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/science/xenobiology) "btE" = ( /obj/effect/decal/remains/xeno, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/science/xenobiology) "btF" = ( /obj/structure/chair{ @@ -28901,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" = ( @@ -29227,7 +29229,12 @@ /obj/machinery/light/small{ dir = 4 }, -/turf/open/floor/plating, +/obj/machinery/camera{ + c_tag = "Xenobiology Kill Room"; + dir = 8; + network = list("ss13","rd") + }, +/turf/open/floor/plating/airless, /area/science/xenobiology) "bva" = ( /turf/closed/wall, @@ -29419,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" = ( @@ -31294,22 +31301,16 @@ /turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bzi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/item/extinguisher{ + pixel_x = 4; + pixel_y = 3 }, -/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, +/obj/structure/table/glass, +/turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bzj" = ( +/obj/structure/reagent_dispensers/watertank, /obj/machinery/requests_console{ department = "Science"; departmentType = 2; @@ -31317,7 +31318,6 @@ pixel_x = 32; receive_ore_updates = 1 }, -/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel/whitepurple/side, /area/science/xenobiology) "bzk" = ( @@ -33628,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 }, @@ -33793,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, @@ -35454,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 @@ -36332,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 @@ -36373,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" = ( @@ -39638,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" = ( @@ -39754,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" = ( @@ -46040,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" = ( @@ -46319,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" = ( @@ -47188,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" = ( @@ -47342,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 }, @@ -49831,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, @@ -50018,7 +50014,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" = ( @@ -50067,19 +50063,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" = ( @@ -50178,6 +50174,12 @@ }, /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{ @@ -93281,7 +93283,7 @@ bkE aht bnd boh -bpn +gFV bqx brQ btr diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 3c5da1dcf9..f57bfbbb54 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -1514,7 +1514,7 @@ /turf/open/floor/plating, /area/hallway/primary/central) "NZ" = ( -/obj/machinery/rnd/protolathe, +/obj/machinery/rnd/production/protolathe, /turf/open/floor/plasteel, /area/science) "Qt" = ( diff --git a/cfg/admin.txt b/cfg/admin.txt index fcc587124a..e69de29bb2 100644 --- a/cfg/admin.txt +++ b/cfg/admin.txt @@ -1 +0,0 @@ -poojawa role=admin diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index e8b744ce5b..b5bbcd341e 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -34,6 +34,7 @@ #define R_SOUNDS 0x800 #define R_SPAWN 0x1000 #define R_AUTOLOGIN 0x2000 +#define R_DBRANKS 0x4000 #define R_DEFAULT R_AUTOLOGIN diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 1516be9fa3..97bcd1ff11 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -3,7 +3,7 @@ //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 +#define ui_arousal "EAST-1:28,CENTER-4:8"//Below the health doll //organ defines diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 614383931c..9350116635 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -81,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 f68657c3e9..b7cc207735 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -52,7 +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 250 +#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 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/mobs.dm b/code/__DEFINES/mobs.dm index 6f5d06f08a..71267e272f 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -86,8 +86,6 @@ #define SCREWYHUD_DEAD 2 #define SCREWYHUD_HEALTHY 3 -<<<<<<< HEAD -======= //Moods levels for humans #define MOOD_LEVEL_HAPPY4 15 #define MOOD_LEVEL_HAPPY3 10 @@ -107,7 +105,6 @@ ->>>>>>> 0bc8550... Small moodie balance changes (#36242) //Nutrition levels for humans #define NUTRITION_LEVEL_FAT 600 #define NUTRITION_LEVEL_FULL 550 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/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/subsystems.dm b/code/__DEFINES/subsystems.dm index 770d3053c6..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 @@ -59,8 +59,8 @@ #define INIT_ORDER_TRAITS 11 #define INIT_ORDER_TICKER 10 #define INIT_ORDER_MAPPING 9 -#define INIT_ORDER_ATOMS 8 -#define INIT_ORDER_NETWORKS 7 +#define INIT_ORDER_NETWORKS 8 +#define INIT_ORDER_ATOMS 7 #define INIT_ORDER_LANGUAGE 6 #define INIT_ORDER_MACHINES 5 #define INIT_ORDER_CIRCUIT 4 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index cbacf3f5d8..87f5b8d293 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -39,13 +39,12 @@ #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" -<<<<<<< HEAD -======= ->>>>>>> 0bc8550... Small moodie balance changes (#36242) #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" #define TRAIT_AGEUSIA "ageusia" #define TRAIT_HEAVY_SLEEPER "heavy_sleeper" 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/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/_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/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/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 4ce615dd01..9a325dfa1a 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -103,6 +103,7 @@ #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_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 b0468c74cb..455a0f20e1 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -289,6 +289,10 @@ 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) 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/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 12a8196dd6..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. diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 1a7e6849d0..91e1330316 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -394,4 +394,4 @@ min_val = 0 /datum/config_entry/string/default_view - config_entry_value = "15x15" \ No newline at end of file + config_entry_value = "15x15" diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index 095e69573a..55b1cd26c7 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 @@ -20,18 +20,9 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) 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) 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/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/persistence.dm b/code/controllers/subsystem/persistence.dm index 0500de33b6..791a334b55 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -171,6 +171,8 @@ SUBSYSTEM_DEF(persistence) /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) diff --git a/code/controllers/subsystem/processing/traits.dm b/code/controllers/subsystem/processing/traits.dm index 9d536c8131..17eae4bda2 100644 --- a/code/controllers/subsystem/processing/traits.dm +++ b/code/controllers/subsystem/processing/traits.dm @@ -9,7 +9,7 @@ PROCESSING_SUBSYSTEM_DEF(traits) wait = 10 runlevels = RUNLEVEL_GAME - var/list/traits = list() //Assoc. list of all roundstart trait datums; "name" = /path/ + 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 @@ -24,11 +24,10 @@ PROCESSING_SUBSYSTEM_DEF(traits) 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) - if(!isnewplayer(user)) - GenerateTraits(cli) +/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) + user.add_trait_datum(V, spawn_effects) /datum/controller/subsystem/processing/traits/proc/GenerateTraits(client/user) if(user.prefs.character_traits.len) 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/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/browser.dm b/code/datums/browser.dm index 9561515840..f1423bcf6e 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 = {"
"} @@ -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 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 bc04a67308..c302059324 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -109,6 +109,7 @@ return ..() + //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)) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 64af3bc94d..67eb33277a 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -109,6 +109,7 @@ 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 @@ -166,13 +167,10 @@ var/the_id = GetDiseaseID() if(!SSdisease.archive_diseases[the_id]) - if(new_name) - AssignName() SSdisease.archive_diseases[the_id] = src // So we don't infinite loop SSdisease.archive_diseases[the_id] = Copy() - - var/datum/disease/advance/A = SSdisease.archive_diseases[the_id] - name = A.name + if(new_name) + AssignName() //Generate disease properties based on the effects. Returns an associated list. /datum/disease/advance/proc/GenerateProperties() 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_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/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,i") +/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 diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 538146b873..1bad7b3352 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -26,7 +26,7 @@ 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 lithenessk." + gain_text = "You walk with a little more litheness." lose_text = "You start tromping around like a barbarian." @@ -81,3 +81,26 @@ 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 index 9fd966eead..4bb004f6c8 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -114,7 +114,7 @@ if(trait_holder.reagents.has_reagent("mindbreaker")) trait_holder.hallucination = 0 return - if(prob(1)) //we'll all be mad soon enough + if(prob(2)) //we'll all be mad soon enough madness() /datum/trait/insanity/proc/madness(mad_fools) @@ -154,3 +154,12 @@ 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/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/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 8738ac96a9..50ad92d44b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -542,4 +542,4 @@ if(EMERGENCY_ESCAPED_OR_ENDGAMED) SSticker.news_report = STATION_EVACUATED if(SSshuttle.emergency.is_hijacked()) - SSticker.news_report = SHUTTLE_HIJACK \ No newline at end of file + SSticker.news_report = SHUTTLE_HIJACK 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/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 048cac8326..36e06663f6 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -126,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) @@ -198,6 +198,9 @@ if(H) H.faction |= factions + for(var/V in traits) + new V(H) + H.set_cloned_appearance() H.suiciding = FALSE @@ -316,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 ..() @@ -405,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) 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/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/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/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/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..145fc7e0d5 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -850,7 +850,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C 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/pill/patch/silver_sulf = 5, /obj/item/reagent_containers/medspray/styptic = 2, /obj/item/reagent_containers/medspray/silver_sulf = 2, /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/medspray/sterilizine = 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) contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, /obj/item/reagent_containers/pill/charcoal = 6) @@ -876,7 +876,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 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/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/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 d1fbb248b9..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,6 +17,7 @@ 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) @@ -24,6 +26,11 @@ 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,12 +97,9 @@ return bloodiness else return 0 -<<<<<<< HEAD -======= /obj/effect/decal/cleanable/Destroy() . = ..() if(src.loc && isturf(src.loc)) var/area/A = get_area(src) A.beauty -= beauty / max(1, A.areasize) ->>>>>>> 0bc8550... Small moodie balance changes (#36242) 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/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 0cd102cb5a..aeb7acb651 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -531,6 +531,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) 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/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/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 5fc4bf7068..a26301693f 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -547,7 +547,6 @@ /obj/item/circuitboard/machine/tesla_coil/Initialize() . = ..() if(build_path) - name = "Tesla Coil (Machine Board)" build_path = PATH_POWERCOIL /obj/item/circuitboard/machine/tesla_coil/attackby(obj/item/I, mob/user, params) @@ -666,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, @@ -674,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)" @@ -698,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, @@ -706,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)" 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/defib.dm b/code/game/objects/items/defib.dm index 800ca21d03..e3194cd1a7 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -648,4 +648,4 @@ item_state = "defibpaddles0" req_defib = FALSE -#undef HALFWAYCRITDEATH \ No newline at end of file +#undef HALFWAYCRITDEATH 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/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/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/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..ca1e18af1b 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." 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/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/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index 2a17e0038c..ad493dd6f5 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -62,4 +62,4 @@ new /obj/item/gun/energy/laser/bluetag(src) for(var/i in 1 to 3) new /obj/item/clothing/suit/bluetag(src) - new /obj/item/clothing/head/helmet/bluetaghelm(src) \ No newline at end of file + new /obj/item/clothing/head/helmet/bluetaghelm(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 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/mirror.dm b/code/game/objects/structures/mirror.dm index f0168694f0..6553f5ec66 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -90,7 +90,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/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index ad0b33f966..841312be3a 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -95,7 +95,17 @@ 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)) 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/turfs/open.dm b/code/game/turfs/open.dm index bcd597424d..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) 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 032e828aad..1f818b442e 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -826,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 c915816ed0..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,6 +42,9 @@ 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 @@ -75,13 +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 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()) @@ -94,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) @@ -252,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) @@ -271,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 85811f693c..1728b44d9f 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -157,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)) @@ -267,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, @@ -306,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" @@ -528,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" @@ -537,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]") 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 91ed0a5128..850aca5c93 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -22,6 +22,8 @@ if(!CheckAdminHref(href, href_list)) return + citaTopic(href, href_list) //CITADEL EDIT, MENTORS + if(href_list["ahelp"]) if(!check_rights(R_ADMIN, TRUE)) return @@ -271,50 +273,6 @@ return create_message("note", banckey, null, banreason, null, null, 0, 0) - else if(href_list["mentor"]) - if(!check_rights(R_ADMIN)) return - - var/mob/M = locate(href_list["mentor"]) - if(!ismob(M)) - to_chat(usr, "this can be only used on instances of type /mob!") - return - - if(!M.client) - to_chat(usr, "No client.") - return - - log_admin("[key_name(usr)] has granted [key_name(M)] mentor access") - message_admins(" [key_name_admin(usr)] has granted [key_name_admin(M)] mentor access.") - - var/datum/DBQuery/query_add_mentors = SSdbcore.NewQuery("INSERT INTO [format_table_name("mentor")] (ckey) VALUES ('[M.client.ckey]')") - if(!query_add_mentors.Execute()) - var/err = query_add_mentors.ErrorMsg() - log_game("SQL ERROR during adding new mentor. Error : \[[err]\]\n") - load_mentors() - M.verbs += /client/proc/cmd_mentor_say - M.verbs += /client/proc/show_mentor_memo - to_chat(M, " You've been granted mentor access! Help people who send mentor-pms.") - - else if(href_list["removementor"]) - if(!check_rights(R_ADMIN)) return - - var/mob/living/carbon/human/M = locate(href_list["removementor"]) - if(!ismob(M)) - usr << "this can be only used on instances of type /mob" - return - - log_admin("[key_name(usr)] has removed mentor access from [key_name(M)]") - message_admins(" [key_name_admin(usr)] has removed mentor access from [key_name_admin(M)].") - - var/datum/DBQuery/query_remove_mentors = SSdbcore.NewQuery("DELETE FROM [format_table_name("mentor")] WHERE ckey = '[M.client.ckey]'") - if(!query_remove_mentors.Execute()) - var/err = query_remove_mentors.ErrorMsg() - log_game("SQL ERROR during removing mentor. Error : \[[err]\]\n") - load_mentors() - to_chat(M, "Your mentor access has been revoked.") - M.verbs -= /client/proc/cmd_mentor_say - M.verbs -= /client/proc/show_mentor_memo - else if(href_list["editrights"]) edit_rights_topic(href_list) @@ -916,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" @@ -1709,7 +1661,7 @@ var/mob/living/L = M var/status switch (M.stat) - if (CONSCIOUS) + if(CONSCIOUS) status = "Alive" if(SOFT_CRIT) status = "Dying" 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/playsound.dm b/code/modules/admin/verbs/playsound.dm index 33fb3867d1..7d382af901 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]") 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/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/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/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/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/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm index 0589b0c595..eb0feac0a2 100644 --- a/code/modules/antagonists/disease/disease_datum.dm +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -27,14 +27,13 @@ /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 : locate(1, 1, 1) + 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.infect_patient_zero() D.pick_name() /datum/antagonist/disease/roundend_report() diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm index ad9d07e95b..ad66ee0cbb 100644 --- a/code/modules/antagonists/disease/disease_event.dm +++ b/code/modules/antagonists/disease/disease_event.dm @@ -17,11 +17,7 @@ var/mob/dead/observer/selected = pick_n_take(candidates) - var/mob/camera/disease/virus = new /mob/camera/disease(locate(1, 1, 1)) - if(!virus.infect_patient_zero()) - message_admins("Event attempted to spawn a sentient disease, but infection of patient zero failed.") - qdel(virus) - return WAITING_FOR_SOMETHING + 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.") diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index d14d34ef75..f348704c77 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -12,14 +12,19 @@ the new instance inside the host to be updated to the template's stats. icon = 'icons/mob/blob.dmi' icon_state = "marker" mouse_opacity = MOUSE_OPACITY_ICON - move_on_shuttle = 1 + 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 + 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 @@ -45,19 +50,12 @@ the new instance inside the host to be updated to the template's stats. /mob/camera/disease/Initialize(mapload) .= ..() - adaptation_menu_action = new /datum/action/innate/disease_adapt() - adaptation_menu_action.Grant(src) disease_instances = list() hosts = list() purchased_abilities = list() unpurchased_abilities = list() - 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) disease_template = new /datum/disease/advance/sentient_disease() disease_template.overmind = src @@ -69,29 +67,45 @@ the new instance inside the host to be updated to the template's stats. 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")) - 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") + 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(world.time > (last_move_tick + move_delay)) - follow_next(Dir & NORTHWEST) - last_move_tick = world.time + 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() . = ..() @@ -122,22 +136,56 @@ the new instance inside the host to be updated to the template's stats. if(A) A.disease_name = set_name -/mob/camera/disease/proc/infect_patient_zero() - var/list/possible_hosts = list() - var/datum/disease/advance/sentient_disease/V = disease_template.Copy() - for(var/mob/living/carbon/human/H in GLOB.carbon_list) - if((H.stat != DEAD) && H.CanContractDisease(V)) - possible_hosts += H - if(!possible_hosts.len) +/mob/camera/disease/proc/infect_random_patient_zero(del_on_fail = TRUE) + if(!freemove) return FALSE - var/mob/living/carbon/human/H = pick(possible_hosts) - if(H.ForceContractDisease(V, FALSE, TRUE)) - return TRUE + 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() - return L.ForceContractDisease(V, FALSE, TRUE) + 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 @@ -214,6 +262,18 @@ the new instance inside the host to be updated to the template's stats. 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 diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index b2fab75eb4..7a573e34d1 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -9,6 +9,7 @@ var/role = ERT_SEC var/high_alert = FALSE show_in_antagpanel = FALSE + antag_moodlet = /datum/mood_event/focused /datum/antagonist/ert/on_gain() update_name() @@ -71,11 +72,11 @@ /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." @@ -83,6 +84,6 @@ 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) 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/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/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/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 5665ed5f69..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 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/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 6c4d691d0f..e5d07fd36b 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -57,7 +57,7 @@ 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 + "cost" = P.cost, "id" = pack )) @@ -120,12 +120,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 41dade9fe0..f0c8e0c2a5 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -988,8 +988,9 @@ /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/vending @@ -1983,4 +1984,4 @@ /obj/item/toy/redbutton, /obj/item/toy/eightball, /obj/item/vending_refill/donksoft) - crate_name = "toy crate" \ No newline at end of file + 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 9181945ebd..6ad71221e3 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -87,7 +87,6 @@ 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)) @@ -158,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 @@ -239,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() @@ -409,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)") @@ -623,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()) @@ -636,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() @@ -735,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)) @@ -754,4 +753,4 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) /client/proc/AnnouncePR(announcement) if(prefs && prefs.chat_toggles & CHAT_PULLR) - to_chat(src, announcement) \ No newline at end of file + to_chat(src, announcement) diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 52139fd7bc..255423a4fc 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -250,20 +250,6 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)() /datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_OOC -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 - GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \ "ghost_blue","ghost_yellow","ghost_green","ghost_pink", \ @@ -429,4 +415,3 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.save_preferences() to_chat(src, "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Prayer Visibility", "[prefs.chat_toggles & CHAT_PRAYER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - 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/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 0d8c00cad7..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." 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/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/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 67e8a6e913..4e38cb81d9 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -23,12 +23,21 @@ 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...") 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/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/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/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/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 fa292c5644..c666f05d88 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -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) 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/job.dm b/code/modules/jobs/job_types/job.dm index 077759e8b1..704722dc13 100644 --- a/code/modules/jobs/job_types/job.dm +++ b/code/modules/jobs/job_types/job.dm @@ -182,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/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/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/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/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 25eb19b644..358867e6ad 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -379,9 +379,8 @@ if(SSshuttle.emergency.timeLeft(1) > initial(SSshuttle.emergencyCallTime)*0.5) SSticker.mode.make_antag_chance(humanc) - for(var/V in character.roundstart_traits) - var/datum/trait/T = V - T.on_spawn() //so latejoins still get their correct traits + if(CONFIG_GET(flag/roundstart_traits)) + SStraits.AssignTraits(humanc, humanc.client, TRUE) log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) 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/living/blood.dm b/code/modules/mob/living/blood.dm index f7b3d15155..41715d650d 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -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/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index ddc4e2e9c1..8a73f8812e 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -738,12 +738,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() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 4995caaca0..6192d9ad44 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -266,6 +266,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/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/human.dm b/code/modules/mob/living/carbon/human/human.dm index 2061924951..8d8eead442 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -30,11 +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) @@ -223,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"]) @@ -651,6 +660,9 @@ 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") diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index c7d2541b08..06cf675427 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index bf9a4492d6..246e615199 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -85,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)) ..() @@ -330,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) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 8a78c1532e..8fdaa0a4f3 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -683,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") @@ -1121,6 +1123,16 @@ GLOBAL_LIST_EMPTY(roundstart_races) 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) @@ -1154,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) @@ -1262,14 +1291,22 @@ GLOBAL_LIST_EMPTY(roundstart_races) 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 if(health_deficiency >= 40) if(flight) . += (health_deficiency / 75) 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 + + 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) @@ -1621,6 +1658,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) 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 @@ -1650,9 +1688,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. + 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) @@ -1670,7 +1712,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) @@ -1684,6 +1730,9 @@ 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. @@ -1778,6 +1827,7 @@ 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(H.has_trait(TRAIT_NOFIRE)) return FALSE 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 552e413f4d..aa310723dd 100644 --- a/code/modules/mob/living/carbon/human/species_types/corporate.dm +++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm @@ -17,4 +17,4 @@ use_skintones = 0 species_traits = list(SPECIES_ORGANIC,NOBLOOD,EYECOLOR) inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) - sexes = 0 + sexes = 0 \ No newline at end of file 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 3317bb2cda..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() 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 2297fffa97..809c657f23 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -384,6 +384,7 @@ around.", "...and move this one instead.") + ///////////////////////////////////LUMINESCENTS////////////////////////////////////////// //Luminescents are able to consume and use slime extracts, without them decaying. @@ -542,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 @@ -555,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" @@ -725,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/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/life.dm b/code/modules/mob/living/carbon/life.dm index e5c82f0ead..fec5ae0e63 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -144,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") @@ -156,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 @@ -163,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 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/living.dm b/code/modules/mob/living/living.dm index dcd3789360..b5a0ff369d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -952,6 +952,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 @@ -963,6 +966,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 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/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/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 131748042c..2a3af029dd 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -159,8 +159,6 @@ toner = tonermax diag_hud_set_borgcell() - verbs += /mob/living/proc/lay_down //CITADEL EDIT borgs have rest verb now for snowflake reasons - //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO /mob/living/silicon/robot/Destroy() if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. @@ -629,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/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 71aea41e51..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 @@ -436,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/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/status_procs.dm b/code/modules/mob/living/status_procs.dm index 480b49277c..106381bade 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -146,13 +146,13 @@ else status_traits[trait] |= list(source) -/mob/living/proc/add_trait_datum(trait) //separate proc due to the way these ones are handled +/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) + new T (src, spawn_effects) return TRUE /mob/living/proc/remove_trait(trait, list/sources, force) @@ -192,13 +192,14 @@ . = 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] 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 017b1e7b2b..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) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 546ed7743b..e7a87e0132 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) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm new file mode 100644 index 0000000000..2d7f8f5cce --- /dev/null +++ b/code/modules/projectiles/projectile/energy.dm @@ -0,0 +1,203 @@ +/obj/item/projectile/energy + name = "energy" + icon_state = "spark" + damage = 0 + damage_type = BURN + flag = "energy" + is_reflectable = TRUE + +/obj/item/projectile/energy/chameleon + nodamage = TRUE + +/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 + 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) + ..() + +/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/radio/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) + +/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 + +/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 + +/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/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index 01e87d26cd..48544d1c28 100644 --- a/code/modules/projectiles/projectile/energy/net_snare.dm +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -31,7 +31,7 @@ /obj/effect/nettingportal/Initialize() . = ..() - var/obj/item/device/radio/beacon/teletarget = null + 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) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 598b64d025..3b04febae3 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -18,6 +18,9 @@ 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)) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 5735463af2..2a650f3381 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -303,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 00a3f0effd..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" && A.mutable) + if((disease_name == "Unknown") && A.mutable) this["can_rename"] = TRUE this["name"] = disease_name this["is_adv"] = TRUE diff --git a/code/modules/reagents/chemistry/machinery/scp_294.dm b/code/modules/reagents/chemistry/machinery/scp_294.dm index 2b63799547..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" @@ -25,7 +27,7 @@ GLOB.poi_list += src 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 70bb594c8b..a1a65409a1 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -91,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 9ada644e59..e8070e8906 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -145,12 +145,13 @@ 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) @@ -159,6 +160,47 @@ All effects don't start immediately, but rather get worse over time; the rate is 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" diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index b07b3ece5c..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" 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/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..655f6ffc7d 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -171,19 +171,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/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/machinery/_production.dm b/code/modules/research/machinery/_production.dm new file mode 100644 index 0000000000..3cef3a0b84 --- /dev/null +++ b/code/modules/research/machinery/_production.dm @@ -0,0 +1,328 @@ +/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 + +//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 \ No newline at end of file diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm new file mode 100644 index 0000000000..3a56850a2f --- /dev/null +++ b/code/modules/research/machinery/circuit_imprinter.dm @@ -0,0 +1,32 @@ +/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/calculate_efficiency() + . = ..() + 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/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..404a982b51 --- /dev/null +++ b/code/modules/research/machinery/protolathe.dm @@ -0,0 +1,32 @@ +/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/calculate_efficiency() + . = ..() + efficiency_coeff = 0 + for(var/obj/item/stock_parts/manipulator/M in component_parts) + efficiency_coeff += M.rating + efficiency_coeff = max(1, efficiency_coeff) + +/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/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/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/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/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 7af437ae86..2cf8389a6b 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -19,6 +19,9 @@ 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) @@ -101,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/eyes.dm b/code/modules/surgery/organs/eyes.dm index 93b0439d83..b840d82670 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -77,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 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/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-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-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-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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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_toggles.dm b/modular_citadel/code/modules/client/preferences_toggles.dm index 4b92a1e9c3..a475d65106 100644 --- a/modular_citadel/code/modules/client/preferences_toggles.dm +++ b/modular_citadel/code/modules/client/preferences_toggles.dm @@ -20,3 +20,17 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggledigestionnoise)() 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/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/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/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/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/tgstation.dme b/tgstation.dme index b1787c6712..ec4b134561 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -222,6 +222,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" @@ -321,6 +322,7 @@ #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" @@ -397,10 +399,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" @@ -768,6 +776,7 @@ #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" @@ -797,7 +806,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" @@ -1019,6 +1027,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" @@ -1027,7 +1036,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" @@ -1494,7 +1502,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" @@ -1618,6 +1625,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" @@ -1668,6 +1676,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" @@ -1859,6 +1868,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" @@ -2319,6 +2329,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" @@ -2332,13 +2343,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" @@ -2364,6 +2371,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" @@ -2577,6 +2591,7 @@ #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\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" @@ -2655,10 +2670,12 @@ #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\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" @@ -2666,6 +2683,7 @@ #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" @@ -2699,6 +2717,7 @@ #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\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" diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index dd17f8f4a3..8466408385 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -7,7 +7,7 @@ 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"], +},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"]}]}],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], diff --git a/tgui/src/interfaces/cargo_express.ract b/tgui/src/interfaces/cargo_express.ract index 4df4517310..562ceabbed 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}}