diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt index 9754c511d0..bf765a0806 100644 --- a/SQL/database_changelog.txt +++ b/SQL/database_changelog.txt @@ -1,3 +1,38 @@ +30 January 2017, by Lzimann + +Modified table 'death', adding the columns 'mapname' and 'server'. + +ALTER TABLE `death` ADD COLUMN `mapname` TEXT NOT NULL AFTER `coord`, ADD COLUMN `server` TEXT NOT NULL AFTER `mapname` + +Remember to add a prefix to the table name if you use them + +---------------------------------------------------- + +25 January 2017, by Jordie0608 + +Created table 'messages' to supersede the 'notes', 'memos', and 'watchlist' tables; they must be collated into this new table + +To create this new table run the following command: + +CREATE TABLE `feedback`.`messages` (`id` INT(11) NOT NULL AUTO_INCREMENT , `type` VARCHAR(32) NOT NULL , `targetckey` VARCHAR(32) NOT NULL , `adminckey` VARCHAR(32) NOT NULL , `text` TEXT NOT NULL , `timestamp` DATETIME NOT NULL , `server` VARCHAR(32) NULL , `secret` TINYINT(1) NULL DEFAULT 1 , `lasteditor` VARCHAR(32) NULL , `edits` TEXT NULL , PRIMARY KEY (`id`) ) + +To copy the contents of the 'notes', 'memos', and 'watchlist' tables to this new table run the following commands: + +INSERT INTO `feedback`.`messages` +(`id`,`type`,`targetckey`,`adminckey`,`text`,`timestamp`,`server`,`secret`,`lasteditor`,`edits`) SELECT `id`, "note", `ckey`, `adminckey`, `notetext`, `timestamp`, `server`, `secret`, `last_editor`, `edits` FROM `feedback`.`notes` + +INSERT INTO `feedback`.`messages` +(`type`,`targetckey`,`adminckey`,`text`,`timestamp`,`lasteditor`,`edits`) SELECT "memo", `ckey`, `ckey`, `memotext`, `timestamp`, `last_editor`, `edits` FROM `feedback`.`memo` + +INSERT INTO `feedback`.`messages` +(`type`,`targetckey`,`adminckey`,`text`,`timestamp`,`lasteditor`,`edits`) SELECT "watchlist entry", `ckey`, `adminckey`, `reason`, `timestamp`, `last_editor`, `edits` FROM `feedback`.`watch` + +It's not necessary to delete the 'notes', 'memos', and 'watchlist' tables but they will no longer be used. + +Remember to add a prefix to the table names if you use them + +---------------------------------------------------- + 1 September 2016, by Jordie0608 Modified table 'notes', adding column 'secret'. diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index b3fb977044..91bc36feb3 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -135,6 +135,8 @@ CREATE TABLE `death` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pod` text NOT NULL COMMENT 'Place of death', `coord` text NOT NULL COMMENT 'X, Y, Z POD', + `mapname` text NOT NULL, + `server` text NOT NULL, `tod` datetime NOT NULL COMMENT 'Time of death', `job` text NOT NULL, `special` text NOT NULL, @@ -147,6 +149,7 @@ CREATE TABLE `death` ( `brainloss` int(11) NOT NULL, `fireloss` int(11) NOT NULL, `oxyloss` int(11) NOT NULL, + PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; @@ -311,65 +314,13 @@ CREATE TABLE `poll_vote` ( /*!40101 SET character_set_client = @saved_cs_client */; -- --- Table structure for table `watch` +-- Table structure for table `ipintel` -- -DROP TABLE IF EXISTS `watch`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `watch` ( - `ckey` varchar(32) NOT NULL, - `reason` text NOT NULL, - `timestamp` datetime NOT NULL, - `adminckey` varchar(32) NOT NULL, - `last_editor` varchar(32), - `edits` text, - PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `memo` --- - -DROP TABLE IF EXISTS `memo`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `memo` ( - `ckey` varchar(32) NOT NULL, - `memotext` text NOT NULL, - `timestamp` datetime NOT NULL, - `last_editor` varchar(32), - `edits` text, - PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `notes` --- - -DROP TABLE IF EXISTS `notes`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `notes` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ckey` varchar(32) NOT NULL, - `notetext` text NOT NULL, - `timestamp` datetime NOT NULL, - `adminckey` varchar(32) NOT NULL, - `last_editor` varchar(32), - `edits` text, - `server` varchar(50) NOT NULL, - `secret` tinyint(1) NOT NULL DEFAULT '1', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - DROP TABLE IF EXISTS `ipintel`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `ipintel` ( +CREATE TABLE `ipintel` ( `ip` INT UNSIGNED NOT NULL , `date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL , `intel` REAL NOT NULL DEFAULT '0', @@ -377,6 +328,32 @@ PRIMARY KEY ( `ip` ) ) ENGINE = INNODB; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `messages` +-- + +DROP TABLE IF EXISTS `messages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `messages` ( + `id` int(11) NOT NULL AUTO_INCREMENT , + `type` varchar(32) NOT NULL , + `targetckey` varchar(32) NOT NULL , + `adminckey` varchar(32) NOT NULL , + `text` text NOT NULL , + `timestamp` datetime NOT NULL , + `server` varchar(32) NULL , + `secret` tinyint(1) NULL DEFAULT 1 , + `lasteditor` varchar(32) NULL , + `edits` text NULL , + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Mentor stufs +-- + DROP TABLE IF EXISTS `mentor`; CREATE TABLE `mentor` ( `ckey` text NOT NULL @@ -390,5 +367,3 @@ CREATE TABLE `mentor_memo` ( `last_editor` varchar(32) DEFAULT NULL, `edits` text, PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; --- Dump completed on 2013-03-24 18:02:35 diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index f605339ee3..63d32eed08 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -135,6 +135,8 @@ CREATE TABLE `SS13_death` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pod` text NOT NULL COMMENT 'Place of death', `coord` text NOT NULL COMMENT 'X, Y, Z POD', + `mapname` text NOT NULL, + `server` text NOT NULL, `tod` datetime NOT NULL COMMENT 'Time of death', `job` text NOT NULL, `special` text NOT NULL, @@ -306,69 +308,38 @@ CREATE TABLE `SS13_poll_vote` ( /*!40101 SET character_set_client = @saved_cs_client */; -- --- Table structure for table `SS13_watch` +-- Table structure for table `SS13_ipintel` -- -DROP TABLE IF EXISTS `SS13_watch`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `SS13_watch` ( - `ckey` varchar(32) NOT NULL, - `reason` text NOT NULL, - `timestamp` datetime NOT NULL, - `adminckey` varchar(32) NOT NULL, - `last_editor` varchar(32), - `edits` text, - PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `SS13_memo` --- - -DROP TABLE IF EXISTS `SS13_memo`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `SS13_memo` ( - `ckey` varchar(32) NOT NULL, - `memotext` text NOT NULL, - `timestamp` datetime NOT NULL, - `last_editor` varchar(32), - `edits` text, - PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `SS13_notes` --- - -DROP TABLE IF EXISTS `SS13_notes`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `SS13_notes` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ckey` varchar(32) NOT NULL, - `notetext` text NOT NULL, - `timestamp` datetime NOT NULL, - `adminckey` varchar(32) NOT NULL, - `last_editor` varchar(32), - `edits` text, - `server` varchar(50) NOT NULL, - `secret` tinyint(1) NOT NULL DEFAULT '1', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; -/*!40101 SET character_set_client = @saved_cs_client */; - DROP TABLE IF EXISTS `SS13_ipintel`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `SS13_ipintel` ( +CREATE TABLE `SS13_ipintel` ( `ip` INT UNSIGNED NOT NULL , `date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL , `intel` REAL NOT NULL DEFAULT '0', PRIMARY KEY ( `ip` ) ) ENGINE = INNODB; /*!40101 SET character_set_client = @saved_cs_client */; --- Dump completed on 2013-03-24 18:02:35 + +-- +-- Table structure for table `SS13_messages` +-- + +DROP TABLE IF EXISTS `SS13_messages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `SS13_messages` ( + `id` int(11) NOT NULL AUTO_INCREMENT , + `type` varchar(32) NOT NULL , + `targetckey` varchar(32) NOT NULL , + `adminckey` varchar(32) NOT NULL , + `text` text NOT NULL , + `timestamp` datetime NOT NULL , + `server` varchar(32) NULL , + `secret` tinyint(1) NULL DEFAULT 1 , + `lasteditor` varchar(32) NULL , + `edits` text NULL , + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 07f9df788c..19b2c6579b 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -2374,7 +2374,7 @@ info = "
CARAVAN SERVICES

Quality service since 2205


SHIPMENT CONTENTS:


4 scattershot rifles
6 grenades
1 laser rifle
1 blowup doll"; name = "Shipment Receipt" }, -/obj/item/organ/cyberimp/eyes/thermals, +/obj/item/organ/eyes/robotic/thermals, /obj/item/weapon/gun/energy/laser/captain/scattershot, /obj/item/slimepotion/fireproof, /turf/open/floor/plating/asteroid/basalt{ diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm index 5b236a590a..de2adf0977 100644 --- a/_maps/map_files/BirdStation/BirdStation.dmm +++ b/_maps/map_files/BirdStation/BirdStation.dmm @@ -799,10 +799,10 @@ /turf/open/floor/plasteel, /area/engine/engineering) "acc" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/engine/engineering) "acd" = ( /obj/machinery/power/port_gen/pacman{ @@ -814,8 +814,8 @@ /obj/structure/cable/cyan{ icon_state = "0-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/engine/engineering) "ace" = ( /obj/machinery/light{ @@ -869,10 +869,10 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "acm" = ( /obj/machinery/door/airlock/glass_engineering{ @@ -902,10 +902,10 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/engine/engineering) "acq" = ( /obj/structure/reflector/single{ @@ -995,14 +995,14 @@ icon_state = "intact"; dir = 9 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, /area/engine/engineering) "acD" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/turf/open/floor/plasteel, /area/engine/engineering) "acE" = ( /obj/machinery/light{ @@ -1031,18 +1031,18 @@ /obj/structure/cable/cyan{ icon_state = "0-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/engine/engineering) "acI" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ icon_state = "manifold"; dir = 1 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/turf/open/floor/plasteel, /area/engine/engineering) "acJ" = ( /obj/structure/cable/cyan{ @@ -1127,10 +1127,10 @@ /turf/open/floor/plasteel, /area/engine/engineering) "acT" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "acU" = ( /turf/closed/wall/r_wall, @@ -1144,10 +1144,10 @@ icon_state = "camera"; dir = 4 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/engine/engineering) "acW" = ( /obj/structure/cable/cyan{ @@ -1220,10 +1220,10 @@ /area/engine/engineering) "adh" = ( /obj/machinery/atmospherics/components/binary/pump, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/engine/engineering) "adi" = ( /obj/structure/cable/cyan{ @@ -1315,10 +1315,10 @@ icon_state = "pump_map"; dir = 8 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "adu" = ( /obj/effect/spawner/structure/window/reinforced, @@ -1358,10 +1358,10 @@ "adx" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/engine/engineering) "ady" = ( /obj/structure/cable/cyan{ @@ -1425,10 +1425,10 @@ /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 6 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/engine/engineering) "adI" = ( /obj/structure/cable/cyan{ @@ -1478,17 +1478,17 @@ icon_state = "connector_map"; dir = 8 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "adQ" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/engine/engineering) "adR" = ( /obj/structure/grille, @@ -1655,10 +1655,10 @@ icon_state = "4-8"; pixel_y = 0 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aem" = ( /obj/structure/cable{ @@ -1672,10 +1672,10 @@ icon_state = "4-8"; pixel_y = 0 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aen" = ( /obj/structure/cable{ @@ -1683,17 +1683,17 @@ d2 = 8; icon_state = "1-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aeo" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aep" = ( /obj/machinery/ai_slipper{ @@ -1869,19 +1869,19 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aeK" = ( /obj/structure/cable/cyan{ icon_state = "1-4" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aeL" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, @@ -1964,10 +1964,10 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aeX" = ( /obj/machinery/camera/autoname{ @@ -2109,10 +2109,10 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "afr" = ( /obj/machinery/light/small{ @@ -2169,8 +2169,8 @@ icon_state = "pump_map"; dir = 1 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "afz" = ( /obj/structure/cable{ @@ -2179,13 +2179,13 @@ icon_state = "1-2"; pixel_y = 0 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "afA" = ( /obj/machinery/atmospherics/components/binary/pump, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/engine/engineering) "afB" = ( /obj/structure/lattice, @@ -2245,10 +2245,10 @@ /turf/open/space, /area/space) "afK" = ( -/turf/open/floor/plating, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plating, /area/engine/engineering) "afL" = ( /obj/machinery/light{ @@ -2263,10 +2263,10 @@ network = list("heating"); pixel_y = 28 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "afN" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, @@ -2417,10 +2417,10 @@ icon_state = "pump_map"; dir = 4 }, -/turf/open/floor/plating, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plating, /area/engine/engineering) "age" = ( /obj/machinery/atmospherics/pipe/manifold4w/yellow/visible, @@ -2479,30 +2479,30 @@ charge = 1e+006 }, /obj/structure/cable/cyan, -/turf/open/floor/plasteel/black, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/turf/open/floor/plasteel/black, /area/engine/engineering) "ago" = ( /obj/machinery/power/smes{ charge = 1e+006 }, /obj/structure/cable/cyan, -/turf/open/floor/plasteel/black, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/black, /area/engine/engineering) "agp" = ( /obj/machinery/power/smes{ charge = 1e+006 }, /obj/structure/cable/cyan, -/turf/open/floor/plasteel/black, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/turf/open/floor/plasteel/black, /area/engine/engineering) "agq" = ( /obj/machinery/atmospherics/components/binary/pump, @@ -2685,10 +2685,10 @@ d2 = 8; icon_state = "0-8" }, -/turf/open/floor/plasteel/black, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/black, /area/engine/engineering) "agM" = ( /obj/machinery/power/terminal{ @@ -2716,10 +2716,10 @@ d2 = 8; icon_state = "0-8" }, -/turf/open/floor/plasteel/black, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel/black, /area/engine/engineering) "agO" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -2818,10 +2818,10 @@ icon_state = "intact"; dir = 10 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "ahc" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ @@ -2858,27 +2858,27 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/plasteel/black, /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/turf/open/floor/plasteel/black, /area/engine/engineering) "ahi" = ( /obj/machinery/computer/monitor, /obj/structure/cable/cyan{ icon_state = "0-4" }, -/turf/open/floor/plasteel/black, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/black, /area/engine/engineering) "ahj" = ( /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/black, /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/turf/open/floor/plasteel/black, /area/engine/engineering) "ahk" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -3015,10 +3015,10 @@ /area/engine/engineering) "ahB" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "ahC" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -3323,36 +3323,36 @@ }, /area/engine/engineering) "aip" = ( -/turf/open/floor/plating, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plating, /area/engine/engineering) "aiq" = ( /obj/machinery/atmospherics/components/binary/pump{ icon_state = "pump_map"; dir = 1 }, -/turf/open/floor/plating, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plating, /area/engine/engineering) "air" = ( -/turf/open/floor/plating, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plating, /area/engine/engineering) "ais" = ( /obj/machinery/camera/autoname{ icon_state = "camera"; dir = 10 }, -/turf/open/floor/plating, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/turf/open/floor/plating, /area/engine/engineering) "ait" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ @@ -3366,10 +3366,10 @@ icon_state = "manifold"; dir = 4 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aiv" = ( /obj/structure/grille, @@ -3494,28 +3494,28 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aiK" = ( /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aiL" = ( /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/turf/open/floor/plasteel, /area/engine/engineering) "aiM" = ( /obj/effect/spawner/structure/window/reinforced, @@ -3659,10 +3659,10 @@ dir = 4 }, /obj/machinery/meter, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/turf/open/floor/plasteel, /area/engine/engineering) "ajf" = ( /obj/machinery/power/apc{ @@ -3716,10 +3716,10 @@ icon_state = "manifold"; dir = 8 }, -/turf/open/floor/plating, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plating, /area/engine/engineering) "ajl" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -3728,10 +3728,10 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plating, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plating, /area/engine/engineering) "ajm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -3739,20 +3739,20 @@ icon_state = "intact"; dir = 9 }, -/turf/open/floor/plating, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plating, /area/engine/engineering) "ajn" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible{ icon_state = "intact"; dir = 5 }, -/turf/open/floor/plating, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plating, /area/engine/engineering) "ajo" = ( /obj/machinery/atmospherics/components/binary/pump/on{ @@ -3996,16 +3996,16 @@ icon_state = "camera"; dir = 4 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/turf/open/floor/plasteel, /area/engine/engineering) "ajS" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/turf/open/floor/plasteel, /area/engine/engineering) "ajT" = ( /obj/structure/table, @@ -4018,10 +4018,10 @@ /obj/item/clothing/glasses/meson/engine, /obj/item/clothing/glasses/meson/engine, /obj/machinery/light/small, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/turf/open/floor/plasteel, /area/engine/engineering) "ajU" = ( /obj/structure/table, @@ -4328,10 +4328,10 @@ icon_state = "plant-02"; layer = 4.1 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/gateway) "akE" = ( /obj/machinery/gateway{ @@ -4358,10 +4358,10 @@ }, /area/gateway) "akH" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/gateway) "akI" = ( /obj/item/weapon/twohanded/required/kirbyplants{ @@ -4519,10 +4519,10 @@ icon_state = "tube1"; dir = 8 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/gateway) "alh" = ( /obj/machinery/gateway{ @@ -4721,10 +4721,10 @@ /turf/open/floor/wood, /area/maintenance/fsmaint) "alE" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/gateway) "alF" = ( /obj/machinery/gateway{ @@ -4898,31 +4898,31 @@ /turf/open/floor/plating, /area/gateway) "alZ" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel, /area/gateway) "ama" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/gateway) "amb" = ( /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/gateway) "amc" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/turf/open/floor/plasteel, /area/gateway) "amd" = ( /turf/open/floor/plasteel, @@ -5202,8 +5202,8 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/teleporter{ name = "\improper Teleporter Room" }) @@ -5993,8 +5993,8 @@ }) "aoF" = ( /obj/machinery/suit_storage_unit/standard_unit, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/ai_monitored/storage/eva{ name = "E.V.A. Storage" }) @@ -6769,8 +6769,8 @@ dir = 1; network = list("SS13") }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/ai_monitored/storage/eva{ name = "E.V.A. Storage" }) @@ -8382,17 +8382,17 @@ location = "Cargo #1"; name = "navigation beacon" }, +/obj/effect/turf_decal/delivery, /mob/living/simple_animal/bot/mulebot{ beacon_freq = 1400; home_destination = "Cargo #1"; suffix = "#1" }, /turf/open/floor/plasteel, -/obj/effect/turf_decal/delivery, /area/quartermaster/storage) "auv" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/quartermaster/storage) "auw" = ( /obj/machinery/light{ @@ -8629,8 +8629,8 @@ location = "Cargo #2"; name = "navigation beacon" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, /area/quartermaster/storage) "auY" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, @@ -8902,8 +8902,8 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/hallway/primary/central) "avI" = ( /obj/structure/cable/cyan{ @@ -9390,8 +9390,8 @@ lootcount = 2; name = "2maintenance loot spawner" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/quartermaster/storage) "awZ" = ( /obj/structure/closet/crate, @@ -9399,8 +9399,8 @@ lootcount = 3; name = "3maintenance loot spawner" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/quartermaster/storage) "axa" = ( /obj/structure/closet/crate, @@ -9408,8 +9408,8 @@ lootcount = 4; name = "4maintenance loot spawner" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/quartermaster/storage) "axb" = ( /obj/structure/cable/cyan{ @@ -9641,8 +9641,8 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/quartermaster/storage) "axN" = ( /obj/structure/closet/crate, @@ -9653,8 +9653,8 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/quartermaster/storage) "axO" = ( /obj/structure/closet/crate/medical, @@ -9665,8 +9665,8 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/quartermaster/storage) "axP" = ( /obj/structure/closet/crate, @@ -9677,8 +9677,8 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/quartermaster/storage) "axQ" = ( /obj/structure/cable/cyan{ @@ -9840,19 +9840,19 @@ name = "cargo bay airlock"; req_access_txt = "31" }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel{ name = "floor" }, -/obj/effect/turf_decal/delivery, /area/quartermaster/miningdock{ name = "\improper Mining Office" }) "ayl" = ( /obj/machinery/camera/autoname, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel{ name = "floor" }, -/obj/effect/turf_decal/delivery, /area/quartermaster/miningdock{ name = "\improper Mining Office" }) @@ -9860,10 +9860,10 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/quartermaster/miningdock{ name = "\improper Mining Office" }) @@ -10161,18 +10161,18 @@ /turf/open/floor/plasteel, /area/maintenance/fsmaint) "ayZ" = ( +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel{ name = "floor" }, -/obj/effect/turf_decal/delivery, /area/quartermaster/miningdock{ name = "\improper Mining Office" }) "aza" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/quartermaster/miningdock{ name = "\improper Mining Office" }) @@ -10323,12 +10323,12 @@ location = "Disposals"; name = "navigation beacon" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, /area/maintenance/disposal) "azv" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/maintenance/disposal) "azw" = ( /obj/vehicle/janicart, @@ -10912,10 +10912,10 @@ /turf/open/floor/plasteel, /area/maintenance/disposal) "aAU" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/turf/open/floor/plasteel, /area/maintenance/disposal) "aAV" = ( /obj/structure/cable/cyan{ @@ -11837,8 +11837,8 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/crew_quarters/sleep) "aDa" = ( /obj/machinery/navbeacon{ @@ -11855,8 +11855,8 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, /area/crew_quarters/sleep) "aDb" = ( /obj/machinery/power/apc{ @@ -12230,8 +12230,8 @@ /obj/structure/cable/cyan{ icon_state = "2-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aDW" = ( /obj/item/weapon/ed209_assembly, @@ -12559,10 +12559,10 @@ /obj/structure/cable/cyan{ icon_state = "2-4" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aEL" = ( /obj/machinery/door/airlock/maintenance{ @@ -13162,10 +13162,10 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aGo" = ( /obj/item/weapon/secbot_assembly, @@ -13671,12 +13671,12 @@ /turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aHJ" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aHK" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aHL" = ( /obj/machinery/button/door{ @@ -13685,14 +13685,14 @@ pixel_x = 0; pixel_y = 24 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aHM" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aHN" = ( /turf/open/floor/plasteel/white, @@ -13751,22 +13751,22 @@ /area/shuttle/escape) "aHY" = ( /obj/machinery/door/airlock/external, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel{ name = "floor" }, -/obj/effect/turf_decal/delivery, /area/hallway/secondary/exit) "aHZ" = ( +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel{ name = "floor" }, -/obj/effect/turf_decal/delivery, /area/hallway/secondary/exit) "aIa" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/hallway/secondary/exit) "aIb" = ( /obj/machinery/door/airlock/external, @@ -14033,10 +14033,10 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aIE" = ( /obj/machinery/processor{ @@ -14059,10 +14059,10 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aIH" = ( /obj/structure/reagent_dispensers/watertank, @@ -14466,22 +14466,22 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aJB" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aJC" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aJD" = ( /obj/structure/bookcase/random/adult, @@ -14958,10 +14958,10 @@ "aKS" = ( /obj/structure/table/glass, /obj/item/weapon/storage/pill_bottle/mannitol, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/medical/genetics_cloning) "aKT" = ( /obj/machinery/camera/autoname, @@ -15312,28 +15312,28 @@ /obj/structure/cable/cyan{ icon_state = "0-4" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/medical/genetics_cloning) "aLI" = ( /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/medical/genetics_cloning) "aLJ" = ( /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/turf/open/floor/plasteel/white, /area/medical/genetics_cloning) "aLK" = ( /obj/structure/cable/cyan{ @@ -15428,8 +15428,8 @@ /turf/open/floor/carpet, /area/crew_quarters/heads) "aLY" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aLZ" = ( /obj/structure/closet/secure_closet/chemical, @@ -15469,10 +15469,10 @@ /turf/open/floor/engine, /area/toxins/xenobiology) "aMe" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aMf" = ( /turf/closed/wall/shuttle{ @@ -15547,25 +15547,25 @@ icon_state = "shower"; dir = 4 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, /area/medical/genetics_cloning) "aMp" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, /area/medical/genetics_cloning) "aMq" = ( /obj/effect/landmark/start{ name = "Medical Doctor" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, /area/medical/genetics_cloning) "aMr" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/medical/genetics_cloning) "aMs" = ( /obj/structure/cable/cyan{ @@ -15607,10 +15607,10 @@ /turf/open/floor/plating, /area/toxins/lab) "aMy" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel/white, /area/toxins/lab) "aMz" = ( /obj/machinery/r_n_d/destructive_analyzer, @@ -15628,10 +15628,10 @@ /turf/open/floor/plasteel, /area/toxins/lab) "aMC" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/toxins/lab) "aMD" = ( /turf/closed/wall, @@ -15814,10 +15814,10 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aMU" = ( /obj/structure/cable/cyan{ @@ -15830,10 +15830,10 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aMV" = ( /obj/machinery/atmospherics/components/binary/volume_pump{ @@ -15847,10 +15847,10 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aMW" = ( /obj/machinery/disposal/bin, @@ -15864,10 +15864,10 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aMX" = ( /obj/structure/cable/cyan{ @@ -15877,19 +15877,19 @@ icon_state = "intact"; dir = 10 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aMY" = ( /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aMZ" = ( /obj/machinery/disposal/bin, @@ -15899,10 +15899,10 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aNa" = ( /obj/machinery/atmospherics/components/binary/volume_pump{ @@ -15912,19 +15912,19 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aNb" = ( /obj/structure/cable/cyan{ icon_state = "1-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aNc" = ( /obj/structure/extinguisher_cabinet{ @@ -16019,8 +16019,8 @@ pixel_x = 0; pixel_y = 32 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/security/brig) "aNp" = ( /obj/item/weapon/twohanded/required/kirbyplants{ @@ -16037,8 +16037,8 @@ pixel_x = 0; pixel_y = 32 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/security/brig) "aNr" = ( /obj/effect/spawner/structure/window/reinforced, @@ -16061,10 +16061,10 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/medical/genetics_cloning) "aNv" = ( /obj/machinery/button/door{ @@ -16446,10 +16446,10 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/toxins/lab) "aOv" = ( /obj/structure/table/reinforced, @@ -16475,8 +16475,8 @@ /obj/structure/cable/cyan{ icon_state = "1-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/medical/robotics) "aOy" = ( /obj/machinery/navbeacon{ @@ -16489,10 +16489,10 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel{ name = "floor" }, -/obj/effect/turf_decal/delivery, /area/medical/robotics) "aOz" = ( /obj/structure/cable/cyan{ @@ -16540,8 +16540,8 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aOF" = ( /obj/structure/window/reinforced, @@ -16591,8 +16591,8 @@ /turf/open/floor/plasteel/white, /area/maintenance/asmaint2) "aOP" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aOQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -16724,31 +16724,31 @@ name = "R&D shutter button"; pixel_x = -24 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/toxins/lab) "aPi" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/lab) "aPj" = ( /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/toxins/lab) "aPk" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/turf/open/floor/plasteel/white, /area/toxins/lab) "aPl" = ( /obj/machinery/light{ @@ -16807,10 +16807,10 @@ /turf/open/floor/plasteel, /area/toxins/misc_lab) "aPr" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aPs" = ( /obj/structure/table, @@ -17322,16 +17322,16 @@ /obj/item/clothing/head/cone, /obj/item/clothing/head/cone, /obj/item/clothing/head/cone, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/security/brig) "aQC" = ( /obj/structure/window/reinforced{ dir = 8 }, /obj/machinery/syndicatebomb/training, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/security/brig) "aQD" = ( /obj/machinery/computer/crew, @@ -17404,15 +17404,15 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aQN" = ( /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aQO" = ( /obj/structure/cable/cyan{ @@ -17421,17 +17421,17 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ icon_state = "vent_map" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aQP" = ( /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aQQ" = ( /obj/structure/cable/cyan{ @@ -17516,10 +17516,10 @@ /obj/structure/cable/cyan{ icon_state = "2-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aRa" = ( /obj/machinery/computer/rdconsole/experiment, @@ -17552,8 +17552,8 @@ dir = 4 }, /obj/item/key/security, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/security/brig) "aRf" = ( /obj/structure/table, @@ -17578,16 +17578,16 @@ /turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aRi" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) "aRj" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -17636,19 +17636,19 @@ /obj/structure/cable/cyan{ icon_state = "2-4" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/security/warden) "aRq" = ( /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/security/warden) "aRr" = ( /obj/structure/cable/cyan{ @@ -17657,10 +17657,10 @@ /obj/structure/cable/cyan{ icon_state = "2-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/security/warden) "aRs" = ( /obj/effect/spawner/structure/window/reinforced, @@ -17771,10 +17771,10 @@ icon_state = "manifold"; dir = 8 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aRG" = ( /obj/machinery/portable_atmospherics/canister/oxygen, @@ -17800,10 +17800,10 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aRJ" = ( /obj/structure/cable/cyan{ @@ -17987,10 +17987,10 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel{ name = "floor" }, -/obj/effect/turf_decal/delivery, /area/medical/robotics) "aRU" = ( /obj/machinery/button/door{ @@ -18048,10 +18048,10 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aSc" = ( /obj/structure/girder/reinforced, @@ -18257,10 +18257,10 @@ /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 8 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aSC" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -18279,10 +18279,10 @@ /turf/open/floor/plasteel/black, /area/medical/medbay) "aSE" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aSF" = ( /obj/machinery/door/airlock/glass{ @@ -18374,10 +18374,10 @@ icon_state = "intact"; dir = 8 }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel{ name = "floor" }, -/obj/effect/turf_decal/delivery, /area/medical/robotics) "aSQ" = ( /obj/structure/cable/cyan{ @@ -18435,8 +18435,8 @@ /obj/structure/cable/cyan{ icon_state = "2-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aSY" = ( /obj/structure/table/reinforced, @@ -18449,16 +18449,16 @@ /turf/open/floor/plating, /area/toxins/misc_lab) "aSZ" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aTa" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aTb" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, @@ -18481,8 +18481,8 @@ icon_state = "plant-21"; layer = 4.1 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -18496,10 +18496,10 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -18571,18 +18571,18 @@ /obj/structure/cable/cyan{ icon_state = "1-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/security/warden) "aTo" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/security/warden) "aTp" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/turf/open/floor/plasteel, /area/security/warden) "aTq" = ( /turf/open/floor/plasteel, @@ -18675,33 +18675,33 @@ name = "lightsout" }, /obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aTB" = ( /obj/item/device/radio/beacon, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aTC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ icon_state = "vent_map"; dir = 1 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aTD" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aTE" = ( /obj/structure/cable/cyan{ @@ -18789,10 +18789,10 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aTR" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ @@ -18840,10 +18840,10 @@ /area/maintenance/asmaint2) "aTW" = ( /obj/machinery/light, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/toxins/xenobiology) "aTX" = ( /obj/structure/rack, @@ -18866,8 +18866,8 @@ icon_state = "plant-06"; level = 4.1 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -18876,16 +18876,16 @@ icon_state = "plant-06"; level = 4.1 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, /area/maintenance/fore{ name = "Security Maintenance" }) "aUa" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -18944,10 +18944,10 @@ pixel_y = 5 }, /obj/machinery/light, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/security/warden) "aUh" = ( /obj/machinery/computer/secure_data, @@ -19084,18 +19084,18 @@ /obj/machinery/shieldwallgen{ req_access = null }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aUw" = ( /obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aUx" = ( /obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aUy" = ( /obj/machinery/chem_master, @@ -19114,10 +19114,10 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aUB" = ( /turf/open/floor/plating, @@ -19128,10 +19128,10 @@ name = "blobstart" }, /obj/structure/target_stake, -/turf/open/floor/plasteel{ +/obj/effect/turf_decal/bot{ dir = 2 }, -/obj/effect/turf_decal/bot{ +/turf/open/floor/plasteel{ dir = 2 }, /area/toxins/misc_lab) @@ -19181,8 +19181,8 @@ /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-22" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19196,10 +19196,10 @@ /obj/machinery/autolathe{ name = "maint autolathe" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19215,8 +19215,8 @@ }, /obj/item/device/flashlight, /obj/structure/closet/crate, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19259,13 +19259,13 @@ icon_state = "intact"; dir = 9 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aUS" = ( /obj/structure/window/reinforced, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aUT" = ( /obj/machinery/computer/crew, @@ -19343,8 +19343,8 @@ "aVc" = ( /obj/structure/reagent_dispensers/fueltank, /obj/machinery/light/small, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aVd" = ( /obj/machinery/chem_dispenser/constructable, @@ -19366,10 +19366,10 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aVg" = ( /obj/structure/table/reinforced, @@ -19384,16 +19384,16 @@ /turf/open/floor/plating, /area/toxins/misc_lab) "aVh" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aVi" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aVj" = ( /obj/structure/grille, @@ -19404,8 +19404,8 @@ icon_state = "plant-05"; layer = 4.1 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19537,10 +19537,10 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aVy" = ( /obj/machinery/iv_drip{ @@ -19578,8 +19578,8 @@ icon_state = "plant-02"; layer = 4.1 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19588,8 +19588,8 @@ icon_state = "plant-02"; layer = 4.1 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19616,8 +19616,8 @@ /obj/structure/cable/cyan{ icon_state = "1-4" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19625,8 +19625,8 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19634,10 +19634,10 @@ /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19784,8 +19784,8 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aWe" = ( /obj/machinery/camera/autoname, @@ -19829,17 +19829,17 @@ icon_state = "plant-17"; layer = 4.1 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, /area/maintenance/fore{ name = "Security Maintenance" }) "aWl" = ( /obj/machinery/vending/assist, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19848,8 +19848,8 @@ /obj/item/clothing/gloves/color/fyellow, /obj/item/clothing/gloves/color/fyellow, /obj/item/clothing/gloves/color/fyellow, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -19882,8 +19882,8 @@ /turf/open/floor/plasteel/white, /area/security/warden) "aWq" = ( -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/white, /area/security/warden) "aWr" = ( /obj/machinery/power/apc{ @@ -19967,10 +19967,10 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aWB" = ( /obj/structure/closet/crate/freezer, @@ -20102,10 +20102,10 @@ /obj/structure/cable/cyan{ icon_state = "1-4" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aWQ" = ( /obj/structure/cable/cyan{ @@ -20135,8 +20135,8 @@ /obj/structure/cable/cyan{ icon_state = "1-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aWU" = ( /obj/structure/table, @@ -20220,20 +20220,20 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aXh" = ( /obj/structure/window/reinforced{ dir = 1; pixel_y = 0 }, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/white, /area/medical/medbay) "aXi" = ( /turf/closed/wall/shuttle{ @@ -20297,10 +20297,10 @@ /area/toxins/misc_lab) "aXu" = ( /obj/item/device/multitool, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel, /area/toxins/misc_lab) "aXv" = ( /obj/machinery/light{ @@ -20313,10 +20313,10 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aXx" = ( /obj/machinery/door/airlock/maintenance{ @@ -20395,8 +20395,8 @@ /obj/structure/cable/cyan{ icon_state = "1-4" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -20551,8 +20551,8 @@ name = "Security Maintenance" }) "aXZ" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -20714,10 +20714,10 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aYw" = ( /obj/structure/cable/cyan{ @@ -20741,10 +20741,10 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aYz" = ( /obj/item/clothing/shoes/jackboots, @@ -20869,10 +20869,10 @@ /area/shuttle/arrival) "aYP" = ( /obj/item/clothing/head/cone, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aYQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -20886,8 +20886,8 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aYS" = ( /obj/machinery/navbeacon{ @@ -20901,8 +20901,8 @@ icon_state = "intact"; dir = 4 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "aYT" = ( /obj/structure/closet/cardboard, @@ -21893,10 +21893,10 @@ /area/crew_quarters/fitness) "bbd" = ( /obj/machinery/computer/camera_advanced/xenobio, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/toxins/xenobiology) "bbe" = ( /obj/item/stack/sheet/mineral/plasma{ @@ -22300,8 +22300,8 @@ location = "Arrivals Building Area"; name = "navigation beacon" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "bbV" = ( /obj/machinery/light/small{ @@ -22336,8 +22336,8 @@ }, /obj/item/device/flashlight, /obj/structure/closet/crate, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "bca" = ( /obj/machinery/door/airlock/maintenance{ @@ -22510,10 +22510,10 @@ /turf/open/floor/plating, /area/maintenance/asmaint2) "bcB" = ( -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "bcC" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, @@ -22727,10 +22727,10 @@ name = "Security Maintenance" }) "bdj" = ( +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel{ name = "floor" }, -/obj/effect/turf_decal/delivery, /area/maintenance/fore{ name = "Security Maintenance" }) @@ -22879,10 +22879,10 @@ /area/space) "bdD" = ( /obj/machinery/monkey_recycler, -/turf/open/floor/plasteel/black, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel/black, /area/toxins/xenobiology) "bdE" = ( /obj/effect/landmark/start{ @@ -22891,10 +22891,10 @@ /obj/structure/cable/cyan{ icon_state = "1-2" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plasteel, /area/toxins/xenobiology) "bdF" = ( /obj/machinery/atmospherics/components/binary/valve{ @@ -23036,16 +23036,16 @@ icon_state = "vent_map"; dir = 8 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "bdV" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ icon_state = "manifold"; dir = 8 }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "bdW" = ( /obj/structure/cable/cyan{ @@ -23395,8 +23395,8 @@ "beI" = ( /obj/structure/rack, /obj/item/weapon/gun/energy/e_gun/dragnet, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/security/warden) "beJ" = ( /obj/structure/rack, @@ -23410,8 +23410,8 @@ pixel_y = 5 }, /obj/item/weapon/gun/ballistic/shotgun/riot, -/turf/open/floor/plasteel, /obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, /area/security/warden) "beK" = ( /obj/structure/cable/cyan{ @@ -23491,10 +23491,10 @@ }) "ZyZ" = ( /obj/effect/landmark/xmastree/rdrod, -/turf/open/floor/plasteel/white, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/toxins/lab) "Zza" = ( /turf/open/space, @@ -23887,19 +23887,19 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel{ - tag = "icon-warningcorner" - }, /obj/effect/turf_decal/stripes/line{ dir = 2 }, +/turf/open/floor/plasteel{ + tag = "icon-warningcorner" + }, /area/maintenance/asmaint2) "ZAb" = ( /obj/structure/cable/cyan{ icon_state = "4-8" }, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "ZAc" = ( /obj/structure/table/reinforced, @@ -23908,10 +23908,10 @@ /area/medical/medbay) "ZAd" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/turf/open/floor/plasteel, /area/maintenance/asmaint2) "ZAe" = ( /obj/machinery/droneDispenser, @@ -24035,6 +24035,12 @@ /obj/item/clothing/under/burial, /turf/open/floor/plating, /area/maintenance/asmaint2) +"ZAy" = ( +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/white, +/area/crew_quarters/bar{ + name = "\improper Bar and Kitchen" + }) (1,1,1) = {" aaa @@ -59639,7 +59645,7 @@ aCP aDC aGa aFi -aDC +ZAy aGH aHo avJ diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 59ebb7db51..dee755a4a9 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -29436,6 +29436,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bbq" = ( +/obj/machinery/deepfryer, /mob/living/carbon/monkey/punpun, /turf/open/floor/plasteel/red, /area/crew_quarters/kitchen) @@ -30615,7 +30616,7 @@ "bdC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/valve/open{ - name = "SM coolant loop"; + name = "SM Coolant loop"; open = 0 }, /turf/open/floor/plasteel/vault{ @@ -118363,6 +118364,10 @@ }, /turf/open/floor/wood, /area/crew_quarters/abandoned_gambling_den) +"edb" = ( +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/red, +/area/crew_quarters/kitchen) (1,1,1) = {" aaa @@ -149615,8 +149620,8 @@ ceO cFo cGG ecI -ecM -ecO +ecI +ecI cHW cOI cQy @@ -149814,7 +149819,7 @@ aMs aOb aPG aRu -ect +ecp aUF boy boy @@ -149871,7 +149876,7 @@ cCL ceO cFm cGG -ecJ +ecI cJI cLo cMY @@ -150385,7 +150390,7 @@ cCL ceO cFn cGG -ecK +ecI cJK cLq cNa @@ -150642,9 +150647,9 @@ cCK bZD cFn cGG -ecL -ecN -ecP +ecI +ecI +ecI cHW cOM cQI @@ -155987,7 +155992,7 @@ aGY aGZ aYv aZV -aZU +edb bcD bdZ bfP @@ -156789,8 +156794,8 @@ bWx bYh bZZ ecz -ecC -ecD +ecz +ecz ecE ecG cjC @@ -157819,8 +157824,8 @@ cad cbN cbN cbN -ecF -ecH +ecE +ecG cjG clg cmt @@ -158330,7 +158335,7 @@ bUO bWC bYl cae -ecB +ecA cdH cfh cgx diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 160d13dce2..e4d3fae392 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1,5 +1,5 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -//Model dictionary trimmed on: 31-01-2017 23:17 (UTC) +//Model dictionary trimmed on: 02-02-2017 02:51 (UTC) "aaa" = ( /turf/open/space, /area/space) @@ -3906,6 +3906,8 @@ }, /obj/structure/rack, /obj/item/weapon/storage/fancy/donut_box, +/obj/item/weapon/gun/energy/e_gun/dragnet, +/obj/item/weapon/gun/energy/e_gun/dragnet, /turf/open/floor/plasteel/vault{ dir = 1 }, @@ -40955,8 +40957,6 @@ /obj/item/stack/cable_coil/random, /obj/item/stack/cable_coil/random, /obj/item/stack/cable_coil/random, -/obj/item/weapon/paper_bin/construction, -/obj/item/stack/cable_coil, /turf/open/floor/plasteel, /area/storage/art) "bre" = ( @@ -54885,7 +54885,7 @@ }, /area/crew_quarters/kitchen) "bOV" = ( -/obj/machinery/holopad, +/obj/machinery/deepfryer, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -73083,7 +73083,6 @@ }, /area/crew_quarters/hor) "ctb" = ( -/obj/machinery/computer/aifixer, /obj/structure/window/reinforced{ dir = 4 }, @@ -73095,6 +73094,7 @@ pixel_x = 0; pixel_y = 30 }, +/obj/machinery/modular_computer/console/preset/research, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -94427,6 +94427,23 @@ /obj/structure/disposaloutlet, /turf/open/floor/plating/airless, /area/toxins/xenobiology) +"ddD" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8; + initialize_directions = 11 + }, +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/cafeteria{ + dir = 5 + }, +/area/crew_quarters/kitchen) +"ddE" = ( +/obj/effect/landmark/start{ + name = "Cook" + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) (1,1,1) = {" aaa @@ -126198,7 +126215,7 @@ coe cpq cqJ crP -cta +cuN ctR cuN cvR @@ -128230,7 +128247,7 @@ bHb bMP bKg bLL -bNz +ddD bOT bQC bLK @@ -129002,7 +129019,7 @@ bBT bKj bLN bLK -bOR +ddE bQF bNz bSV diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 535f9515e3..032ee25d95 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -8693,6 +8693,8 @@ pixel_x = -32; pixel_y = 0 }, +/obj/item/weapon/gun/energy/e_gun/dragnet, +/obj/item/weapon/gun/energy/e_gun/dragnet, /turf/open/floor/plasteel/red/corner{ dir = 8 }, @@ -19615,6 +19617,7 @@ tag = "icon-4-8"; icon_state = "4-8" }, +/obj/machinery/deepfryer, /turf/open/floor/plasteel/red, /area/crew_quarters/kitchen) "aFe" = ( @@ -21721,12 +21724,6 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aIi" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4; - filter_type = "plasma"; - name = "plasma filter"; - on = 1 - }, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -21735,6 +21732,11 @@ tag = "" }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/trinary/filter/flipped{ + tag = "icon-filter_off_f (EAST)"; + icon_state = "filter_off_f"; + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/engineering) "aIj" = ( @@ -21782,7 +21784,7 @@ /area/engine/engineering) "aIl" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 4; + dir = 8; name = "Gas to Filter"; on = 1 }, @@ -27106,14 +27108,12 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aQK" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - icon_state = "pump_map"; - name = "Gas to Loop" - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/engineering) "aQL" = ( @@ -27126,13 +27126,12 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aQM" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 - }, -/obj/machinery/meter, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/components/trinary/filter{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/engineering) "aQN" = ( @@ -27178,15 +27177,14 @@ /turf/open/floor/plasteel, /area/engine/engineering) "aQR" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped{ - tag = "icon-filter_off_f (EAST)"; - icon_state = "filter_off_f"; - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/engineering) "aQS" = ( @@ -27568,7 +27566,7 @@ /area/engine/engineering) "aRG" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 1; + dir = 2; name = "Gas to Cooling Loop"; on = 1 }, @@ -27679,7 +27677,7 @@ /area/engine/engineering) "aRQ" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 2; + dir = 1; name = "Gas to Cooling Loop"; on = 1 }, @@ -39231,6 +39229,17 @@ /obj/structure/window/reinforced/fulltile, /turf/open/floor/plating, /area/chapel/main) +"blK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + icon_state = "pump_map"; + name = "Gas to Loop" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) (1,1,1) = {" aaa @@ -71737,7 +71746,7 @@ aMY aOb aOE aLO -aQL +blK aRP aSZ aEt diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index ca42d33a26..9264be651f 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -61215,6 +61215,14 @@ /obj/item/weapon/reagent_containers/blood/random, /turf/open/floor/plasteel, /area/medical/sleeper) +"cCq" = ( +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"cCr" = ( +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) (1,1,1) = {" aaa @@ -99888,7 +99896,7 @@ aRB aSL aTN aVD -aVz +cCq cAg bak bbz @@ -100145,7 +100153,7 @@ aRG aSO aTO aVG -aVz +cCr aVz bak bbz diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 0bd26ec3e8..4424f05436 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -168,8 +168,10 @@ // Used by Paper and PhotoCopier (and PaperBin once a year). // Used by PDA's Notekeeper. // Used by NewsCaster and NewsPaper. +// Used by Modular Computers #define PEN_FONT "Verdana" #define CRAYON_FONT "Comic Sans MS" +#define PRINTER_FONT "Times New Roman" #define SIGNFONT "Times New Roman" #define RESIZE_DEFAULT_SIZE 1 diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 4bbe2e486a..fe19d7a559 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -13,3 +13,6 @@ #define GC_QUEUED_FOR_QUEUING -1 #define GC_QUEUED_FOR_HARD_DEL -2 #define GC_CURRENTLY_BEING_QDELETED -3 + +#define QDELETED(X) (!X || X.gc_destroyed) +#define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 48e085aa51..9b89a666c8 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -20,10 +20,6 @@ if (config.log_admin) diary << "\[[time_stamp()]]ADMIN: [text]" -/proc/log_mentor(text) - mentor_log.Add(text) - diary << "\[[time_stamp()]]MENTOR: [text]" - /proc/log_adminsay(text) if (config.log_adminchat) log_admin("ASAY: [text]") diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 6cc76759c3..46d2625967 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -449,7 +449,7 @@ /proc/pollCandidatesForMob(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, mob/M, ignore_category = null) var/list/L = pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category) - if(!M || qdeleted(M) || !M.loc) + if(!M || QDELETED(M) || !M.loc) return list() return L @@ -458,7 +458,7 @@ var/i=1 for(var/v in mobs) var/atom/A = v - if(!A || qdeleted(A) || !A.loc) + if(!A || QDELETED(A) || !A.loc) mobs.Cut(i,i+1) else ++i diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index cde26bd199..f0c42311b6 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -13,12 +13,6 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f) //socks init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list) - //human mutant bodyparts - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, tails_list_human) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/human, animated_tails_list_human) - init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, ears_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, wings_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open, wings_open_list) //lizard bodyparts (blizzard intensifies) init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, tails_list_lizard) @@ -36,6 +30,13 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, legs_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, r_wings_list,roundstart = TRUE) + //human mutant bodyparts + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, tails_list_human) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/human, animated_tails_list_human) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, ears_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, wings_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open, wings_open_list) + //mammal bodyparts (fucking furries) init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, mam_body_markings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, mam_tails_list) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 483f54b860..ee0f069c92 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -33,11 +33,12 @@ #define N_SOUTHEAST 64 #define N_SOUTHWEST 1024 -#define SMOOTH_FALSE 0 //not smooth -#define SMOOTH_TRUE 1 //smooths with exact specified types or just itself -#define SMOOTH_MORE 2 //smooths with all subtypes of specified types or just itself (this value can replace SMOOTH_TRUE) -#define SMOOTH_DIAGONAL 4 //if atom should smooth diagonally, this should be present in 'smooth' var -#define SMOOTH_BORDER 8 //atom will smooth with the borders of the map +#define SMOOTH_FALSE 0 //not smooth +#define SMOOTH_TRUE 1 //smooths with exact specified types or just itself +#define SMOOTH_MORE 2 //smooths with all subtypes of specified types or just itself (this value can replace SMOOTH_TRUE) +#define SMOOTH_DIAGONAL 4 //if atom should smooth diagonally, this should be present in 'smooth' var +#define SMOOTH_BORDER 8 //atom will smooth with the borders of the map +#define SMOOTH_QUEUED 16 //atom is currently queued to smooth. #define NULLTURF_BORDER 123456789 @@ -110,9 +111,12 @@ //do not use, use queue_smooth(atom) /proc/smooth_icon(atom/A) - if(!A || !A.smooth || !A.z) + if(!A || !A.smooth) return - if(qdeleted(A)) + A.smooth &= ~SMOOTH_QUEUED + if (!A.z) + return + if(QDELETED(A)) return if((A.smooth & SMOOTH_TRUE) || (A.smooth & SMOOTH_MORE)) var/adjacencies = calculate_adjacencies(A) @@ -376,11 +380,13 @@ //SSicon_smooth /proc/queue_smooth(atom/A) - if(SSicon_smooth) - SSicon_smooth.smooth_queue[A] = A - SSicon_smooth.can_fire = 1 - else - smooth_icon(A) + if(!A.smooth || A.smooth & SMOOTH_QUEUED) + return + + SSicon_smooth.smooth_queue += A + SSicon_smooth.can_fire = 1 + A.smooth |= SMOOTH_QUEUED + //Example smooth wall /turf/closed/wall/smooth diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 11afa1a04b..37a6b59522 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -133,7 +133,6 @@ var/list/skin_tones = list( ) var/global/list/species_list[0] -var/global/list/whitelisted_species_list[0] var/global/list/roundstart_species[0] /proc/age2agedescription(age) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index e24724f9c5..c49f6419d1 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -81,14 +81,21 @@ return text //only accepts the text if it has some non-spaces // Used to get a properly sanitized input, of max_length -/proc/stripped_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN) +// no_trim is self explanatory but it prevents the input from being trimed if you intend to parse newlines or whitespace. +/proc/stripped_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN, no_trim=FALSE) var/name = input(user, message, title, default) as text|null - return trim(html_encode(name), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <) + if(no_trim) + return copytext(html_encode(name), 1, max_length) + else + return trim(html_encode(name), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <) // Used to get a properly sanitized multiline input, of max_length -/proc/stripped_multiline_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN) +/proc/stripped_multiline_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN, no_trim=FALSE) var/name = input(user, message, title, default) as message|null - return html_encode(trim(name, max_length)) + if(no_trim) + return copytext(html_encode(name), 1, max_length) + else + return trim(html_encode(name), max_length) //Filters out undesirable characters from names /proc/reject_bad_name(t_in, allow_numbers=0, max_length=MAX_NAME_LEN) diff --git a/code/__HELPERS/text_vr.dm b/code/__HELPERS/text_vr.dm index d613f9b770..20fa1eb49d 100644 --- a/code/__HELPERS/text_vr.dm +++ b/code/__HELPERS/text_vr.dm @@ -16,3 +16,10 @@ proc/TextPreview(var/string,var/len=40) return string else return "[copytext(string, 1, 37)]..." + +var/list/mentor_log = list ( ) +var/list/admintickets = list() +var/global/list/whitelisted_species_list[0] +/proc/log_mentor(text) + mentor_log.Add(text) + diary << "\[[time_stamp()]]MENTOR: [text]" \ No newline at end of file diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 5ef41c5fb4..d64e2162c2 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -916,7 +916,7 @@ var/list/WALLITEMS_INVERSE = typecacheof(list( /proc/IsValidSrc(datum/D) if(istype(D)) - return !qdeleted(D) + return !QDELETED(D) return 0 diff --git a/code/_compile_options.dm b/code/_compile_options.dm index c591269eb4..6f2a0aacf6 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -50,6 +50,10 @@ #warn compiling in TESTING mode. testing() debug messages will be visible. #endif +#ifdef TRAVISTESTING +#define TESTING +#endif + //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 510 #if DM_VERSION < MIN_COMPILER_VERSION diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 68893b7484..348dc6d551 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -4,7 +4,6 @@ var/href_logfile = null var/list/bombers = list( ) var/list/admin_log = list ( ) -var/list/mentor_log = list ( ) var/list/lastsignalers = list( ) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]" var/list/lawchanges = list( ) //Stores who uploaded laws to which silicon-based lifeform, and what the law was @@ -12,6 +11,5 @@ var/list/combatlog = list() var/list/IClog = list() var/list/OOClog = list() var/list/adminlog = list() -var/list/admintickets = list() var/list/active_turfs_startlist = list() diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index d0a3e8f647..b301fab1c3 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -184,4 +184,4 @@ // /mob/living/silicon/ai/TurfAdjacent(var/turf/T) - return (cameranet && cameranet.checkTurfVis(T)) \ No newline at end of file + return (cameranet && cameranet.checkTurfVis(T)) diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 1f8b1c2488..0c5ca7782c 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -10,17 +10,6 @@ var/mob/living/carbon/alien/humanoid/hunter/AH = usr AH.toggle_leap() -/obj/screen/alien/nightvision - name = "toggle night-vision" - icon_state = "nightvision1" - screen_loc = ui_alien_nightvision - -/obj/screen/alien/nightvision/Click() - var/mob/living/carbon/alien/A = usr - var/obj/effect/proc_holder/alien/nightvisiontoggle/T = locate() in A.abilities - if(T) - T.fire(A) - /obj/screen/alien/plasma_display icon = 'icons/mob/screen_gen.dmi' icon_state = "power_display2" @@ -105,9 +94,6 @@ healths = new /obj/screen/healths/alien() infodisplay += healths - nightvisionicon = new /obj/screen/alien/nightvision() - infodisplay += nightvisionicon - alien_plasma_display = new /obj/screen/alien/plasma_display() infodisplay += alien_plasma_display diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 2392e349fe..34d64b1bc7 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -10,9 +10,6 @@ healths = new /obj/screen/healths/alien() infodisplay += healths - nightvisionicon = new /obj/screen/alien/nightvision() - nightvisionicon.screen_loc = ui_alien_nightvision - infodisplay += nightvisionicon alien_queen_finder = new /obj/screen/alien/alien_queen_finder() infodisplay += alien_queen_finder pull_icon = new /obj/screen/pull() diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 546f0a6a02..ac983eb314 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -77,6 +77,8 @@ /datum/hud/ghost/show_hud() var/mob/dead/observer/G = mymob mymob.client.screen = list() + for(var/thing in plane_masters) + mymob.client.screen += plane_masters[thing] create_parallax() if(G.client.prefs.ghost_hud) mymob.client.screen += static_inventory diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 56123031d9..cd1f0799f7 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -200,9 +200,8 @@ if(infodisplay.len) screenmob.client.screen -= infodisplay - if(plane_masters.len) - for(var/thing in plane_masters) - screenmob.client.screen += plane_masters[thing] + for(var/thing in plane_masters) + screenmob.client.screen += plane_masters[thing] hud_version = display_hud_version persistent_inventory_update(screenmob) mymob.update_action_buttons(1) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 4a141df0c5..3c70a0544d 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -98,7 +98,7 @@ var/const/tk_maxrange = 15 /obj/item/tk_grab/attack_self(mob/user) if(!focus) return - if(qdeleted(focus)) + if(QDELETED(focus)) qdel(src) return focus.attack_self_tk(user) diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 67a0281d97..f616218bd2 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -157,6 +157,7 @@ var/time = (world.timeofday - start_timeofday) / 10 var/msg = "Initialized [name] subsystem within [time] seconds!" world << "[msg]" + world.log << msg return time //hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc. diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm index 23b671bf71..254ca8003f 100644 --- a/code/controllers/subsystem/acid.dm +++ b/code/controllers/subsystem/acid.dm @@ -26,7 +26,7 @@ var/datum/subsystem/acid/SSacid while (currentrun.len) var/obj/O = currentrun[currentrun.len] currentrun.len-- - if (!O || qdeleted(O)) + if (!O || QDELETED(O)) processing -= O if (MC_TICK_CHECK) return diff --git a/code/controllers/subsystem/augury.dm b/code/controllers/subsystem/augury.dm index b64d59ebf8..f9035c7252 100644 --- a/code/controllers/subsystem/augury.dm +++ b/code/controllers/subsystem/augury.dm @@ -22,8 +22,9 @@ var/datum/subsystem/augury/SSaugury var/biggest_doom = null var/biggest_threat = null - for(var/d in doombringers) - if(!d || qdeleted(d)) + for(var/db in doombringers) + var/datum/d = db + if(!d || QDELETED(d)) doombringers -= d continue var/threat = doombringers[d] diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 8ec2d00afe..76f68346d7 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -59,17 +59,6 @@ var/datum/subsystem/events/SSevent /datum/subsystem/events/proc/reschedule() scheduled = world.time + rand(frequency_lower, max(frequency_lower,frequency_upper)) - if(world.time > 108000) //2:45 - frequency_lower=1000 - frequency_upper=1500 - //if ((!( ticker ) || emergency_shuttle.location)) - //if(SSshuttle.emergency.mode == SHUTTLE_DOCKED || SSshuttle.emergency.mode == SHUTTLE_CALL) - // return - if(SSshuttle.emergency.mode < SHUTTLE_CALL) - SSshuttle.emergency.request(null, 1.5) - log_game("Round time limit reached. Shuttle has been auto-called.") - message_admins("Round time limit reached. Shuttle called.") - //selects a random event based on whether it can occur and it's 'weight'(probability) /datum/subsystem/events/proc/spawnEvent() if(!config.allow_random_events) @@ -108,7 +97,7 @@ var/datum/subsystem/events/SSevent continue if (E.alertadmins) message_admins("Random Event triggering: [E.name] ([E.typepath])") - deadchat_broadcast("[E.name] has just been randomly triggered!") //STOP ASSUMING IT'S BADMINS! + deadchat_broadcast("[E.name] has just been randomly triggered!") //STOP ASSUMING IT'S BADMINS! log_game("Random Event triggering: [E.name] ([E.typepath])") return diff --git a/code/controllers/subsystem/fire_burning.dm b/code/controllers/subsystem/fire_burning.dm index 2ace744430..0b812f7306 100644 --- a/code/controllers/subsystem/fire_burning.dm +++ b/code/controllers/subsystem/fire_burning.dm @@ -26,7 +26,7 @@ var/datum/subsystem/fire_burning/SSfire_burning while(currentrun.len) var/obj/O = currentrun[currentrun.len] currentrun.len-- - if (!O || qdeleted(O)) + if (!O || QDELETED(O)) processing -= O if (MC_TICK_CHECK) return diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index e05882c6ca..d5b17438de 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -203,22 +203,6 @@ var/datum/subsystem/garbage_collector/SSgarbage else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") -// Returns 1 if the object has been queued for deletion. -/proc/qdeleted(datum/D) - if(!istype(D)) - return FALSE - if(D.gc_destroyed) - return TRUE - return FALSE - -// Returns true if the object's destroy has been called (set just before it is called) -/proc/qdestroying(datum/D) - if(!istype(D)) - return FALSE - if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) - return TRUE - return FALSE - // Default implementation of clean-up code. // This should be overridden to remove all references pointing to the object being destroyed. // Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE. @@ -270,6 +254,7 @@ var/datum/subsystem/garbage_collector/SSgarbage usr.client.running_find_references = type testing("Beginning search for references to a [type].") + find_references_in_globals() for(var/datum/thing in world) if(usr && usr.client && !usr.client.running_find_references) return for(var/varname in thing.vars) @@ -326,4 +311,735 @@ var/datum/subsystem/garbage_collector/SSgarbage dat += "[path] - [tmplist[path]] times
" usr << browse(dat, "window=qdeletedlog") + +#define SearchVar(X) DoSearchVar(X, #X) + +/datum/proc/DoSearchVar(X, Xname) + if(islist(X)) + if(src in X) + testing("Found [src.type] \ref[src] in global list [Xname].") + else if(istype(X, /datum)) + var/datum/D = X + for(var/V in D.vars) + for(var/varname in D.vars) + var/variable = D.vars[varname] + if(variable == src) + testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. Global: [Xname]") + else if(islist(variable) && src in variable) + testing("Found [src.type] \ref[src] in [D.type]'s [varname] list var. Global: [Xname]") + CHECK_TICK + +//if find_references isn't working for some datum +//update this list using tools/DMTreeToGlobalsList +/datum/proc/find_references_in_globals() + SearchVar(last_irc_status) + SearchVar(inerror) + SearchVar(failed_db_connections) + SearchVar(nextmap) + SearchVar(mapchanging) + SearchVar(rebootingpendingmapchange) + SearchVar(clockwork_construction_value) + SearchVar(clockwork_caches) + SearchVar(clockwork_daemons) + SearchVar(clockwork_generals_invoked) + SearchVar(all_clockwork_objects) + SearchVar(all_clockwork_mobs) + SearchVar(clockwork_component_cache) + SearchVar(ratvar_awakens) + SearchVar(clockwork_gateway_activated) + SearchVar(all_scripture) + SearchVar(pointed_types) + SearchVar(bloody_footprints_cache) + SearchVar(ghost_accs_options) + SearchVar(ghost_others_options) + SearchVar(special_roles) + SearchVar(string_cache) + SearchVar(string_filename_current_key) + SearchVar(cmp_field) + SearchVar(friendly_animal_types) + SearchVar(humanoid_icon_cache) + SearchVar(freeze_item_icons) + SearchVar(E) + SearchVar(Sqrt2) + SearchVar(sqrtTable) + SearchVar(gaussian_next) + SearchVar(skin_tones) + SearchVar(species_list) + SearchVar(roundstart_species) + SearchVar(church_name) + SearchVar(command_name) + SearchVar(religion_name) + SearchVar(syndicate_name) + SearchVar(syndicate_code_phrase) + SearchVar(syndicate_code_response) + SearchVar(zero_character_only) + SearchVar(hex_characters) + SearchVar(alphabet) + SearchVar(binary) + SearchVar(can_embed_types) + SearchVar(WALLITEMS) + SearchVar(WALLITEMS_EXTERNAL) + SearchVar(WALLITEMS_INVERSE) + SearchVar(sortInstance) + SearchVar(config) + SearchVar(protected_config) + SearchVar(host) + SearchVar(join_motd) + SearchVar(station_name) + SearchVar(game_version) + SearchVar(changelog_hash) + SearchVar(ooc_allowed) + SearchVar(dooc_allowed) + SearchVar(abandon_allowed) + SearchVar(enter_allowed) + SearchVar(guests_allowed) + SearchVar(shuttle_frozen) + SearchVar(shuttle_left) + SearchVar(tinted_weldhelh) + SearchVar(Debug) + SearchVar(Debug2) + SearchVar(comms_key) + SearchVar(comms_allowed) + SearchVar(cross_address) + SearchVar(cross_allowed) + SearchVar(medal_hub) + SearchVar(medal_pass) + SearchVar(medals_enabled) + SearchVar(MAX_EX_DEVESTATION_RANGE) + SearchVar(MAX_EX_HEAVY_RANGE) + SearchVar(MAX_EX_LIGHT_RANGE) + SearchVar(MAX_EX_FLASH_RANGE) + SearchVar(MAX_EX_FLAME_RANGE) + SearchVar(DYN_EX_SCALE) + SearchVar(sqladdress) + SearchVar(sqlport) + SearchVar(sqlfdbkdb) + SearchVar(sqlfdbklogin) + SearchVar(sqlfdbkpass) + SearchVar(sqlfdbktableprefix) + SearchVar(dbcon) + SearchVar(master_mode) + SearchVar(secret_force_mode) + SearchVar(wavesecret) + SearchVar(start_state) + SearchVar(NEARSIGHTBLOCK) + SearchVar(EPILEPSYBLOCK) + SearchVar(COUGHBLOCK) + SearchVar(TOURETTESBLOCK) + SearchVar(NERVOUSBLOCK) + SearchVar(BLINDBLOCK) + SearchVar(DEAFBLOCK) + SearchVar(HULKBLOCK) + SearchVar(TELEBLOCK) + SearchVar(FIREBLOCK) + SearchVar(XRAYBLOCK) + SearchVar(CLUMSYBLOCK) + SearchVar(STRANGEBLOCK) + SearchVar(RACEBLOCK) + SearchVar(bad_se_blocks) + SearchVar(good_se_blocks) + SearchVar(op_se_blocks) + SearchVar(NULLED_SE) + SearchVar(NULLED_UI) + SearchVar(global_mutations) + SearchVar(bad_mutations) + SearchVar(good_mutations) + SearchVar(not_good_mutations) + SearchVar(diary) + SearchVar(diaryofmeanpeople) + SearchVar(href_logfile) + SearchVar(bombers) + SearchVar(admin_log) + SearchVar(lastsignalers) + SearchVar(lawchanges) + SearchVar(combatlog) + SearchVar(IClog) + SearchVar(OOClog) + SearchVar(adminlog) + SearchVar(active_turfs_startlist) + SearchVar(admin_notice) + SearchVar(timezoneOffset) + SearchVar(fileaccess_timer) + SearchVar(TAB) + SearchVar(map_ready) + SearchVar(data_core) + SearchVar(CELLRATE) + SearchVar(CHARGELEVEL) + SearchVar(powernets) + SearchVar(map_name) + SearchVar(hair_styles_list) + SearchVar(hair_styles_male_list) + SearchVar(hair_styles_female_list) + SearchVar(facial_hair_styles_list) + SearchVar(facial_hair_styles_male_list) + SearchVar(facial_hair_styles_female_list) + SearchVar(underwear_list) + SearchVar(underwear_m) + SearchVar(underwear_f) + SearchVar(undershirt_list) + SearchVar(undershirt_m) + SearchVar(undershirt_f) + SearchVar(socks_list) + SearchVar(body_markings_list) + SearchVar(tails_list_lizard) + SearchVar(animated_tails_list_lizard) + SearchVar(snouts_list) + SearchVar(horns_list) + SearchVar(frills_list) + SearchVar(spines_list) + SearchVar(legs_list) + SearchVar(animated_spines_list) + SearchVar(tails_list_human) + SearchVar(animated_tails_list_human) + SearchVar(ears_list) + SearchVar(wings_list) + SearchVar(wings_open_list) + SearchVar(r_wings_list) + SearchVar(ghost_forms_with_directions_list) + SearchVar(ghost_forms_with_accessories_list) + SearchVar(security_depts_prefs) + SearchVar(backbaglist) + SearchVar(uplink_spawn_loc_list) + SearchVar(female_clothing_icons) + SearchVar(hit_appends) + SearchVar(scarySounds) + SearchVar(TAGGERLOCATIONS) + SearchVar(guitar_notes) + SearchVar(station_prefixes) + SearchVar(station_names) + SearchVar(station_suffixes) + SearchVar(greek_letters) + SearchVar(phonetic_alphabet) + SearchVar(numbers_as_words) + SearchVar(station_numerals) + SearchVar(cardinal) + SearchVar(alldirs) + SearchVar(diagonals) + SearchVar(accessable_z_levels) + SearchVar(global_map) + SearchVar(landmarks_list) + SearchVar(start_landmarks_list) + SearchVar(department_security_spawns) + SearchVar(generic_event_spawns) + SearchVar(monkeystart) + SearchVar(wizardstart) + SearchVar(newplayer_start) + SearchVar(latejoin) + SearchVar(prisonwarp) + SearchVar(holdingfacility) + SearchVar(xeno_spawn) + SearchVar(tdome1) + SearchVar(tdome2) + SearchVar(tdomeobserve) + SearchVar(tdomeadmin) + SearchVar(prisonsecuritywarp) + SearchVar(prisonwarped) + SearchVar(blobstart) + SearchVar(secequipment) + SearchVar(deathsquadspawn) + SearchVar(emergencyresponseteamspawn) + SearchVar(ruin_landmarks) + SearchVar(awaydestinations) + SearchVar(sortedAreas) + SearchVar(map_templates) + SearchVar(ruins_templates) + SearchVar(space_ruins_templates) + SearchVar(lava_ruins_templates) + SearchVar(shuttle_templates) + SearchVar(shelter_templates) + SearchVar(transit_markers) + SearchVar(clients) + SearchVar(admins) + SearchVar(deadmins) + SearchVar(directory) + SearchVar(stealthminID) + SearchVar(current_watchlist) + SearchVar(player_list) + SearchVar(mob_list) + SearchVar(living_mob_list) + SearchVar(dead_mob_list) + SearchVar(joined_player_list) + SearchVar(silicon_mobs) + SearchVar(pai_list) + SearchVar(ai_names) + SearchVar(wizard_first) + SearchVar(wizard_second) + SearchVar(ninja_titles) + SearchVar(ninja_names) + SearchVar(commando_names) + SearchVar(first_names_male) + SearchVar(first_names_female) + SearchVar(last_names) + SearchVar(lizard_names_male) + SearchVar(lizard_names_female) + SearchVar(clown_names) + SearchVar(mime_names) + SearchVar(carp_names) + SearchVar(golem_names) + SearchVar(plasmaman_names) + SearchVar(verbs) + SearchVar(adjectives) + SearchVar(cable_list) + SearchVar(portals) + SearchVar(airlocks) + SearchVar(mechas_list) + SearchVar(shuttle_caller_list) + SearchVar(machines) + SearchVar(syndicate_shuttle_boards) + SearchVar(navbeacons) + SearchVar(teleportbeacons) + SearchVar(deliverybeacons) + SearchVar(deliverybeacontags) + SearchVar(nuke_list) + SearchVar(alarmdisplay) + SearchVar(chemical_reactions_list) + SearchVar(chemical_reagents_list) + SearchVar(materials_list) + SearchVar(tech_list) + SearchVar(surgeries_list) + SearchVar(crafting_recipes) + SearchVar(rcd_list) + SearchVar(apcs_list) + SearchVar(tracked_implants) + SearchVar(tracked_chem_implants) + SearchVar(poi_list) + SearchVar(pinpointer_list) + SearchVar(zombie_infection_list) + SearchVar(meteor_list) + SearchVar(poll_ignore) + SearchVar(typecache_mob) + SearchVar(tk_maxrange) + SearchVar(Failsafe) + SearchVar(Master) + SearchVar(MC_restart_clear) + SearchVar(MC_restart_timeout) + SearchVar(MC_restart_count) + SearchVar(CURRENT_TICKLIMIT) + SearchVar(SSacid) + SearchVar(SSair) + SearchVar(SSasset) + SearchVar(SSaugury) + SearchVar(SScommunications) + SearchVar(SSdisease) + SearchVar(SSevent) + SearchVar(SSfire_burning) + SearchVar(SSgarbage) + SearchVar(SSicon_smooth) + SearchVar(SSipintel) + SearchVar(SSjob) + SearchVar(SSlighting) + SearchVar(SSmachine) + SearchVar(SSmapping) + SearchVar(SSminimap) + SearchVar(SSmob) + SearchVar(SSnpc) + SearchVar(SSorbit) + SearchVar(SSpai) + SearchVar(pai_card_list) + SearchVar(SSparallax) + SearchVar(SSpersistence) + SearchVar(SSping) + SearchVar(SSradio) + SearchVar(SSreligion) + SearchVar(SSserver) + SearchVar(SSshuttle) + SearchVar(SSspacedrift) + SearchVar(SSsqueak) + SearchVar(SSstickyban) + SearchVar(SSsun) + SearchVar(SStgui) + SearchVar(SSthrowing) + SearchVar(round_start_time) + SearchVar(ticker) + SearchVar(SStimer) + SearchVar(SSvote) + SearchVar(SSweather) + SearchVar(SSfastprocess) + SearchVar(SSflightpacks) + SearchVar(SSobj) + SearchVar(SSprocessing) + SearchVar(record_id_num) + SearchVar(emote_list) + SearchVar(huds) + SearchVar(diseases) + SearchVar(archive_diseases) + SearchVar(advance_cures) + SearchVar(list_symptoms) + SearchVar(dictionary_symptoms) + SearchVar(SYMPTOM_ACTIVATION_PROB) + SearchVar(revdata) + SearchVar(all_status_effects) + SearchVar(wire_colors) + SearchVar(wire_color_directory) + SearchVar(wire_name_directory) + SearchVar(possiblethemes) + SearchVar(max_secret_rooms) + SearchVar(blood_splatter_icons) + SearchVar(all_radios) + SearchVar(radiochannels) + SearchVar(radiochannelsreverse) + SearchVar(SYND_FREQ) + SearchVar(SUPP_FREQ) + SearchVar(SERV_FREQ) + SearchVar(SCI_FREQ) + SearchVar(COMM_FREQ) + SearchVar(MED_FREQ) + SearchVar(ENG_FREQ) + SearchVar(SEC_FREQ) + SearchVar(CENTCOM_FREQ) + SearchVar(AIPRIV_FREQ) + SearchVar(RADIO_TO_AIRALARM) + SearchVar(RADIO_FROM_AIRALARM) + SearchVar(RADIO_CHAT) + SearchVar(RADIO_ATMOSIA) + SearchVar(RADIO_NAVBEACONS) + SearchVar(RADIO_AIRLOCK) + SearchVar(RADIO_MAGNETS) + SearchVar(pointers) + SearchVar(freqtospan) + SearchVar(teleportlocs) + SearchVar(the_station_areas) + SearchVar(possible_items) + SearchVar(possible_items_special) + SearchVar(blobs) + SearchVar(blob_cores) + SearchVar(overminds) + SearchVar(blob_nodes) + SearchVar(blobs_legit) + SearchVar(possible_changeling_IDs) + SearchVar(slots) + SearchVar(slot2slot) + SearchVar(slot2type) + SearchVar(hivemind_bank) + SearchVar(blacklisted_pylon_turfs) + SearchVar(non_revealed_runes) + SearchVar(teleport_runes) + SearchVar(wall_runes) + SearchVar(whiteness) + SearchVar(allDevils) + SearchVar(lawlorify) + SearchVar(gang_name_pool) + SearchVar(gang_colors_pool) + SearchVar(borers) + SearchVar(total_borer_hosts_needed) + SearchVar(bomb_set) + SearchVar(hsboxspawn) + SearchVar(multiverse) + SearchVar(announcement_systems) + SearchVar(doppler_arrays) + SearchVar(HOLOPAD_MODE) + SearchVar(holopads) + SearchVar(news_network) + SearchVar(allCasters) + SearchVar(SAFETY_COOLDOWN) + SearchVar(req_console_assistance) + SearchVar(req_console_supplies) + SearchVar(req_console_information) + SearchVar(allConsoles) + SearchVar(time_last_changed_position) + SearchVar(CALL_SHUTTLE_REASON_LENGTH) + SearchVar(crewmonitor) + SearchVar(possible_uplinker_IDs) + SearchVar(airlock_overlays) + SearchVar(pipeID2State) + SearchVar(telecomms_list) + SearchVar(recentmessages) + SearchVar(message_delay) + SearchVar(year) + SearchVar(year_integer) + SearchVar(explosionid) + SearchVar(fire_overlay) + SearchVar(acid_overlay) + SearchVar(BUMP_TELEPORTERS) + SearchVar(contrabandposters) + SearchVar(legitposters) + SearchVar(blacklisted_glowshroom_turfs) + SearchVar(PDAs) + SearchVar(rod_recipes) + SearchVar(glass_recipes) + SearchVar(reinforced_glass_recipes) + SearchVar(human_recipes) + SearchVar(corgi_recipes) + SearchVar(monkey_recipes) + SearchVar(xeno_recipes) + SearchVar(sinew_recipes) + SearchVar(sandstone_recipes) + SearchVar(sandbag_recipes) + SearchVar(diamond_recipes) + SearchVar(uranium_recipes) + SearchVar(plasma_recipes) + SearchVar(gold_recipes) + SearchVar(silver_recipes) + SearchVar(clown_recipes) + SearchVar(titanium_recipes) + SearchVar(plastitanium_recipes) + SearchVar(snow_recipes) + SearchVar(abductor_recipes) + SearchVar(metal_recipes) + SearchVar(plasteel_recipes) + SearchVar(wood_recipes) + SearchVar(cloth_recipes) + SearchVar(cardboard_recipes) + SearchVar(runed_metal_recipes) + SearchVar(brass_recipes) + SearchVar(disposalpipeID2State) + SearchVar(RPD_recipes) + SearchVar(highlander_claymores) + SearchVar(biblenames) + SearchVar(biblestates) + SearchVar(bibleitemstates) + SearchVar(globalBlankCanvases) + SearchVar(crematoriums) + SearchVar(icons_to_ignore_at_floor_init) + SearchVar(js_byjax) + SearchVar(js_dropdowns) + SearchVar(BSACooldown) + SearchVar(admin_ranks) + SearchVar(admin_verbs_default) + SearchVar(admin_verbs_admin) + SearchVar(admin_verbs_ban) + SearchVar(admin_verbs_sounds) + SearchVar(admin_verbs_fun) + SearchVar(admin_verbs_spawn) + SearchVar(admin_verbs_server) + SearchVar(admin_verbs_debug) + SearchVar(admin_verbs_possess) + SearchVar(admin_verbs_permissions) + SearchVar(admin_verbs_rejuv) + SearchVar(admin_verbs_hideable) + SearchVar(create_object_html) + SearchVar(create_object_forms) + SearchVar(admin_datums) + SearchVar(CMinutes) + SearchVar(Banlist) + SearchVar(whitelist) + SearchVar(TYPES_SHORTCUTS) + SearchVar(intercom_range_display_status) + SearchVar(admin_verbs_debug_mapping) + SearchVar(say_disabled) + SearchVar(VVlocked) + SearchVar(VVicon_edit_lock) + SearchVar(VVckey_edit) + SearchVar(VVpixelmovement) + SearchVar(highlander) + SearchVar(admin_sound) + SearchVar(custom_outfits) + SearchVar(meta_gas_info) + SearchVar(gaslist_cache) + SearchVar(hardcoded_gases) + SearchVar(pipenetwarnings) + SearchVar(the_gateway) + SearchVar(potentialRandomZlevels) + SearchVar(maploader) + SearchVar(use_preloader) + SearchVar(_preloader) + SearchVar(swapmaps_iconcache) + SearchVar(SWAPMAPS_SAV) + SearchVar(SWAPMAPS_TEXT) + SearchVar(swapmaps_mode) + SearchVar(swapmaps_compiled_maxx) + SearchVar(swapmaps_compiled_maxy) + SearchVar(swapmaps_compiled_maxz) + SearchVar(swapmaps_initialized) + SearchVar(swapmaps_loaded) + SearchVar(swapmaps_byname) + SearchVar(sc_safecode1) + SearchVar(sc_safecode2) + SearchVar(sc_safecode3) + SearchVar(sc_safecode4) + SearchVar(sc_safecode5) + SearchVar(exports_list) + SearchVar(clientmessages) + SearchVar(preferences_datums) + SearchVar(ghost_forms) + SearchVar(ghost_orbits) + SearchVar(normal_ooc_colour) + SearchVar(damaged_clothes_icons) + SearchVar(emojis) + SearchVar(non_fakeattack_weapons) + SearchVar(cards_against_space) + SearchVar(chem_t1_reagents) + SearchVar(chem_t2_reagents) + SearchVar(chem_t3_reagents) + SearchVar(chem_t4_reagents) + SearchVar(ENGSEC) + SearchVar(CAPTAIN) + SearchVar(HOS) + SearchVar(WARDEN) + SearchVar(DETECTIVE) + SearchVar(OFFICER) + SearchVar(CHIEF) + SearchVar(ENGINEER) + SearchVar(ATMOSTECH) + SearchVar(ROBOTICIST) + SearchVar(AI) + SearchVar(CYBORG) + SearchVar(MEDSCI) + SearchVar(RD) + SearchVar(SCIENTIST) + SearchVar(CHEMIST) + SearchVar(CMO) + SearchVar(DOCTOR) + SearchVar(GENETICIST) + SearchVar(VIROLOGIST) + SearchVar(CIVILIAN) + SearchVar(HOP) + SearchVar(BARTENDER) + SearchVar(BOTANIST) + SearchVar(COOK) + SearchVar(JANITOR) + SearchVar(LIBRARIAN) + SearchVar(QUARTERMASTER) + SearchVar(CARGOTECH) + SearchVar(MINER) + SearchVar(LAWYER) + SearchVar(CHAPLAIN) + SearchVar(CLOWN) + SearchVar(MIME) + SearchVar(ASSISTANT) + SearchVar(assistant_occupations) + SearchVar(command_positions) + SearchVar(engineering_positions) + SearchVar(medical_positions) + SearchVar(science_positions) + SearchVar(supply_positions) + SearchVar(civilian_positions) + SearchVar(security_positions) + SearchVar(nonhuman_positions) + SearchVar(cap_expand) + SearchVar(cmo_expand) + SearchVar(hos_expand) + SearchVar(hop_expand) + SearchVar(rd_expand) + SearchVar(ce_expand) + SearchVar(qm_expand) + SearchVar(sec_expand) + SearchVar(engi_expand) + SearchVar(atmos_expand) + SearchVar(doc_expand) + SearchVar(mine_expand) + SearchVar(chef_expand) + SearchVar(borg_expand) + SearchVar(available_depts) + SearchVar(cachedbooks) + SearchVar(total_extraction_beacons) + SearchVar(next_mob_id) + SearchVar(firstname) + SearchVar(ghost_darkness_images) + SearchVar(ghost_images_full) + SearchVar(ghost_images_default) + SearchVar(ghost_images_simple) + SearchVar(department_radio_keys) + SearchVar(crit_allowed_modes) + SearchVar(ventcrawl_machinery) + SearchVar(posibrain_notif_cooldown) + SearchVar(NO_SLIP_WHEN_WALKING) + SearchVar(SLIDE) + SearchVar(GALOSHES_DONT_HELP) + SearchVar(SLIDE_ICE) + SearchVar(limb_icon_cache) + SearchVar(ALIEN_AFK_BRACKET) + SearchVar(MIN_IMPREGNATION_TIME) + SearchVar(MAX_IMPREGNATION_TIME) + SearchVar(MIN_ACTIVE_TIME) + SearchVar(MAX_ACTIVE_TIME) + SearchVar(default_martial_art) + SearchVar(plasmaman_on_fire) + SearchVar(ai_list) + SearchVar(announcing_vox) + SearchVar(VOX_CHANNEL) + SearchVar(VOX_DELAY) + SearchVar(vox_sounds) + SearchVar(CHUNK_SIZE) + SearchVar(cameranet) + SearchVar(mulebot_count) + SearchVar(MAX_CHICKENS) + SearchVar(chicken_count) + SearchVar(parasites) + SearchVar(protected_objects) + SearchVar(AISwarmers) + SearchVar(AISwarmersByType) + SearchVar(AISwarmerCapsByType) + SearchVar(slime_colours) + SearchVar(global_modular_computers) + SearchVar(file_uid) + SearchVar(nttransfer_uid) + SearchVar(ntnet_card_uid) + SearchVar(ntnet_global) + SearchVar(ntnrc_uid) + SearchVar(employmentCabinets) + SearchVar(cable_coil_recipes) + SearchVar(gravity_generators) + SearchVar(POWER_IDLE) + SearchVar(POWER_UP) + SearchVar(POWER_DOWN) + SearchVar(GRAV_NEEDS_SCREWDRIVER) + SearchVar(GRAV_NEEDS_WELDING) + SearchVar(GRAV_NEEDS_PLASTEEL) + SearchVar(GRAV_NEEDS_WRENCH) + SearchVar(rad_collectors) + SearchVar(blacklisted_tesla_types) + SearchVar(TOUCH) + SearchVar(INGEST) + SearchVar(VAPOR) + SearchVar(PATCH) + SearchVar(INJECT) + SearchVar(chemical_mob_spawn_meancritters) + SearchVar(chemical_mob_spawn_nicecritters) + SearchVar(message_servers) + SearchVar(blackbox) + SearchVar(keycard_events) + SearchVar(blacklisted_cargo_types) + SearchVar(z_levels_list) + SearchVar(spells) + SearchVar(non_simple_animals) + SearchVar(FrozenAccounts) + SearchVar(stockExchange) + SearchVar(stun_words) + SearchVar(weaken_words) + SearchVar(sleep_words) + SearchVar(vomit_words) + SearchVar(silence_words) + SearchVar(hallucinate_words) + SearchVar(wakeup_words) + SearchVar(heal_words) + SearchVar(hurt_words) + SearchVar(bleed_words) + SearchVar(burn_words) + SearchVar(hot_words) + SearchVar(cold_words) + SearchVar(repulse_words) + SearchVar(attract_words) + SearchVar(whoareyou_words) + SearchVar(saymyname_words) + SearchVar(knockknock_words) + SearchVar(statelaws_words) + SearchVar(move_words) + SearchVar(left_words) + SearchVar(right_words) + SearchVar(up_words) + SearchVar(down_words) + SearchVar(walk_words) + SearchVar(run_words) + SearchVar(helpintent_words) + SearchVar(disarmintent_words) + SearchVar(grabintent_words) + SearchVar(harmintent_words) + SearchVar(throwmode_words) + SearchVar(flip_words) + SearchVar(speak_words) + SearchVar(rest_words) + SearchVar(getup_words) + SearchVar(sit_words) + SearchVar(stand_words) + SearchVar(dance_words) + SearchVar(jump_words) + SearchVar(salute_words) + SearchVar(deathgasp_words) + SearchVar(clap_words) + SearchVar(honk_words) + SearchVar(multispin_words) + SearchVar(GPS_list) + SearchVar(uplinks) + SearchVar(uplink_items) #endif diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 70dfe4d2eb..371c926c4f 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -57,7 +57,7 @@ var/datum/subsystem/mapping/SSmapping /datum/subsystem/mapping/proc/check_nuke_threats() for(var/datum/d in nuke_threats) - if(!istype(d) || qdeleted(d)) + if(!istype(d) || QDELETED(d)) nuke_threats -= d var/threats = nuke_threats.len diff --git a/code/controllers/subsystem/minimap.dm b/code/controllers/subsystem/minimap.dm index 1687cb1b2b..6170185ced 100644 --- a/code/controllers/subsystem/minimap.dm +++ b/code/controllers/subsystem/minimap.dm @@ -28,7 +28,6 @@ var/datum/subsystem/minimap/SSminimap world << "Minimap generation disabled. Loading from cache..." var/fileloc = 0 if(check_files(0)) //Let's first check if we have maps cached in the data folder. NOTE: This will override the backup files even if this map is older. - world.log << "cache" if(hash != trim(file2text(hash_path()))) world << "Loaded cached minimap is outdated. There may be minor discrepancies in layout." //Disclaimer against players saying map is wrong. fileloc = 0 diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 479b29ee32..5181ba6772 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -105,7 +105,7 @@ var/datum/subsystem/persistence/SSpersistence /datum/subsystem/persistence/proc/CollectSecretSatchels() for(var/A in new_secret_satchels) var/obj/item/weapon/storage/backpack/satchel/flat/F = A - if(qdeleted(F) || F.z != ZLEVEL_STATION || F.invisibility != INVISIBILITY_MAXIMUM) + if(QDELETED(F) || F.z != ZLEVEL_STATION || F.invisibility != INVISIBILITY_MAXIMUM) continue var/list/savable_obj = list() for(var/obj/O in F) diff --git a/code/controllers/subsystem/processing/objects.dm b/code/controllers/subsystem/processing/objects.dm index 5dcdd353fc..d29819b294 100644 --- a/code/controllers/subsystem/processing/objects.dm +++ b/code/controllers/subsystem/processing/objects.dm @@ -4,12 +4,6 @@ var/datum/subsystem/objects/SSobj #define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE) #define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE) -/datum/var/isprocessing = 0 -/datum/proc/process() - set waitfor = 0 - STOP_PROCESSING(SSobj, src) - return 0 - /datum/subsystem/objects name = "Objects" init_order = 12 diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index 92540ba442..1b8e152561 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -32,3 +32,9 @@ var/datum/subsystem/processing/SSprocessing processing -= thing if (MC_TICK_CHECK) return + +/datum/var/isprocessing = 0 +/datum/proc/process() + set waitfor = 0 + STOP_PROCESSING(SSobj, src) + return 0 \ No newline at end of file diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index bf934dc242..366a180cb1 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -284,7 +284,7 @@ var/datum/subsystem/shuttle/SSshuttle /datum/subsystem/shuttle/proc/checkHostileEnvironment() for(var/datum/d in hostileEnvironments) - if(!istype(d) || qdeleted(d)) + if(!istype(d) || QDELETED(d)) hostileEnvironments -= d emergencyNoEscape = hostileEnvironments.len diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index fdfddca23a..c1034285b1 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -51,10 +51,10 @@ var/datum/subsystem/ticker/ticker var/maprotatechecked = 0 - var/modevoted = 0 //Have we sent a vote for the gamemode? - var/news_report + var/modevoted = 0 //Have we sent a vote for the gamemode? + /datum/subsystem/ticker/New() NEW_SS_GLOBAL(ticker) @@ -122,13 +122,6 @@ var/datum/subsystem/ticker/ticker current_state = GAME_STATE_FINISHED toggle_ooc(1) // Turn it on declare_completion(force_ending) - addtimer(CALLBACK(src, .proc/NukeCleanup), 50) - -/datum/subsystem/ticker/proc/NukeCleanup() - if(mode.station_was_nuked) - world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") - else - world.Reboot("Round ended.", "end_proper", "proper completion") /datum/subsystem/ticker/proc/setup() //Create and announce mode @@ -391,6 +384,7 @@ var/datum/subsystem/ticker/ticker /datum/subsystem/ticker/proc/declare_completion() + set waitfor = FALSE var/station_evacuated = EMERGENCY_ESCAPED_OR_ENDGAMED var/num_survivors = 0 var/num_escapees = 0 @@ -419,6 +413,8 @@ var/datum/subsystem/ticker/ticker else Player << "You did not survive the events on [station_name()]..." + CHECK_TICK + //Round statistics report var/datum/station_state/end_state = new /datum/station_state() end_state.count() @@ -440,6 +436,8 @@ var/datum/subsystem/ticker/ticker world << "
[TAB]Survival Rate: [num_survivors] ([PERCENT(num_survivors/total_players)]%)" world << "
" + CHECK_TICK + //Silicon laws report for (var/mob/living/silicon/ai/aiPlayer in mob_list) if (aiPlayer.stat != 2 && aiPlayer.mind) @@ -457,6 +455,9 @@ var/datum/subsystem/ticker/ticker if(robo.mind) robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.mind.key]), ":" (Played by: [robo.mind.key]), "]" world << "[robolist]" + + CHECK_TICK + for (var/mob/living/silicon/robot/robo in mob_list) if (!robo.connected_ai && robo.mind) if (robo.stat != 2) @@ -467,16 +468,24 @@ var/datum/subsystem/ticker/ticker if(robo) //How the hell do we lose robo between here and the world messages directly above this? robo.laws.show_laws(world) + CHECK_TICK + mode.declare_completion()//To declare normal completion. + CHECK_TICK + //calls auto_declare_completion_* for all modes for(var/handler in typesof(/datum/game_mode/proc)) if (findtext("[handler]","auto_declare_completion_")) call(mode, handler)(force_ending) + CHECK_TICK + if(cross_allowed) send_news_report() + CHECK_TICK + //Print a list of antagonists to the server log var/list/total_antagonists = list() //Look into all mobs in world, dead or alive @@ -489,11 +498,15 @@ var/datum/subsystem/ticker/ticker total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob total_antagonists[temprole] += ": [Mind.name]([Mind.key])" + CHECK_TICK + //Now print them all into the log! log_game("Antagonists at round end were...") for(var/i in total_antagonists) log_game("[i]s[total_antagonists[i]].") + CHECK_TICK + //Borers var/borerwin = FALSE if(borers.len) @@ -529,8 +542,12 @@ var/datum/subsystem/ticker/ticker else world << "The borers have failed!" + CHECK_TICK + mode.declare_station_goal_completion() + CHECK_TICK + //Adds the del() log to world.log in a format condensable by the runtime condenser found in tools if(SSgarbage.didntgc.len) var/dellog = "" @@ -539,9 +556,16 @@ var/datum/subsystem/ticker/ticker dellog += "Failures : [SSgarbage.didntgc[path]] \n" world.log << dellog + CHECK_TICK + //Collects persistence features SSpersistence.CollectData() - return 1 + + sleep(50) + if(mode.station_was_nuked) + world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") + else + world.Reboot("Round ended.", "end_proper", "proper completion") /datum/subsystem/ticker/proc/send_tip_of_the_round() var/m @@ -639,6 +663,7 @@ var/datum/subsystem/ticker/ticker modevoted = ticker.modevoted + /datum/subsystem/ticker/proc/send_news_report() var/news_message var/news_source = "Nanotrasen News Network" diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 23ce1bf95a..91f7dd5b55 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -84,7 +84,7 @@ var/datum/subsystem/timer/SStimer if (!callBack) qdel(timer) bucket_resolution = null //force bucket recreation - CRASH("Invalid timer: timer.timeToRun=[timer.timeToRun]||qdeleted(timer)=[qdeleted(timer)]||world.time=[world.time]||head_offset=[head_offset]||practical_offset=[practical_offset]||timer.spent=[timer.spent]") + CRASH("Invalid timer: timer.timeToRun=[timer.timeToRun]||QDELETED(timer)=[QDELETED(timer)]||world.time=[world.time]||head_offset=[head_offset]||practical_offset=[practical_offset]||timer.spent=[timer.spent]") if (!timer.spent) spent += timer @@ -294,9 +294,7 @@ proc/addtimer(datum/callback/callback, wait, flags) if (!callback) return - if (wait <= 0) - callback.InvokeAsync() - return + wait = max(wait, 0) var/hash @@ -307,12 +305,17 @@ proc/addtimer(datum/callback/callback, wait, flags) var/datum/timedevent/hash_timer = SStimer.hashes[hash] if(hash_timer) - if (flags & TIMER_OVERRIDE) - qdel(hash_timer) + if (hash_timer.spent) //it's pending deletion, pretend it doesn't exist. + hash_timer.hash = null + SStimer.hashes -= hash else - if (hash_timer.flags & TIMER_STOPPABLE) - . = hash_timer.id - return + + if (flags & TIMER_OVERRIDE) + qdel(hash_timer) + else + if (hash_timer.flags & TIMER_STOPPABLE) + . = hash_timer.id + return var/timeToRun = world.time + wait diff --git a/code/controllers/subsystem/voting.dm b/code/controllers/subsystem/voting.dm index c19d5e35f1..518fe362b7 100644 --- a/code/controllers/subsystem/voting.dm +++ b/code/controllers/subsystem/voting.dm @@ -301,7 +301,7 @@ var/datum/subsystem/vote/SSvote /datum/subsystem/vote/proc/remove_action_buttons() for(var/v in generated_actions) var/datum/action/vote/V = v - if(!qdeleted(V)) + if(!QDELETED(V)) V.Remove(V.owner) generated_actions = list() diff --git a/code/datums/action.dm b/code/datums/action.dm index 3e6374f1bc..265de32b07 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -49,8 +49,6 @@ Remove(owner) /datum/action/proc/Remove(mob/M) - if(!M) - return if(M) if(M.client) M.client.screen -= button diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm index f45dd509d4..25aa2d3960 100644 --- a/code/datums/antagonists/datum_clockcult.dm +++ b/code/datums/antagonists/datum_clockcult.dm @@ -73,7 +73,10 @@ R.module.rebuild_modules() else if(isAI(S)) var/mob/living/silicon/ai/A = S + A.can_be_carded = FALSE A.requires_power = POWER_REQ_CLOCKCULT + A.languages_spoken &= ~HUMAN + A.add_atom_colour(list("#B18B25", "#92661A", "#6D370F", rgb(0,0,0)), ADMIN_COLOUR_PRIORITY) if(!A.lacks_power()) A.ai_restore_power() if(A.eyeobj) @@ -122,7 +125,10 @@ var/mob/living/silicon/S = owner if(isAI(S)) var/mob/living/silicon/ai/A = S + A.can_be_carded = initial(A.can_be_carded) A.requires_power = initial(A.requires_power) + A.languages_spoken |= HUMAN + A.remove_atom_colour(ADMIN_COLOUR_PRIORITY, list("#B18B25", "#92661A", "#6D370F", rgb(0,0,0))) S.make_laws() S.update_icons() S.show_laws() diff --git a/code/datums/beam.dm b/code/datums/beam.dm index fd4e445ded..828a9dc774 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -43,7 +43,7 @@ Reset() Draw() sleep(sleep_time) - if(!qdeleted(src)) + if(!QDELETED(src)) qdel(src) diff --git a/code/datums/forced_movement.dm b/code/datums/forced_movement.dm index 6e841a0f9b..1d2795b402 100644 --- a/code/datums/forced_movement.dm +++ b/code/datums/forced_movement.dm @@ -35,7 +35,7 @@ return ..() /datum/forced_movement/process() - if(qdeleted(victim) || !victim.loc || qdeleted(target) || !target.loc) + if(QDELETED(victim) || !victim.loc || QDELETED(target) || !target.loc) qdel(src) return var/steps_to_take = round(steps_per_tick * (world.time - last_processed)) diff --git a/code/datums/riding.dm b/code/datums/riding.dm index ec6db9deb9..9695dbae12 100644 --- a/code/datums/riding.dm +++ b/code/datums/riding.dm @@ -43,7 +43,7 @@ buckled_mob.pixel_x = 0 buckled_mob.pixel_y = 0 if(buckled_mob.client) - buckled_mob.client.view = world.view + buckled_mob.client.change_view(world.view) diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 8f3d22c4be..f41dcfb444 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -2,7 +2,7 @@ /datum/status_effect/shadow_mend id = "shadow_mend" - duration = 3 + duration = 30 alert_type = /obj/screen/alert/status_effect/shadow_mend /obj/screen/alert/status_effect/shadow_mend @@ -26,8 +26,8 @@ /datum/status_effect/void_price id = "void_price" - duration = 30 - tick_interval = 3 + duration = 300 + tick_interval = 30 alert_type = /obj/screen/alert/status_effect/void_price /obj/screen/alert/status_effect/void_price @@ -40,11 +40,12 @@ owner.adjustBruteLoss(3) - /datum/status_effect/vanguard_shield id = "vanguard" - duration = 20 + duration = 200 + tick_interval = 0 //tick as fast as possible alert_type = /obj/screen/alert/status_effect/vanguard + var/datum/progressbar/progbar /obj/screen/alert/status_effect/vanguard name = "Vanguard" @@ -60,10 +61,21 @@ desc += "
[vanguard["stuns_absorbed"] * 2] seconds of stuns held back.
[round(min(vanguard["stuns_absorbed"] * 0.25, 20)) * 2] seconds of stun will affect you." ..() +/datum/status_effect/vanguard_shield/Destroy() + qdel(progbar) + progbar = null + return ..() + /datum/status_effect/vanguard_shield/on_apply() add_logs(owner, null, "gained Vanguard stun immunity") owner.add_stun_absorption("vanguard", 200, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " radiating with a soft yellow light!") owner.visible_message("[owner] begins to faintly glow!", "You will absorb all stuns for the next twenty seconds.") + progbar = new(owner, duration, owner) + progbar.bar.color = list("#FAE48C", "#FAE48C", "#FAE48C", rgb(0,0,0)) + progbar.update(duration - world.time) + +/datum/status_effect/vanguard_shield/tick() + progbar.update(duration - world.time) /datum/status_effect/vanguard_shield/on_remove() var/vanguard = owner.stun_absorption["vanguard"] @@ -85,14 +97,15 @@ message_to_owner += "\nYou faint from the exertion!" stuns_blocked *= 2 owner.Paralyse(stuns_blocked) + else + stuns_blocked = 0 //so logging is correct in cases where there were stuns blocked but we didn't stun for other reasons owner.visible_message("[owner]'s glowing aura fades!", message_to_owner) - add_logs(owner, null, "lost Vanguard stun immunity[stuns_blocked ? "and been stunned for [stuns_blocked]":""]") - + add_logs(owner, null, "lost Vanguard stun immunity[stuns_blocked ? "and was stunned for [stuns_blocked]":""]") /datum/status_effect/inathneqs_endowment id = "inathneqs_endowment" - duration = 15 + duration = 150 alert_type = /obj/screen/alert/status_effect/inathneqs_endowment /obj/screen/alert/status_effect/inathneqs_endowment @@ -119,9 +132,10 @@ owner.status_flags &= ~GODMODE playsound(owner, 'sound/magic/Ethereal_Exit.ogg', 50, 1) + /datum/status_effect/cyborg_power_regen id = "power_regen" - duration = 10 + duration = 100 alert_type = /obj/screen/alert/status_effect/power_regen var/power_to_give = 0 //how much power is gained each tick diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index 53a8bb485f..c87b24ab35 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -1,6 +1,6 @@ /datum/status_effect/freon id = "frozen" - duration = 10 + duration = 100 unique = TRUE alert_type = /obj/screen/alert/status_effect/freon var/icon/cube diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 7db345d801..38f3de0b24 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -6,10 +6,9 @@ var/global/list/all_status_effects = list() //a list of all status effects, if f /datum/status_effect var/id = "effect" //Used for screen alerts. - var/duration = -1 //How long the status effect lasts in SECONDS. Enter -1 for an effect that never ends unless removed through some means. - var/tick_interval = 1 //How many seconds between ticks. Leave at 1 for every second. + var/duration = -1 //How long the status effect lasts in DECISECONDS. Enter -1 for an effect that never ends unless removed through some means. + var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second. var/mob/living/owner //The mob affected by the status effect. - var/cosmetic = FALSE //If the status effect only exists for flavor. var/unique = TRUE //If there can be multiple status effects of this type on one mob. var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description @@ -22,7 +21,7 @@ var/global/list/all_status_effects = list() //a list of all status effects, if f addtimer(CALLBACK(src, .proc/start_ticking), 1) //Give us time to set any variables /datum/status_effect/Destroy() - STOP_PROCESSING(SSprocessing, src) + STOP_PROCESSING(SSfastprocess, src) if(owner) owner.clear_alert(id) on_remove() @@ -37,22 +36,22 @@ var/global/list/all_status_effects = list() //a list of all status effects, if f qdel(src) return on_apply() + if(duration != -1) + duration = world.time + initial(duration) + tick_interval = world.time + initial(tick_interval) if(alert_type) var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) A.attached_effect = src //so the alert can reference us, if it needs to - START_PROCESSING(SSprocessing, src) + START_PROCESSING(SSfastprocess, src) /datum/status_effect/process() if(!owner) qdel(src) return - if(duration != -1) - duration-- - tick_interval-- - if(!tick_interval) + if(tick_interval < world.time) tick() - tick_interval = initial(tick_interval) - if(!duration) + tick_interval = world.time + initial(tick_interval) + if(duration != -1 && duration < world.time) qdel(src) /datum/status_effect/proc/on_apply() //Called whenever the buff is applied. diff --git a/code/game/atoms.dm b/code/game/atoms.dm index a07bc9969e..b7289f58b4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -440,8 +440,10 @@ var/list/blood_splatter_icons = list() //This base must be called or derivatives must set initialized to TRUE to prevent repeat calls //Derivatives must not sleep /atom/proc/Initialize(mapload) +#ifdef TESTING if(initialized) stack_trace("Warning: [src]([type]) initialized multiple times!") +#endif initialized = TRUE //the vision impairment to give to the mob whose perspective is set to that atom (e.g. an unfocused camera giving you an impaired vision when looking through it) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 58a35547bb..9aaf355e74 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -130,7 +130,7 @@ throwing = 0 throw_impact(A) . = 1 - if(!A || qdeleted(A)) + if(!A || QDELETED(A)) return A.Bumped(src) @@ -139,21 +139,29 @@ if(destination) if(pulledby) pulledby.stop_pulling() + var/atom/oldloc = loc - var/same_loc = oldloc == destination.loc - if(oldloc && !same_loc) - oldloc.Exited(src, destination) - loc = destination - if(!same_loc) - destination.Entered(src, oldloc) + var/same_loc = oldloc == destination var/area/old_area = get_area(oldloc) var/area/destarea = get_area(destination) - if(old_area != destarea) - destarea.Entered(src) + + if(oldloc && !same_loc) + oldloc.Exited(src, destination) + if(old_area) + old_area.Exited(src, destination) + + loc = destination + + if(!same_loc) + destination.Entered(src, oldloc) + if(destarea && old_area != destarea) + destarea.Entered(src, oldloc) + for(var/atom/movable/AM in destination) if(AM == src) continue AM.Crossed(src) + Moved(oldloc, 0) return 1 return 0 @@ -408,4 +416,4 @@ if(ex_id in acted_explosions) return FALSE acted_explosions += ex_id - return TRUE \ No newline at end of file + return TRUE diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 2bc1f1bb12..8479a75683 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -60,7 +60,7 @@ overmind.update_health_hud() /obj/structure/blob/core/Life() - if(qdeleted(src)) + if(QDELETED(src)) return if(!overmind) create_overmind() diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 0d7d90a606..bc8424ceb9 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -76,7 +76,7 @@ //used in /mob/Stat() /obj/effect/proc_holder/changeling/proc/can_be_used_by(mob/user) - if(!user || qdeleted(user)) + if(!user || QDELETED(user)) return 0 if(!ishuman(user) && !ismonkey(user)) return 0 diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index 1644c4325d..eb1f6626c0 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -12,54 +12,25 @@ /obj/effect/proc_holder/changeling/augmented_eyesight/sting_action(mob/living/carbon/human/user) if(!istype(user)) return - if(user.getorgan(/obj/item/organ/cyberimp/eyes/thermals/ling)) - user << "Our eyes are protected from flashes." - var/obj/item/organ/cyberimp/eyes/O = new /obj/item/organ/cyberimp/eyes/shield/ling() - O.Insert(user) - + var/obj/item/organ/eyes/E = user.getorganslot("eye_sight") + if(E) + if(E.flash_protect) + E.sight_flags |= SEE_MOBS + E.flash_protect = -1 + user << "We adjust our eyes to sense prey through walls." + else + E.sight_flags -= SEE_MOBS + E.flash_protect = 2 + user << "We adjust our eyes to protect them from bright lights." else - var/obj/item/organ/cyberimp/eyes/O = new /obj/item/organ/cyberimp/eyes/thermals/ling() - O.Insert(user) + user << "We can't adjust our eyes if we don't have any!" + + return 1 /obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) - var/obj/item/organ/cyberimp/eyes/O = user.getorganslot("eye_ling") - if(O) - O.Remove(user) - qdel(O) - - -/obj/item/organ/cyberimp/eyes/shield/ling - name = "protective membranes" - desc = "These variable transparency organic membranes will protect you from welders and flashes and heal your eye damage." - icon_state = "ling_eyeshield" - eye_color = null - implant_overlay = null - slot = "eye_ling" - status = ORGAN_ORGANIC - -/obj/item/organ/cyberimp/eyes/shield/ling/on_life() - ..() - if(owner.eye_blind>1 || (owner.eye_blind && owner.stat !=UNCONSCIOUS) || owner.eye_damage || owner.eye_blurry || (owner.disabilities & NEARSIGHT)) - owner.reagents.add_reagent("oculine", 1) - -/obj/item/organ/cyberimp/eyes/shield/ling/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent("oculine", 15) - return S - - -/obj/item/organ/cyberimp/eyes/thermals/ling - name = "heat receptors" - desc = "These heat receptors dramatically increases eyes light sensing ability." - icon_state = "ling_thermal" - eye_color = null - implant_overlay = null - slot = "eye_ling" - status = ORGAN_ORGANIC - aug_message = "You feel a minute twitch in our eyes, and darkness creeps away." - -/obj/item/organ/cyberimp/eyes/thermals/ling/emp_act(severity) - return + var/obj/item/organ/eyes/E = user.getorganslot("eye_sight") + if(E) + E.sight_flags -= SEE_MOBS \ No newline at end of file diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 0c2816e5a7..693f74d871 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -180,7 +180,7 @@ Credit where due: if(slot == "At your feet") if(!S.forceMove(get_turf(L))) qdel(S) - if(S && !qdeleted(S)) + if(S && !QDELETED(S)) L << "[slot] is a link to the halls of Reebe and your master. You may use it to perform many tasks, but also become oriented with the workings of Ratvar and how to best complete your \ tasks. This clockwork slab will be instrumental in your triumph. Remember: you can speak discreetly with your fellow servants by using the Hierophant Network action button, \ and you can find a concise tutorial by using the slab in-hand and selecting Recollection." diff --git a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm index 46940eb421..a77580b2f9 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm @@ -47,7 +47,7 @@ return FALSE /turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) - if(locate(/obj/structure/table) in loc) + if(locate(/obj/structure/table) in src) return FALSE if(is_blocked_turf(src, TRUE)) user << "Something is in the way, preventing you from proselytizing [src] into a clockwork wall." diff --git a/code/game/gamemodes/clock_cult/clock_helpers/ratvarian_language.dm b/code/game/gamemodes/clock_cult/clock_helpers/ratvarian_language.dm index 8bdd607b79..5abcaad734 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/ratvarian_language.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/ratvarian_language.dm @@ -66,7 +66,12 @@ List of nuances: #define REVERSE_RATVAR_HYPHEN_OF_REPLACEMENT " $1" -/proc/text2ratvar(text) //Takes english and applies ratvarian styling rules (and rot13) to it +/proc/text2ratvar(text) //Takes english and applies ratvarian styling rules (and rot13) to it. + var/ratvarian = add_ratvarian_regex(text) //run the regexes twice, so that you catch people translating it beforehand + ratvarian = rot13(ratvarian) + return add_ratvarian_regex(ratvarian) + +/proc/add_ratvarian_regex(text) var/ratvarian = replacetext(text, RATVAR_OF_MATCH, RATVAR_OF_REPLACEMENT) ratvarian = replacetext(ratvarian, RATVAR_GUA_MATCH, RATVAR_GUA_REPLACEMENT) ratvarian = replacetext(ratvarian, RATVAR_TH_MATCH, RATVAR_TH_REPLACEMENT) @@ -76,19 +81,21 @@ List of nuances: ratvarian = replacetext(ratvarian, RATVAR_PRE_AND_MATCH, RATVAR_PRE_AND_REPLACEMENT) ratvarian = replacetext(ratvarian, RATVAR_POST_AND_MATCH, RATVAR_POST_AND_REPLACEMENT) ratvarian = replacetext(ratvarian, RATVAR_TO_MATCH, RATVAR_TO_REPLACEMENT) - ratvarian = replacetext(ratvarian, RATVAR_MY_MATCH, RATVAR_MY_REPLACEMENT) - return rot13(ratvarian) + return replacetext(ratvarian, RATVAR_MY_MATCH, RATVAR_MY_REPLACEMENT) /proc/ratvar2text(ratvarian) //Reverts ravarian styling and rot13 in text. - var/text = replacetext(rot13(ratvarian), "`", "") - text = replacetext(text, REVERSE_RATVAR_HYPHEN_GUA_MATCH, REVERSE_RATVAR_HYPHEN_GUA_REPLACEMENT) + var/text = remove_ratvarian_regex(ratvarian) //run the regexes twice, so that you catch people translating it beforehand + text = replacetext(rot13(text), "`", "") + return remove_ratvarian_regex(text) + +/proc/remove_ratvarian_regex(ratvarian) + var/text = replacetext(ratvarian, REVERSE_RATVAR_HYPHEN_GUA_MATCH, REVERSE_RATVAR_HYPHEN_GUA_REPLACEMENT) text = replacetext(text, REVERSE_RATVAR_HYPHEN_PRE_AND_MATCH, REVERSE_RATVAR_HYPHEN_PRE_AND_REPLACEMENT) text = replacetext(text, REVERSE_RATVAR_HYPHEN_POST_AND_MATCH, REVERSE_RATVAR_HYPHEN_POST_AND_REPLACEMENT) text = replacetext(text, REVERSE_RATVAR_HYPHEN_TO_MY_MATCH, REVERSE_RATVAR_HYPHEN_TO_MY_REPLACEMENT) text = replacetext(text, REVERSE_RATVAR_HYPHEN_TE_MATCH, REVERSE_RATVAR_HYPHEN_TE_REPLACEMENT) text = replacetext(text, REVERSE_RATVAR_HYPHEN_ET_MATCH, REVERSE_RATVAR_HYPHEN_ET_REPLACEMENT) - text = replacetext(text, REVERSE_RATVAR_HYPHEN_OF_MATCH, REVERSE_RATVAR_HYPHEN_OF_REPLACEMENT) - return text + return replacetext(text, REVERSE_RATVAR_HYPHEN_OF_MATCH, REVERSE_RATVAR_HYPHEN_OF_REPLACEMENT) //Causes the mob or AM in question to speak a message; it assumes that the message is already translated to ratvar speech using text2ratvar() /proc/clockwork_say(atom/movable/AM, message, whisper=FALSE) diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm index 7aa219e405..0b2c9f9e97 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm @@ -148,7 +148,7 @@ var/obj/structure/destructible/clockwork/geis_binding/binding /datum/clockwork_scripture/geis/Destroy() - if(binding && !qdeleted(binding)) + if(binding && !QDELETED(binding)) qdel(binding) return ..() @@ -213,13 +213,12 @@ addtimer(CALLBACK(invoker, /atom/proc/update_atom_colour), flee_time+grace_period) if(chant_number != chant_amount) //if this is the last chant, we don't have a movement period because the chant is over var/endtime = world.time + flee_time - var/starttime = world.time progbar = new(invoker, flee_time, invoker) progbar.bar.color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0)) animate(progbar.bar, color = initial(progbar.bar.color), time = flee_time+grace_period) while(world.time < endtime && can_recite()) sleep(1) - progbar.update(world.time - starttime) + progbar.update(endtime - world.time) qdel(progbar) if(can_recite()) sleep(grace_period) diff --git a/code/game/gamemodes/clock_cult/clock_structure.dm b/code/game/gamemodes/clock_cult/clock_structure.dm index 5b9e68c781..0cd51b624e 100644 --- a/code/game/gamemodes/clock_cult/clock_structure.dm +++ b/code/game/gamemodes/clock_cult/clock_structure.dm @@ -29,7 +29,8 @@ return ..() /obj/structure/destructible/clockwork/ratvar_act() - obj_integrity = max_integrity + if(ratvar_awakens || clockwork_gateway_activated) + obj_integrity = max_integrity /obj/structure/destructible/clockwork/narsie_act() if(take_damage(rand(25, 50), BRUTE) && src) //if we still exist diff --git a/code/game/gamemodes/clock_cult/clock_structures/interdiction_lens.dm b/code/game/gamemodes/clock_cult/clock_structures/interdiction_lens.dm index 8f6290f54e..069f9145ed 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/interdiction_lens.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/interdiction_lens.dm @@ -84,7 +84,7 @@ for(var/M in atoms_to_test) var/atom/movable/A = M - if(!A || qdeleted(A) || A == target_apc) + if(!A || QDELETED(A) || A == target_apc) continue power_drained += Floor(A.power_drain(TRUE) * efficiency, MIN_CLOCKCULT_POWER) diff --git a/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm b/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm index d333be3c64..01be8a225e 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm @@ -14,9 +14,8 @@ debris = list(/obj/item/clockwork/alloy_shards/large = 1, \ /obj/item/clockwork/alloy_shards/small = 3, \ /obj/item/clockwork/component/geis_capacitor/antennae = 1) - var/mania_cost = 200 - var/convert_attempt_cost = 500 - var/convert_cost = 500 + var/mania_cost = 150 + var/convert_cost = 150 var/static/list/mania_messages = list("Go nuts.", "Take a crack at crazy.", "Make a bid for insanity.", "Get kooky.", "Move towards mania.", "Become bewildered.", "Wax wild.", \ "Go round the bend.", "Land in lunacy.", "Try dementia.", "Strive to get a screw loose.") var/static/list/compel_messages = list("Come closer.", "Approach the transmitter.", "Touch the antennae.", "I always have to deal with idiots. Move towards the mania motor.", \ @@ -28,11 +27,10 @@ "Amazing. You somehow managed to wedge yourself somewhere you can't actually reach the motor from.", "Such a show of idiocy is unparalleled. Perhaps I should put you on display?", \ "Did you do this on purpose? I can't imagine you doing so accidentally. Oh, wait, I can.", "How is it that such smart creatures can still do something AS STUPID AS THIS!") - /obj/structure/destructible/clockwork/powered/mania_motor/examine(mob/user) ..() if(is_servant_of_ratvar(user) || isobserver(user)) - user << "It requires [mania_cost]W to run, and [convert_attempt_cost + convert_cost]W to convert humans adjecent to it." + user << "It requires [mania_cost]W to run, and at least [convert_cost]W to attempt to convert humans adjacent to it." /obj/structure/destructible/clockwork/powered/mania_motor/forced_disable(bad_effects) if(active) @@ -58,94 +56,88 @@ SetLuminosity(0) /obj/structure/destructible/clockwork/powered/mania_motor/process() - if(try_use_power(mania_cost)) - var/turf/T = get_turf(src) - var/hum = get_sfx('sound/effects/screech.ogg') //like playsound, same sound for everyone affected - var/efficiency = get_efficiency_mod() - for(var/mob/living/carbon/human/H in view(1, src)) - if(is_servant_of_ratvar(H) || H.null_rod_check()) - continue - if(H.Adjacent(src) && try_use_power(convert_attempt_cost)) - if(is_eligible_servant(H) && try_use_power(convert_cost)) - H << "\"[text2ratvar("You are mine and his, now.")]\"" - H.playsound_local(T, hum, 80, 1) - add_servant_of_ratvar(H) - H.Paralyse(5) - else if(!H.stat) - if(H.getBrainLoss() >= 100) - H.Paralyse(5) - H << "\"[text2ratvar(pick(convert_messages))]\"" - else - H.adjustBrainLoss(100 * efficiency) - H.visible_message("[H] reaches out and touches [src].", "You touch [src] involuntarily.") - else - visible_message("[src]'s antennae fizzle quietly.") - playsound(src, 'sound/effects/light_flicker.ogg', 50, 1) - for(var/mob/living/carbon/human/H in range(10, src)) - if(is_servant_of_ratvar(H)) - if(H.getBrainLoss() || H.hallucination || H.druggy || H.dizziness || H.confused) - H.adjustBrainLoss(-H.getBrainLoss()) //heals servants of braindamage, hallucination, druggy, dizziness, and confusion - H.hallucination = 0 - H.adjust_drugginess(-H.druggy) - H.dizziness = 0 - H.confused = 0 - else if(!H.null_rod_check() && H.stat == CONSCIOUS) - var/distance = get_dist(T, get_turf(H)) - var/falloff_distance = min((110) - distance * 10, 80) - var/sound_distance = falloff_distance * 0.5 - var/targetbrainloss = H.getBrainLoss() - if(distance >= 4 && prob(falloff_distance * 0.5)) - H << "\"[text2ratvar(pick(mania_messages))]\"" - H.playsound_local(T, hum, sound_distance, 1) - switch(distance) - if(2 to 3) - if(prob(falloff_distance * 0.5)) - if(prob(falloff_distance)) - H << "\"[text2ratvar(pick(mania_messages))]\"" - else - H << "\"[text2ratvar(pick(compel_messages))]\"" - if(targetbrainloss <= 50) - H.adjustBrainLoss((50 * efficiency) - targetbrainloss) //got too close had brain eaten - H.adjust_drugginess(Clamp(7 * efficiency, 0, 100 - H.druggy)) - H.hallucination = min(H.hallucination + (7 * efficiency), 100) - H.dizziness = min(H.dizziness + (3 * efficiency), 45) - H.confused = min(H.confused + (3 * efficiency), 45) - if(4 to 5) - if(targetbrainloss <= 50) - H.adjustBrainLoss(1 * efficiency) - H.adjust_drugginess(Clamp(5 * efficiency, 0, 80 - H.druggy)) - H.hallucination = min(H.hallucination + (5 * efficiency), 80) - H.dizziness = min(H.dizziness + (2 * efficiency), 30) - H.confused = min(H.confused + (2 * efficiency), 30) - if(6 to 7) - if(targetbrainloss <= 30) - H.adjustBrainLoss(1 * efficiency) - H.adjust_drugginess(Clamp(2 * efficiency, 0, 60 - H.druggy)) - H.hallucination = min(H.hallucination + (2 * efficiency), 60) - H.dizziness = min(H.dizziness + (2 * efficiency), 15) - H.confused = min(H.confused + (2 * efficiency), 15) - if(8 to 9) - if(targetbrainloss <= 10) - H.adjustBrainLoss(1 * efficiency) - H.adjust_drugginess(Clamp(2 * efficiency, 0, 40 - H.druggy)) - H.hallucination = min(H.hallucination + (2 * efficiency), 40) - if(10 to INFINITY) - H.adjust_drugginess(Clamp(2 * efficiency, 0, 20 - H.druggy)) - H.hallucination = min(H.hallucination + (2 * efficiency), 20) - else //if it's a distance of 1 and they can't see it/aren't adjacent or they're on top of it(how'd they get on top of it and still trigger this???) - if(prob(falloff_distance * 0.5)) - if(prob(falloff_distance)) - H << "\"[text2ratvar(pick(compel_messages))]\"" - else if(prob(falloff_distance * 0.5)) - H << "\"[text2ratvar(pick(close_messages))]\"" - else - H << "\"[text2ratvar(pick(mania_messages))]\"" - if(targetbrainloss <= 99) - H.adjustBrainLoss((99 * efficiency) - targetbrainloss) - H.adjust_drugginess(Clamp(10 * efficiency, 0, 150 - H.druggy)) - H.hallucination = min(H.hallucination + (10 * efficiency), 150) - H.dizziness = min(H.dizziness + (5 * efficiency), 60) - H.confused = min(H.confused + (5 * efficiency), 60) - - else + if(!try_use_power(mania_cost)) forced_disable(FALSE) + return + var/turf/T = get_turf(src) + var/hum = get_sfx('sound/effects/screech.ogg') //like playsound, same sound for everyone affected + var/efficiency = get_efficiency_mod() + for(var/mob/living/carbon/human/H in view(1, src)) + if(is_servant_of_ratvar(H) || H.null_rod_check() || H.stat == DEAD) + continue + if(!H.Adjacent(src)) + H << "\"[text2ratvar(pick(close_messages))]\"" + continue + if(try_use_power(convert_cost)) + H.playsound_local(T, hum, 80, 1) + if(!H.stat) + if(H.getBrainLoss() < 100) + H.adjustBrainLoss(30 * efficiency) + H.visible_message("[H] reaches out and touches [src].", "You touch [src] involuntarily.") + else + H.Paralyse(3) + else if(is_eligible_servant(H)) + H << "\"[text2ratvar("You are mine and his, now.")]\"" + add_servant_of_ratvar(H) + H.Paralyse(5) + else + H << "\"[text2ratvar(pick(convert_messages))]\"" + else + visible_message("[src]'s antennae fizzle quietly.") + playsound(src, 'sound/effects/light_flicker.ogg', 50, 1) + for(var/mob/living/carbon/human/H in range(10, src)) + if(is_servant_of_ratvar(H)) //heals servants of braindamage, hallucination, druggy, dizziness, and confusion + var/brainloss = H.getBrainLoss() + if(brainloss) + H.adjustBrainLoss(-brainloss) + if(H.hallucination) + H.hallucination = 0 + if(H.druggy) + H.adjust_drugginess(-H.druggy) + if(H.dizziness) + H.dizziness = 0 + if(H.confused) + H.confused = 0 + else if(!H.null_rod_check() && H.stat == CONSCIOUS) + var/distance = 0 + get_dist(T, get_turf(H)) + var/falloff_distance = min((110) - distance * 10, 80) + var/sound_distance = falloff_distance * 0.5 + var/targetbrainloss = H.getBrainLoss() + if(distance >= 4 && prob(falloff_distance * 0.5)) + H << "\"[text2ratvar(pick(mania_messages))]\"" + H.playsound_local(T, hum, sound_distance, 1) + switch(distance) + if(0 to 3) + if(prob(falloff_distance * 0.5)) + if(prob(falloff_distance)) + H << "\"[text2ratvar(pick(mania_messages))]\"" + else + H << "\"[text2ratvar(pick(compel_messages))]\"" + if(targetbrainloss <= 50) + H.adjustBrainLoss((50 * efficiency) - targetbrainloss) //got too close had brain eaten + H.adjust_drugginess(Clamp(7 * efficiency, 0, 100 - H.druggy)) + H.hallucination = min(H.hallucination + (7 * efficiency), 100) + H.dizziness = min(H.dizziness + (3 * efficiency), 45) + H.confused = min(H.confused + (3 * efficiency), 45) + if(4 to 5) + if(targetbrainloss <= 50) + H.adjustBrainLoss(1 * efficiency) + H.adjust_drugginess(Clamp(5 * efficiency, 0, 80 - H.druggy)) + H.hallucination = min(H.hallucination + (5 * efficiency), 80) + H.dizziness = min(H.dizziness + (2 * efficiency), 30) + H.confused = min(H.confused + (2 * efficiency), 30) + if(6 to 7) + if(targetbrainloss <= 30) + H.adjustBrainLoss(1 * efficiency) + H.adjust_drugginess(Clamp(2 * efficiency, 0, 60 - H.druggy)) + H.hallucination = min(H.hallucination + (2 * efficiency), 60) + H.dizziness = min(H.dizziness + (2 * efficiency), 15) + H.confused = min(H.confused + (2 * efficiency), 15) + if(8 to 9) + if(targetbrainloss <= 10) + H.adjustBrainLoss(1 * efficiency) + H.adjust_drugginess(Clamp(2 * efficiency, 0, 40 - H.druggy)) + H.hallucination = min(H.hallucination + (2 * efficiency), 40) + if(10 to INFINITY) + H.adjust_drugginess(Clamp(2 * efficiency, 0, 20 - H.druggy)) + H.hallucination = min(H.hallucination + (2 * efficiency), 20) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index f67b7fbb51..3bb7e24d78 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -379,7 +379,7 @@ if(M.current && M.current.stat != DEAD) cultists |= M.current var/mob/living/cultist_to_receive = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in (cultists - user) - if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) + if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated()) return if(!cultist_to_receive) user << "You require a destination!" diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 32dfdcb077..d8e6a7860c 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -82,7 +82,7 @@ pickedtype = /obj/item/clothing/glasses/night/cultblind if("Flask of Unholy Water") pickedtype = /obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater - if(src && !qdeleted(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) + if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) cooldowntime = world.time + 2400 var/obj/item/N = new pickedtype(get_turf(src)) user << "You kneel before the altar and your faith is rewarded with an [N]!" @@ -114,7 +114,7 @@ pickedtype = /obj/item/clothing/suit/hooded/cultrobes/berserker if("Nar-Sien Hardsuit") pickedtype = /obj/item/clothing/suit/space/hardsuit/cult - if(src && !qdeleted(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) + if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) cooldowntime = world.time + 2400 var/obj/item/N = new pickedtype(get_turf(src)) user << "You work the forge as dark knowledge guides your hands, creating [N]!" @@ -218,7 +218,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list( if("Veil Walker Set") pickedtype += /obj/item/device/cult_shift pickedtype += /obj/item/device/flashlight/flare/culttorch - if(src && !qdeleted(src) && anchored && pickedtype.len && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) + if(src && !QDELETED(src) && anchored && pickedtype.len && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) cooldowntime = world.time + 2400 for(var/N in pickedtype) var/obj/item/D = new N(get_turf(src)) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 719854d947..33cd687496 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -180,7 +180,7 @@ This file contains the arcane tome files. if(!possible_runes.len) return entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in possible_runes - if(!src || qdeleted(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user)) + if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user)) return for(var/T in typesof(/obj/effect/rune)) var/obj/effect/rune/R = T @@ -196,7 +196,7 @@ This file contains the arcane tome files. return Turf = get_turf(user) //we may have moved. adjust as needed... A = get_area(src) - if(!src || qdeleted(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user)) + if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user)) return if(ispath(rune_to_scribe, /obj/effect/rune/narsie)) if(ticker.mode.name == "cult") @@ -235,7 +235,7 @@ This file contains the arcane tome files. if(!do_after(user, initial(rune_to_scribe.scribe_delay), target = get_turf(user))) for(var/V in shields) var/obj/structure/emergency_shield/sanguine/S = V - if(S && !qdeleted(S)) + if(S && !QDELETED(S)) qdel(S) return if(!check_rune_turf(Turf, user)) @@ -244,7 +244,7 @@ This file contains the arcane tome files. "You finish drawing the arcane markings of the Geometer.") for(var/V in shields) var/obj/structure/emergency_shield/S = V - if(S && !qdeleted(S)) + if(S && !QDELETED(S)) qdel(S) var/obj/effect/rune/R = new rune_to_scribe(Turf, chosen_keyword) user << "The [lowertext(R.cultist_name)] rune [R.cultist_desc]" diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 65cfd923e0..5eb2379d2a 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -220,7 +220,7 @@ structure_check() searches for nearby cultist structures required for the invoca possible_talismans[talisman_cult_name] = J //This is to allow the menu to let cultists select talismans by name entered_talisman_name = input(user, "Choose a talisman to imbue.", "Talisman Choices") as null|anything in possible_talismans talisman_type = possible_talismans[entered_talisman_name] - if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || rune_in_use || !talisman_type) + if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated() || rune_in_use || !talisman_type) return papers_on_rune = checkpapers() if(!papers_on_rune.len) @@ -290,7 +290,7 @@ var/list/teleport_runes = list() var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? - if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || !actual_selected_rune) + if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated() || !actual_selected_rune) fail_invoke() return @@ -557,7 +557,7 @@ var/list/teleport_runes = list() mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs else mob_to_revive = potential_revive_mobs[1] - if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_revive, user)) + if(!src || QDELETED(src) || rune_in_use || !validness_checks(mob_to_revive, user)) return rune_in_use = 1 if(user.name == "Herbert West") @@ -809,7 +809,7 @@ var/list/wall_runes = list() if(!(M.current in invokers) && M.current && M.current.stat != DEAD) cultists |= M.current var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in cultists - if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) + if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated()) return if(!cultist_to_summon) user << "You require a summoning target!" diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 9879b196d0..9a47e91561 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -139,7 +139,7 @@ var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? - if(!src || qdeleted(src) || !user || !user.is_holding(src) || user.incapacitated() || !actual_selected_rune) + if(!src || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated() || !actual_selected_rune) return ..(user, 0) var/turf/target = get_turf(actual_selected_rune) if(is_blocked_turf(target, TRUE)) diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index e541d6a066..1de71b46d3 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -36,6 +36,7 @@ /mob/living/carbon/true_devil/create_internal_organs() internal_organs += new /obj/item/organ/brain internal_organs += new /obj/item/organ/tongue + internal_organs += new /obj/item/organ/eyes ..() diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 220b2be20d..dd505013ec 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -329,7 +329,7 @@ M.audible_message("You hear a loud electrical buzzing sound!") src << "Reprogramming machine behaviour..." spawn(50) - if(M && !qdeleted(M)) + if(M && !QDELETED(M)) new /mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(M), M, src, 1) else src << "Out of uses." else src << "That's not a machine." diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index adc9627ca8..265838d15a 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -70,7 +70,7 @@ var/icon/eyes if(EYECOLOR in H.dna.species.species_traits) - eyes = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[H.dna.species.eyes]") + eyes = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes") eyes.Blend("#[H.eye_color]", ICON_MULTIPLY) var/datum/sprite_accessory/S diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 2610d3ade5..94fec48e03 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -147,7 +147,7 @@ var/total_borer_hosts_needed = 10 if(stat != CONSCIOUS) return var/be_borer = alert("Become a cortical borer? (Warning, You can no longer be cloned!)",,"Yes","No") - if(be_borer == "No" || !src || qdeleted(src)) + if(be_borer == "No" || !src || QDELETED(src)) return if(key) return @@ -178,7 +178,7 @@ var/total_borer_hosts_needed = 10 if(!input) return - if(src && !qdeleted(src) && !qdeleted(victim)) + if(src && !QDELETED(src) && !QDELETED(victim)) var/say_string = (docile) ? "slurs" :"states" if(victim) victim << "[truename] [say_string]: [input]" @@ -512,7 +512,7 @@ var/total_borer_hosts_needed = 10 addtimer(CALLBACK(src, .proc/release_host), 100) /mob/living/simple_animal/borer/proc/release_host() - if(!victim || !src || qdeleted(victim) || qdeleted(src)) + if(!victim || !src || QDELETED(victim) || QDELETED(src)) return if(!leaving) return @@ -627,7 +627,7 @@ var/total_borer_hosts_needed = 10 src << "You begin delicately adjusting your connection to the host brain..." - if(qdeleted(src) || qdeleted(victim)) + if(QDELETED(src) || QDELETED(victim)) return bonding = TRUE @@ -798,7 +798,7 @@ var/total_borer_hosts_needed = 10 if(!candidate || !candidate.mob) return - if(!qdeleted(candidate) || !qdeleted(candidate.mob)) + if(!QDELETED(candidate) || !QDELETED(candidate.mob)) var/datum/mind/M = create_borer_mind(candidate.ckey) M.transfer_to(src) diff --git a/code/game/gamemodes/miniantags/borer/borer_event.dm b/code/game/gamemodes/miniantags/borer/borer_event.dm index d3b456b41d..73bea41a52 100644 --- a/code/game/gamemodes/miniantags/borer/borer_event.dm +++ b/code/game/gamemodes/miniantags/borer/borer_event.dm @@ -2,8 +2,8 @@ name = "Borer" typepath = /datum/round_event/borer weight = 15 - max_occurrences = 1 - min_players = 10 + max_occurrences = 0 + min_players = 15 earliest_start = 12000 /datum/round_event/borer @@ -24,7 +24,7 @@ var/list/vents = list() for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in machines) - if(qdeleted(temp_vent)) + if(QDELETED(temp_vent)) continue if(temp_vent.loc.z == ZLEVEL_STATION && !temp_vent.welded) var/datum/pipeline/temp_vent_parent = temp_vent.PARENT1 diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 46daea6f01..b5abae7489 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -40,7 +40,7 @@ if(crit_fail) user << "Swarmer has been depowered." return - if(qdeleted(src)) + if(QDELETED(src)) user << "Swarmer has been occupied by someone else." return var/mob/living/simple_animal/hostile/swarmer/S = new /mob/living/simple_animal/hostile/swarmer(get_turf(loc)) @@ -316,10 +316,6 @@ S << "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting." return FALSE -/obj/machinery/blackbox_recorder/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. " - return FALSE - /obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S << "Disrupting the power grid would bring no benefit to us. Aborting." return FALSE diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 4fa625bd17..0ccc8e7094 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -366,7 +366,7 @@ user << "It is shifting and distorted. It would be wise to destroy this." /obj/item/weapon/ectoplasm/revenant/proc/reform() - if(!src || qdeleted(src) || inert) + if(!src || QDELETED(src) || inert) return var/key_of_revenant message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.") diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index b96268dc9d..4a82f4ed65 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -571,7 +571,7 @@ var/global/list/multiverse = list() var/mob/living/carbon/last_user /obj/item/warpwhistle/proc/interrupted(mob/living/carbon/user) - if(!user || qdeleted(src)) + if(!user || QDELETED(src)) on_cooldown = FALSE return TRUE return FALSE diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 682da993aa..3a6c8bcbbd 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -29,7 +29,7 @@ return 1 /datum/spellbook_entry/proc/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) //return 1 on success - if(!S || qdeleted(S)) + if(!S || QDELETED(S)) S = new spell_type() //Check if we got the spell already for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index bc3fc83e44..2bf0291e4d 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -159,7 +159,7 @@ flick("autolathe_r",src)//plays glass insertion animation user << "You insert [inserted] sheet[inserted>1 ? "s" : ""] to the autolathe." use_power(inserted*100) - if(!qdeleted(O)) + if(!QDELETED(O)) user.put_in_active_hand(O) else user << "You insert a material total of [inserted] to the autolathe." diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index abd148dfce..4690cb2568 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -382,7 +382,7 @@ /obj/machinery/clonepod/ex_act(severity, target) ..() - if(!qdeleted(src)) + if(!QDELETED(src)) locked = FALSE go_out() diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 95161867e1..435e2230b6 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -71,17 +71,16 @@ return /obj/machinery/computer/aifixer/proc/Fix() - . = use_power(1000) - if(.) - occupier.adjustOxyLoss(-1, 0) - occupier.adjustFireLoss(-1, 0) - occupier.adjustToxLoss(-1, 0) - occupier.adjustBruteLoss(-1, 0) - occupier.updatehealth() - occupier.updatehealth() - if(occupier.health >= 0 && occupier.stat == DEAD) - occupier.revive() - . = occupier.health < 100 + use_power(1000) + occupier.adjustOxyLoss(-1, 0) + occupier.adjustFireLoss(-1, 0) + occupier.adjustToxLoss(-1, 0) + occupier.adjustBruteLoss(-1, 0) + occupier.updatehealth() + occupier.updatehealth() + if(occupier.health >= 0 && occupier.stat == DEAD) + occupier.revive() + return occupier.health < 100 /obj/machinery/computer/aifixer/process() if(..()) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 8a162d9a21..8a8b4bbcc9 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -1,7 +1,6 @@ /obj/structure/frame/computer name = "computer frame" icon_state = "0" - anchored = 0 state = 0 /obj/structure/frame/computer/attackby(obj/item/P, mob/user, params) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 2fc5b8777b..1d6083d150 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -3,7 +3,6 @@ icon = 'icons/obj/stock_parts.dmi' icon_state = "box_0" density = 1 - anchored = 1 obj_integrity = 250 max_integrity = 250 var/obj/item/weapon/circuitboard/circuit = null diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index d33b8e4262..b2e4558833 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -274,7 +274,7 @@ var/list/airlock_overlays = list() var/cont = 1 while (cont) sleep(10) - if(qdeleted(src)) + if(QDELETED(src)) return cont = 0 if(secondsMainPowerLost>0) @@ -1404,7 +1404,7 @@ var/list/airlock_overlays = list() operating = 1 update_icon(AIRLOCK_EMAG, 1) sleep(6) - if(qdeleted(src)) + if(QDELETED(src)) return operating = 0 if(!open()) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 6afa9bdf3a..b72ce4d0c8 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -305,7 +305,7 @@ M.take_damage(DOOR_CRUSH_DAMAGE) /obj/machinery/door/proc/autoclose() - if(!qdeleted(src) && !density && !operating && !locked && !welded && autoclose) + if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose) close() /obj/machinery/door/proc/requiresID() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index a6a22d8839..631819fe35 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -3,6 +3,8 @@ desc = "A strong door." icon = 'icons/obj/doors/windoor.dmi' icon_state = "left" + layer = ABOVE_WINDOW_LAYER + closingLayer = ABOVE_WINDOW_LAYER resistance_flags = ACID_PROOF var/base_state = "left" obj_integrity = 150 //If you change this, consider changing ../door/window/brigdoor/ health at the bottom of this .dm file diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index 2962418498..79fafb0a8a 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -163,7 +163,7 @@ A.unbolt() spawn() if(A && A.close()) - if(stat & NOPOWER || lostPower || !A || qdeleted(A)) + if(stat & NOPOWER || lostPower || !A || QDELETED(A)) goIdle(1) return A.bolt() @@ -209,7 +209,7 @@ A.unbolt() spawn() if(A && A.open()) - if(stat | (NOPOWER) && !lostPower && A && !qdeleted(A)) + if(stat | (NOPOWER) && !lostPower && A && !QDELETED(A)) A.bolt() goIdle(1) diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index f7f4da03d9..29d69f31c9 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -74,7 +74,7 @@ user << "The panel must be closed before operating this machine!" return - if(!linked_pad || qdeleted(linked_pad)) + if(!linked_pad || QDELETED(linked_pad)) user << "There is no linked pad!" return @@ -112,14 +112,14 @@ teleporting = 1 spawn(teleport_speed) - if(!src || qdeleted(src)) + if(!src || QDELETED(src)) teleporting = 0 return if(stat & NOPOWER) user << "[src] is unpowered!" teleporting = 0 return - if(!linked_pad || qdeleted(linked_pad) || linked_pad.stat & NOPOWER) + if(!linked_pad || QDELETED(linked_pad) || linked_pad.stat & NOPOWER) user << "Linked pad is not responding to ping. Teleport aborted." teleporting = 0 return diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index e25b032358..3ec3a0cb50 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -111,11 +111,11 @@ /obj/machinery/computer/mech_bay_power_console/ui_data(mob/user) var/list/data = list() - if(recharge_port && !qdeleted(recharge_port)) + if(recharge_port && !QDELETED(recharge_port)) data["recharge_port"] = list("mech" = null) - if(recharge_port.recharging_mech && !qdeleted(recharge_port.recharging_mech)) + if(recharge_port.recharging_mech && !QDELETED(recharge_port.recharging_mech)) data["recharge_port"]["mech"] = list("health" = recharge_port.recharging_mech.obj_integrity, "max_integrity" = recharge_port.recharging_mech.max_integrity, "cell" = null) - if(recharge_port.recharging_mech.cell && !qdeleted(recharge_port.recharging_mech.cell)) + if(recharge_port.recharging_mech.cell && !QDELETED(recharge_port.recharging_mech.cell)) data["recharge_port"]["mech"]["cell"] = list( "critfail" = recharge_port.recharging_mech.cell.crit_fail, "charge" = recharge_port.recharging_mech.cell.charge, diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index f9d2efb3fe..0ec759e20b 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -452,7 +452,8 @@ if(inserted) user << "You insert [inserted] sheet\s into [src]." if(W && W.materials.len) - user.put_in_active_hand(W) + if(!QDELETED(W)) + user.put_in_active_hand(W) var/mat_overlay = "fab-load-[material2name(W.materials[1])]" add_overlay(mat_overlay) sleep(10) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 4825a4ca1f..3dd395d01f 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -971,7 +971,7 @@ setDir(dir_in) if(L && L.client) - L.client.view = world.view + L.client.change_view(world.view) zoom_mode = 0 ///////////////////////// diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 9d9505a01e..b243981717 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -239,10 +239,10 @@ chassis.log_message("Toggled zoom mode.") chassis.occupant_message("Zoom mode [chassis.zoom_mode?"en":"dis"]abled.") if(chassis.zoom_mode) - owner.client.view = 12 + owner.client.change_view(12) owner << sound('sound/mecha/imag_enh.ogg',volume=50) else - owner.client.view = world.view//world.view - default mob view size + owner.client.change_view(world.view) //world.view - default mob view size UpdateButtonIcon() /datum/action/innate/mecha/mech_switch_damtype diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 1e9fb0766a..bf1ea9346e 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -264,7 +264,7 @@ list(name = "- Carbon Dioxide", desc = " This informational poster teaches the v playsound(D.loc, 'sound/items/poster_being_created.ogg', 100, 1) if(do_after(user,D.placespeed,target=src)) - if(!D || qdeleted(D)) + if(!D || QDELETED(D)) return if(iswallturf(src) && user && user.loc == temp_loc) //Let's check if everything is still there diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index 5fbba9999a..73a69eb7f0 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -42,7 +42,7 @@ return /obj/effect/countdown/process() - if(!attached_to || qdeleted(attached_to)) + if(!attached_to || QDELETED(attached_to)) qdel(src) forceMove(get_turf(attached_to)) var/new_val = get_value() diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 1998a11024..6646735613 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -42,3 +42,7 @@ /obj/effect/experience_pressure_difference() return + +/obj/effect/singularity_act() + qdel(src) + return 0 \ No newline at end of file diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index bca24aa886..51fb47d0c3 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -258,10 +258,11 @@ /obj/effect/overlay/temp/ratvar/door icon_state = "ratvardoorglow" - layer = CLOSED_FIREDOOR_LAYER //above closed doors + layer = CLOSED_DOOR_LAYER //above closed doors /obj/effect/overlay/temp/ratvar/door/window icon_state = "ratvarwindoorglow" + layer = ABOVE_WINDOW_LAYER /obj/effect/overlay/temp/ratvar/beam icon_state = "ratvarbeamglow" @@ -295,7 +296,10 @@ /obj/effect/overlay/temp/ratvar/window icon_state = "ratvarwindowglow" - layer = ABOVE_WINDOW_LAYER + layer = ABOVE_OBJ_LAYER + +/obj/effect/overlay/temp/ratvar/window/single + icon_state = "ratvarwindowglow_s" /obj/effect/overlay/temp/ratvar/gear icon_state = "ratvargearglow" @@ -308,9 +312,6 @@ /obj/effect/overlay/temp/ratvar/grille/broken icon_state = "ratvarbrokengrilleglow" -/obj/effect/overlay/temp/ratvar/window/single - icon_state = "ratvarwindowglow_s" - /obj/effect/overlay/temp/ratvar/volt_hit name = "volt blast" layer = ABOVE_MOB_LAYER diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d69f1b1b2b..8a26b20444 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -503,7 +503,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s else ..() /obj/item/throw_impact(atom/A) - if(A && !qdeleted(A)) + if(A && !QDELETED(A)) var/itempush = 1 if(w_class < 4) itempush = 0 //too light to push anything @@ -582,7 +582,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s return 0 /obj/item/burn() - if(!qdeleted(src)) + if(!QDELETED(src)) var/turf/T = get_turf(src) var/ash_type = /obj/effect/decal/cleanable/ash if(w_class == WEIGHT_CLASS_HUGE || w_class == WEIGHT_CLASS_GIGANTIC) @@ -592,7 +592,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s ..() /obj/item/acid_melt() - if(!qdeleted(src)) + if(!QDELETED(src)) var/turf/T = get_turf(src) var/obj/effect/decal/cleanable/molten_object/MO = new(T) MO.pixel_x = rand(-16,16) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 9c360fd615..ab24a5bf8a 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -124,7 +124,7 @@ /obj/item/toy/crayon/proc/check_empty(mob/user) // When eating a crayon, check_empty() can be called twice producing // two messages unless we check for being deleted first - if(qdeleted(src)) + if(QDELETED(src)) return TRUE . = FALSE diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 70856bc37d..0aa6077ad9 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -36,7 +36,7 @@ flick("carp_swell", src) //Wait for animation to end sleep(6) - if(!src || qdeleted(src))//we got toasted while animating + if(!src || QDELETED(src))//we got toasted while animating return //Make space carp var/mob/living/M = new mobtype(get_turf(src)) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 7309edfcab..30c72d6ccc 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -663,7 +663,7 @@ var/global/list/obj/item/device/pda/PDAs = list() M << "[link] [msg.sender] PDA Message --> [multiple ? "Everyone" : msg.recipient]: [msg.message][msg.get_photo_ref()]" /obj/item/device/pda/proc/can_send(obj/item/device/pda/P) - if(!P || qdeleted(P) || P.toff) + if(!P || QDELETED(P) || P.toff) return null var/obj/machinery/message_server/useMS = null @@ -676,7 +676,7 @@ var/global/list/obj/item/device/pda/PDAs = list() var/datum/signal/signal = src.telecomms_process() - if(!P || qdeleted(P) || P.toff) //in case the PDA or mob gets destroyed during telecomms_process() + if(!P || QDELETED(P) || P.toff) //in case the PDA or mob gets destroyed during telecomms_process() return null var/useTC = 0 diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index f00adf5d05..02afa9434d 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -22,7 +22,7 @@ /obj/item/device/geiger_counter/Destroy() STOP_PROCESSING(SSobj, src) - ..() + return ..() /obj/item/device/geiger_counter/process() if(emagged) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index a25146cc56..2bf34009d6 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -97,11 +97,11 @@ addtimer(CALLBACK(src, .proc/explode), timer * 10) /obj/item/weapon/c4/proc/explode() - if(qdeleted(src)) + if(QDELETED(src)) return var/turf/location if(target) - if(!qdeleted(target)) + if(!QDELETED(target)) location = get_turf(target) target.overlays -= image_overlay target.priority_overlays -= image_overlay diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 8b668c2071..9ee7967408 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -381,6 +381,25 @@ beakers += B2 +/obj/item/weapon/grenade/chem_grenade/ez_clean + name = "cleaner grenade" + desc = "Waffle Co.-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas." + stage = READY + +/obj/item/weapon/grenade/chem_grenade/ez_clean/New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src) + + B1.reagents.add_reagent("fluorosurfactant", 40) + B2.reagents.add_reagent("water", 40) + B2.reagents.add_reagent("ez_clean", 60) //ensures a t h i c c distribution + + beakers += B1 + beakers += B2 + + + /obj/item/weapon/grenade/chem_grenade/teargas name = "teargas grenade" desc = "Used for nonlethal riot control. Contents under pressure. Do not directly inhale contents." diff --git a/code/game/objects/items/weapons/grenades/clusterbuster.dm b/code/game/objects/items/weapons/grenades/clusterbuster.dm index cb8f0a73a5..45f35215fa 100644 --- a/code/game/objects/items/weapons/grenades/clusterbuster.dm +++ b/code/game/objects/items/weapons/grenades/clusterbuster.dm @@ -64,7 +64,7 @@ walk_away(P,loc,rand(1,4)) spawn(rand(15,60)) - if(P && !qdeleted(P)) + if(P && !QDELETED(P)) P.prime() qdel(src) diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 99a2a7e4b7..37ee38d5d7 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -19,7 +19,7 @@ /obj/item/weapon/grenade/deconstruct(disassembled = TRUE) if(!disassembled) prime() - if(!qdeleted(src)) + if(!QDELETED(src)) qdel(src) /obj/item/weapon/grenade/proc/clown_check(mob/living/carbon/human/user) diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm index 6f6cb13361..eecbaa88d2 100644 --- a/code/game/objects/items/weapons/grenades/plastic.dm +++ b/code/game/objects/items/weapons/grenades/plastic.dm @@ -128,7 +128,7 @@ /obj/item/weapon/grenade/plastic/c4/prime() var/turf/location if(target) - if(!qdeleted(target)) + if(!QDELETED(target)) location = get_turf(target) target.overlays -= image_overlay target.priority_overlays -= image_overlay @@ -156,7 +156,7 @@ /obj/item/weapon/grenade/plastic/x4/prime() var/turf/location if(target) - if(!qdeleted(target)) + if(!QDELETED(target)) location = get_turf(target) target.overlays -= image_overlay target.priority_overlays -= image_overlay diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm index 7d76005b31..ce3ebc978f 100644 --- a/code/game/objects/items/weapons/implants/implant_chem.dm +++ b/code/game/objects/items/weapons/implants/implant_chem.dm @@ -27,7 +27,7 @@ tracked_chem_implants += src /obj/item/weapon/implant/chem/Destroy() - ..() + . = ..() tracked_chem_implants -= src diff --git a/code/game/objects/items/weapons/implants/implant_track.dm b/code/game/objects/items/weapons/implants/implant_track.dm index a0d5836961..6bcef31720 100644 --- a/code/game/objects/items/weapons/implants/implant_track.dm +++ b/code/game/objects/items/weapons/implants/implant_track.dm @@ -10,7 +10,7 @@ tracked_implants += src /obj/item/weapon/implant/tracking/Destroy() - ..() + . = ..() tracked_implants -= src /obj/item/weapon/implanter/tracking/New() diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 40a6a2b8a7..d53dd4a6a5 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -144,8 +144,8 @@ playsound(loc, 'sound/weapons/batonextend.ogg', 50, 1) add_fingerprint(user) sleep(3) - if (H && !qdeleted(H)) - if (B && !qdeleted(B)) + if (H && !QDELETED(H)) + if (B && !QDELETED(B)) H.internal_organs -= B qdel(B) new /obj/effect/gibspawner/generic(H.loc, H.viruses, H.dna) diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 7d0e56001d..c237e9878e 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -51,7 +51,7 @@ var/A A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in teleportlocs - if(!src || qdeleted(src) || !user || !user.is_holding(src) || user.incapacitated() || !A || !uses) + if(!src || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated() || !A || !uses) return var/area/thearea = teleportlocs[A] diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 886c55fe09..3a9a8cf776 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -273,13 +273,6 @@ level = 1 cant_hold = list(/obj/item/weapon/storage/backpack/satchel/flat) //muh recursive backpacks -/obj/item/weapon/storage/backpack/satchel/duty - name = "duty satchel" - desc = "An extra trendy looking satchel." - icon_state = "satchel-duty" - - - /obj/item/weapon/storage/backpack/satchel/flat/hide(var/intact) if(intact) invisibility = INVISIBILITY_MAXIMUM diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm index 33f4487f52..e1e3ebacd1 100644 --- a/code/game/objects/items/weapons/storage/book.dm +++ b/code/game/objects/items/weapons/storage/book.dm @@ -56,7 +56,6 @@ var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", if(B.icon_state == "honk1" || B.icon_state == "honk2") var/mob/living/carbon/human/H = usr - new /obj/item/weapon/bikehorn(B) H.dna.add_mutation(CLOWNMUT) H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask) @@ -157,8 +156,4 @@ var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", /obj/item/weapon/storage/book/bible/booze/New() ..() - new /obj/item/weapon/reagent_containers/food/drinks/beer(src) - new /obj/item/weapon/reagent_containers/food/drinks/beer(src) - new /obj/item/stack/spacecash(src) - new /obj/item/stack/spacecash(src) - new /obj/item/stack/spacecash(src) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey(src) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 911c47caff..1371818487 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -301,3 +301,8 @@ new /obj/item/weapon/reagent_containers/glass/bottle/romerol(src) new /obj/item/weapon/reagent_containers/syringe(src) new /obj/item/weapon/reagent_containers/dropper(src) + +/obj/item/weapon/storage/box/syndie_kit/ez_clean/New() + ..() + for(var/i in 1 to 3) + new/obj/item/weapon/grenade/chem_grenade/ez_clean(src) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index d1025186ed..2d0e0d9717 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -116,7 +116,7 @@ var/mob/living/carbon/human/H = user user.visible_message("[user] is putting [src]'s valve to [user.p_their()] lips! It looks like [user.p_theyre()] trying to commit suicide!") playsound(loc, 'sound/effects/spray.ogg', 10, 1, -3) - if (H && !qdeleted(H)) + if (H && !QDELETED(H)) for(var/obj/item/W in H) H.dropItemToGround(W) if(prob(50)) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 45e969fe5a..0b0869222f 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -136,7 +136,7 @@ var/obj/item/weapon/twohanded/O = user.get_inactive_held_item() if (istype(O) && !istype(O, /obj/item/weapon/twohanded/offhand/)) //If you have a proper item in your other hand that the offhand is for, do nothing. This should never happen. return - if (qdeleted(src)) + if (QDELETED(src)) return qdel(src) //If it's another offhand, or literally anything else, qdel. If I knew how to add logging messages I'd put one here. @@ -169,8 +169,8 @@ ..() var/slotbit = slotdefine2slotbit(slot) if(slot_flags & slotbit) - var/O = user.is_holding_item_of_type(/obj/item/weapon/twohanded/offhand) - if(!O || qdeleted(O)) + var/datum/O = user.is_holding_item_of_type(/obj/item/weapon/twohanded/offhand) + if(!O || QDELETED(O)) return qdel(O) return @@ -700,7 +700,7 @@ if(source.z == ZLEVEL_STATION && get_dist(turfhit, source) < maxdist || source.z != ZLEVEL_STATION) ..() if(do_after_mob(user, src, 5, uninterruptible = 1, progress = 0)) - if(qdeleted(src)) + if(QDELETED(src)) return var/turf/landing = get_turf(src) if (loc != landing) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index ffed55916c..c407ce6acd 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -141,7 +141,7 @@ /obj/singularity_act() ex_act(1) - if(src && !qdeleted(src)) + if(src && !QDELETED(src)) qdel(src) return 2 diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 74e12249c2..6b4d541797 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -71,7 +71,7 @@ /obj/proc/rewrite(mob/user) var/penchoice = alert("What would you like to edit?", "Rename or change description?", "Rename", "Change description", "Cancel") - if(!qdeleted(src) && user.canUseTopic(src, BE_CLOSE)) + if(!QDELETED(src) && user.canUseTopic(src, BE_CLOSE)) if(penchoice == "Rename") rename_obj(user) if(penchoice == "Change description") @@ -206,7 +206,7 @@ var/input = stripped_input(M,"What do you want to name \the [name]?", ,"", MAX_NAME_LEN) var/oldname = name - if(!qdeleted(src) && M.canUseTopic(src, BE_CLOSE) && input != "") + if(!QDELETED(src) && M.canUseTopic(src, BE_CLOSE) && input != "") if(oldname == input) M << "You changed \the [name] to... well... \the [name]." return @@ -220,7 +220,7 @@ /obj/proc/redesc_obj(mob/M) var/input = stripped_input(M,"Describe \the [name] here", ,"", 100) - if(!qdeleted(src) && M.canUseTopic(src, BE_CLOSE) && input != "") + if(!QDELETED(src) && M.canUseTopic(src, BE_CLOSE) && input != "") desc = input M << "You have successfully changed \the [name]'s description." return diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 0fc923a281..3bb0826128 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -51,7 +51,7 @@ if(density) do_the_flick() sleep(5) - if(!qdeleted(src)) + if(!QDELETED(src)) density = 0 SetOpacity(0) update_icon() @@ -63,7 +63,7 @@ do_the_flick() density = 1 sleep(5) - if(!qdeleted(src)) + if(!QDELETED(src)) SetOpacity(1) update_icon() air_update_turf(1) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index a0f8dd9e88..528c924e3f 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -27,7 +27,15 @@ /obj/structure/grille/Bumped(atom/user) if(ismob(user)) - shock(user, 70) + var/tile_density = FALSE + for(var/atom/movable/AM in get_turf(src)) + if(AM == src) + continue + if(AM.density && AM.layer >= layer) + tile_density = TRUE + break + if(!tile_density) + shock(user, 70) /obj/structure/grille/attack_paw(mob/user) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index eb010bbba2..10c362a233 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -79,6 +79,8 @@ return if(L.buckled) return + if(user.pulling != L) + return playsound(src.loc, "sound/effects/splat.ogg", 25, 1) L.visible_message("[user] slams [L] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") L.loc = src.loc diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index a2802d7a64..34094ad2ef 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -218,7 +218,7 @@ var/global/list/crematoriums = new/list() new /obj/effect/decal/cleanable/ash(src) sleep(30) - if(!qdeleted(src)) + if(!QDELETED(src)) locked = 0 update_icon() playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //you horrible people diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index fe86ac68a8..9550ef0e30 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -146,7 +146,7 @@ open_animation() sleep(OPEN_DURATION + 2) pod_moving = 0 - if(!qdeleted(pod)) + if(!QDELETED(pod)) pod.air_contents.share(loc.return_air()) //mix the pod's gas mixture with the tile it's on /obj/structure/transit_tube/station/init_tube_dirs() diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index 3a026e887d..2f46c0b44f 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -68,7 +68,7 @@ add_fingerprint(user) playsound(src.loc, I.usesound, 50, 1) if(do_after(user, 40*I.toolspeed, target = src)) - if(qdeleted(src)) + if(QDELETED(src)) return user << "You attach the [name]." var/obj/structure/transit_tube/R = new build_type(loc, dir) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index d82a8af254..82bdade48f 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -54,7 +54,7 @@ /obj/structure/transit_tube_pod/ex_act(severity, target) ..() - if(!qdeleted(src)) + if(!QDELETED(src)) empty_pod() /obj/structure/transit_tube_pod/contents_explosion(severity, target) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 6c7fd2bcf3..7ea8a5ceaf 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -190,7 +190,7 @@ playsound(loc, I.usesound, 75, 1) user << " You begin to disassemble [src]..." if(do_after(user, 40*I.toolspeed, target = src)) - if(qdeleted(src)) + if(QDELETED(src)) return var/obj/item/stack/sheet/G = new glass_type(user.loc, glass_amount) @@ -233,7 +233,7 @@ /obj/structure/window/deconstruct(disassembled = TRUE) - if(qdeleted(src)) + if(QDELETED(src)) return if(!disassembled) playsound(src, "shatter", 70, 1) @@ -335,7 +335,7 @@ //merges adjacent full-tile windows into one /obj/structure/window/update_icon() - if(!qdeleted(src)) + if(!QDELETED(src)) if(!fulltile) return diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 6818642905..df3b680b91 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -258,4 +258,4 @@ if(!wet && wet_time) wet_time = 0 if(wet) - addtimer(CALLBACK(src, .proc/HandleWet), 15) + addtimer(CALLBACK(src, .proc/HandleWet), 15, TIMER_UNIQUE) diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 55910cd00e..f1e71ff25d 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -55,7 +55,7 @@ /turf/open/chasm/proc/drop(atom/movable/AM) //Make sure the item is still there after our sleep - if(!AM || qdeleted(AM)) + if(!AM || QDELETED(AM)) return var/turf/T = locate(drop_x, drop_y, drop_z) @@ -84,7 +84,7 @@ /turf/open/chasm/straight_down/lava_land_surface/drop(atom/movable/AM) //Make sure the item is still there after our sleep - if(!AM || qdeleted(AM)) + if(!AM || QDELETED(AM)) return AM.visible_message("[AM] falls into [src]!", "You stumble and stare into an abyss before you. It stares back, and you fall \ into the enveloping dark.") @@ -96,13 +96,13 @@ animate(AM, transform = matrix() - matrix(), alpha = 0, color = rgb(0, 0, 0), time = 10) for(var/i in 1 to 5) //Make sure the item is still there after our sleep - if(!AM || qdeleted(AM)) + if(!AM || QDELETED(AM)) return AM.pixel_y-- sleep(2) //Make sure the item is still there after our sleep - if(!AM || qdeleted(AM)) + if(!AM || QDELETED(AM)) return if(iscyborg(AM)) diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index f20b98bae3..2d9cd76f4a 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -199,6 +199,6 @@ . = ..() //Do this *after* the turf has changed as qdel in spacevines will call changeturf again if it hasn't for(var/obj/structure/spacevine/SV in src) - if(!qdestroying(SV))//Helps avoid recursive loops + if(!QDESTROYING(SV))//Helps avoid recursive loops qdel(SV) UpdateAffectingLights() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 06dc33a174..2368b5bcac 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -21,7 +21,7 @@ var/explosion_level = 0 //for preventing explosion dodging var/explosion_id = 0 - + var/list/decals /turf/New() @@ -426,8 +426,6 @@ return T /turf/handle_fall(mob/faller, forced) - if(!faller) - return faller.lying = pick(90, 270) if(!forced) return diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index 475bb64ec5..7a21dc9ad2 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -129,7 +129,7 @@ /obj/machinery/vr_sleeper/ui_data(mob/user) var/list/data = list() - if(vr_human && !qdeleted(vr_human)) + if(vr_human && !QDELETED(vr_human)) data["can_delete_avatar"] = TRUE var/status switch(user.stat) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 5c542802f1..dba8b98624 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -117,9 +117,9 @@ var/savefile/Banlist if (temp) Banlist["minutes"] << bantimestamp if(!temp) - add_note(ckey, "Permanently banned - [reason]", null, bannedby, 0, null, 0) + create_message("note", ckey, bannedby, "Permanently banned - [reason]", null, null, 0, 0) else - add_note(ckey, "Banned for [minutes] minutes - [reason]", null, bannedby, 0, null, 0) + create_message("note", ckey, bannedby, "Banned for [minutes] minutes - [reason]", null, null, 0, 0) return 1 /proc/RemoveBan(foldername) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index aacf67bbca..bc3def4bc5 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -61,14 +61,8 @@ var/global/BSACooldown = 0 else body+= "Emoteban | " - body += "Notes | " + body += "Notes | Messages | Watchlist | " if(M.client) - if(M.client.check_watchlist(M.client.ckey)) - body += "Remove from Watchlist | " - body += "Edit Watchlist reason " - else - body += "Add to Watchlist " - body += "| Prison | " body += "\ Send back to Lobby | " var/muted = M.client.prefs.muted diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 5ae260a20b..8a35d35c93 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -25,7 +25,7 @@ F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
" //ADMINVERBS -/client/proc/investigate_show( subject in list("hrefs","notes","watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "kudzu") ) +/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "kudzu") ) set name = "Investigate" set category = "Admin" if(!holder) @@ -46,7 +46,5 @@ else src << "No href logfile was found." return - if("notes") - show_note() - if("watchlist") - watchlist_show() + if("notes, memos, watchlist") + browse_messages() diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 9493b756be..ee9b3f26c5 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -15,7 +15,7 @@ . = ..() /obj/effect/fun_balloon/process() - if(!popped && check() && !qdeleted(src)) + if(!popped && check() && !QDELETED(src)) popped = TRUE effect() pop() diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 4a63068a4b..b35c037656 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -5,7 +5,6 @@ var/list/admin_datums = list() var/client/owner = null var/fakekey = null - var/following = null var/datum/marked_datum diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index dbce9bc17b..4320efd9b9 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -76,7 +76,7 @@ body += ""; body += "PP - " - body += "N - " + body += "N - " body += "VV - " body += "TP - " body += "PM - " diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm new file mode 100644 index 0000000000..0a11abba05 --- /dev/null +++ b/code/modules/admin/sql_message_system.dm @@ -0,0 +1,371 @@ +/proc/create_message(type, target_ckey, admin_ckey, text, timestamp, server, secret, logged = 1, browse) + if(!dbcon.IsConnected()) + usr << "Failed to establish database connection." + return + if(!type) + return + if(!target_ckey && (type == "note" || type == "message" || type == "watchlist entry")) + var/new_ckey = ckey(input(usr,"Who would you like to create a [type] for?","Enter a ckey",null) as null|text) + if(!new_ckey) + return + new_ckey = sanitizeSQL(new_ckey) + var/DBQuery/query_find_ckey = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[new_ckey]'") + if(!query_find_ckey.Execute()) + var/err = query_find_ckey.ErrorMsg() + log_game("SQL ERROR obtaining ckey from player table. Error : \[[err]\]\n") + return + if(!query_find_ckey.NextRow()) + if(alert(usr, "[new_ckey] has not been seen before, are you sure you want to create a [type] for them?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes") + return + target_ckey = new_ckey + if(target_ckey) + target_ckey = sanitizeSQL(target_ckey) + if(!admin_ckey) + admin_ckey = usr.ckey + if(!admin_ckey) + return + admin_ckey = sanitizeSQL(admin_ckey) + if(!target_ckey) + target_ckey = admin_ckey + if(!text) + text = input(usr,"Write your [type]","Create [type]") as null|message + if(!text) + return + text = sanitizeSQL(text) + if(!timestamp) + timestamp = SQLtime() + if(!server) + if (config && config.server_name) + server = config.server_name + server = sanitizeSQL(server) + if(isnull(secret)) + switch(alert("Hide note from being viewed by players?", "Secret note?","Yes","No","Cancel")) + if("Yes") + secret = 1 + if("No") + secret = 0 + else + return + var/DBQuery/query_create_message = dbcon.NewQuery("INSERT INTO [format_table_name("messages")] (type, targetckey, adminckey, text, timestamp, server, secret) VALUES ('[type]', '[target_ckey]', '[admin_ckey]', '[text]', '[timestamp]', '[server]', '[secret]')") + if(!query_create_message.Execute()) + var/err = query_create_message.ErrorMsg() + log_game("SQL ERROR creating new [type] in messages table. Error : \[[err]\]\n") + return + if(logged) + log_admin("[key_name(usr)] has created a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""]: [text]") + message_admins("[key_name_admin(usr)] has created a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""]:
[text]") + if(browse) + browse_messages("[type]") + else + browse_messages(target_ckey = target_ckey) + +/proc/delete_message(message_id, logged = 1, browse) + if(!dbcon.IsConnected()) + usr << "Failed to establish database connection." + return + message_id = text2num(message_id) + if(!message_id) + return + var/type + var/target_ckey + var/text + var/DBQuery/query_find_del_message = dbcon.NewQuery("SELECT type, targetckey, adminckey, text FROM [format_table_name("messages")] WHERE id = [message_id]") + if(!query_find_del_message.Execute()) + var/err = query_find_del_message.ErrorMsg() + log_game("SQL ERROR obtaining type, targetckey, adminckey text from messages table. Error : \[[err]\]\n") + return + if(query_find_del_message.NextRow()) + type = query_find_del_message.item[1] + target_ckey = query_find_del_message.item[2] + text = query_find_del_message.item[4] + var/DBQuery/query_del_message = dbcon.NewQuery("DELETE FROM [format_table_name("messages")] WHERE id = [message_id]") + if(!query_del_message.Execute()) + var/err = query_del_message.ErrorMsg() + log_game("SQL ERROR deleting [type] from messages table. Error : \[[err]\]\n") + return + if(logged) + log_admin("[key_name(usr)] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_ckey]: [text]") + message_admins("[key_name_admin(usr)] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_ckey]:
[text]") + if(browse) + browse_messages("[type]") + else + browse_messages(target_ckey = target_ckey) + +/proc/edit_message(message_id, browse) + if(!dbcon.IsConnected()) + usr << "Failed to establish database connection." + return + message_id = text2num(message_id) + if(!message_id) + return + var/DBQuery/query_find_edit_message = dbcon.NewQuery("SELECT type, targetckey, adminckey, text FROM [format_table_name("messages")] WHERE id = [message_id]") + if(!query_find_edit_message.Execute()) + var/err = query_find_edit_message.ErrorMsg() + log_game("SQL ERROR obtaining type, targetckey, adminckey, text from messages table. Error : \[[err]\]\n") + return + if(query_find_edit_message.NextRow()) + var/type = query_find_edit_message.item[1] + var/target_ckey = query_find_edit_message.item[2] + var/admin_ckey = query_find_edit_message.item[3] + var/old_text = query_find_edit_message.item[4] + var/editor_ckey = sanitizeSQL(usr.ckey) + var/new_text = input("Input new [type]", "New [type]", "[old_text]") as null|message + if(!new_text) + return + new_text = sanitizeSQL(new_text) + var/edit_text = sanitizeSQL("Edited by [editor_ckey] on [SQLtime()] from
[old_text]
to
[new_text]
") + var/DBQuery/query_edit_message = dbcon.NewQuery("UPDATE [format_table_name("messages")] SET text = '[new_text]', lasteditor = '[editor_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE id = [message_id]") + if(!query_edit_message.Execute()) + var/err = query_edit_message.ErrorMsg() + log_game("SQL ERROR editing messages table. Error : \[[err]\]\n") + return + log_admin("[key_name(usr)] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""] made by [admin_ckey] from [old_text] to [new_text]") + message_admins("[key_name_admin(usr)] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""] made by [admin_ckey] from
[old_text]
to
[new_text]") + if(browse) + browse_messages("[type]") + else + browse_messages(target_ckey = target_ckey) + +/proc/toggle_message_secrecy(message_id) + if(!dbcon.IsConnected()) + usr << "Failed to establish database connection." + return + message_id = text2num(message_id) + if(!message_id) + return + var/DBQuery/query_find_message_secret = dbcon.NewQuery("SELECT type, targetckey, adminckey, secret FROM [format_table_name("messages")] WHERE id = [message_id]") + if(!query_find_message_secret.Execute()) + var/err = query_find_message_secret.ErrorMsg() + log_game("SQL ERROR obtaining type, targetckey, adminckey, secret from messages table. Error : \[[err]\]\n") + return + if(query_find_message_secret.NextRow()) + var/type = query_find_message_secret.item[1] + var/target_ckey = query_find_message_secret.item[2] + var/admin_ckey = query_find_message_secret.item[3] + var/secret = text2num(query_find_message_secret.item[4]) + var/editor_ckey = sanitizeSQL(usr.ckey) + var/edit_text = "Made [secret ? "not secret" : "secret"] by [editor_ckey] on [SQLtime()]
" + var/DBQuery/query_message_secret = dbcon.NewQuery("UPDATE [format_table_name("messages")] SET secret = NOT secret, lasteditor = '[editor_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE id = [message_id]") + if(!query_message_secret.Execute()) + var/err = query_message_secret.ErrorMsg() + log_game("SQL ERROR toggling message secrecy. Error : \[[err]\]\n") + return + log_admin("[key_name(usr)] has toggled [target_ckey]'s [type] made by [admin_ckey] to [secret ? "not secret" : "secret"]") + message_admins("[key_name_admin(usr)] has toggled [target_ckey]'s [type] made by [admin_ckey] to [secret ? "not secret" : "secret"]") + browse_messages(target_ckey = target_ckey) + +/proc/browse_messages(type, target_ckey, index, linkless = 0) + if(!dbcon.IsConnected()) + usr << "Failed to establish database connection." + return + var/output + var/ruler = "
" + var/navbar = "\[All\]|\[#\]" + for(var/letter in alphabet) + navbar += "|\[[letter]\]" + navbar += "|\[Memos\]|\[Watchlist\]" + navbar += "
\ + \ + \ +
" + if(!linkless) + output = navbar + if(type == "memo" || type == "watchlist entry") + if(type == "memo") + output += "

Admin memos

" + output += "\[Add memo\]" + else if(type == "watchlist entry") + output += "

Watchlist entries

" + output += "\[Add watchlist entry\]" + output += ruler + var/DBQuery/query_get_type_messages = dbcon.NewQuery("SELECT id, targetckey, adminckey, text, timestamp, server, lasteditor FROM [format_table_name("messages")] WHERE type = '[type]'") + if(!query_get_type_messages.Execute()) + var/err = query_get_type_messages.ErrorMsg() + log_game("SQL ERROR obtaining id, targetckey, adminckey, text, timestamp, server, lasteditor from messages table. Error : \[[err]\]\n") + return + while(query_get_type_messages.NextRow()) + var/id = query_get_type_messages.item[1] + var/t_ckey = query_get_type_messages.item[2] + var/admin_ckey = query_get_type_messages.item[3] + var/text = query_get_type_messages.item[4] + var/timestamp = query_get_type_messages.item[5] + var/server = query_get_type_messages.item[6] + var/editor_ckey = query_get_type_messages.item[7] + output += "" + if(type == "watchlist entry") + output += "[t_ckey] | " + output += "[timestamp] | [server] | [admin_ckey]" + output += " \[Delete\]" + output += " \[Edit\]" + if(editor_ckey) + output += " Last edit by [editor_ckey] (Click here to see edit log)" + output += "
[text]
" + if(target_ckey) + target_ckey = sanitizeSQL(target_ckey) + var/DBQuery/query_get_messages = dbcon.NewQuery("SELECT type, secret, id, adminckey, text, timestamp, server, lasteditor FROM [format_table_name("messages")] WHERE type <> 'memo' AND targetckey = '[target_ckey]' ORDER BY timestamp") + if(!query_get_messages.Execute()) + var/err = query_get_messages.ErrorMsg() + log_game("SQL ERROR obtaining type, secret, id, adminckey, text, timestamp, server, lasteditor from messages table. Error : \[[err]\]\n") + return + var/messagedata + var/watchdata + var/notedata + while(query_get_messages.NextRow()) + type = query_get_messages.item[1] + if(type == "memo") + continue + var/secret = text2num(query_get_messages.item[2]) + if(linkless && secret) + continue + var/id = query_get_messages.item[3] + var/admin_ckey = query_get_messages.item[4] + var/text = query_get_messages.item[5] + var/timestamp = query_get_messages.item[6] + var/server = query_get_messages.item[7] + var/editor_ckey = query_get_messages.item[8] + var/data + data += "[timestamp] | [server] | [admin_ckey]" + if(!linkless) + data += " \[Delete\]" + if(type == "note") + data += " [secret ? "\[Secret\]" : "\[Not secret\]"]" + data += " \[Edit\]" + if(editor_ckey) + data += " Last edit by [editor_ckey] (Click here to see edit log)" + data += "
[text]
" + switch(type) + if("message") + messagedata += data + if("watchlist entry") + watchdata += data + if("note") + notedata += data + output += "

[target_ckey]

" + if(!linkless) + output += "\[Add message\]" + output += " \[Add to watchlist\]" + output += " \[Add note\]" + output += " \[Refresh page\]
" + else + output += " \[Refresh page\]" + output += ruler + if(messagedata) + output += "

Messages

" + output += messagedata + if(watchdata) + output += "

Watchlist

" + output += watchdata + if(notedata) + output += "

Notes

" + output += notedata + if(index) + var/index_ckey + var/search + output += "
\[Add message\]\[Add watchlist entry\]\[Add note\]
" + output += ruler + if(!isnum(index)) + index = sanitizeSQL(index) + switch(index) + if(1) + search = "^." + if(2) + search = "^\[^\[:alpha:\]\]" + else + search = "^[index]" + var/DBQuery/query_list_messages = dbcon.NewQuery("SELECT DISTINCT targetckey FROM [format_table_name("messages")] WHERE type <> 'memo' AND targetckey REGEXP '[search]' ORDER BY targetckey") + if(!query_list_messages.Execute()) + var/err = query_list_messages.ErrorMsg() + log_game("SQL ERROR obtaining distinct targetckey from messages table. Error : \[[err]\]\n") + return + while(query_list_messages.NextRow()) + index_ckey = query_list_messages.item[1] + output += "[index_ckey]
" + else if(!type && !target_ckey && !index) + output += "
\[Add message\]\[Add watchlist entry\]\[Add note\]
" + output += ruler + usr << browse(output, "window=browse_messages;size=900x500") + +proc/get_message_output(type, target_ckey) + if(!dbcon.IsConnected()) + usr << "Failed to establish database connection." + return + if(!type) + return + var/output + if(target_ckey) + target_ckey = sanitizeSQL(target_ckey) + var/query = "SELECT id, adminckey, text, timestamp, lasteditor FROM [format_table_name("messages")] WHERE type = '[type]'" + if(type == "message" || type == "watchlist entry") + query += " AND targetckey = '[target_ckey]'" + var/DBQuery/query_get_message_output = dbcon.NewQuery(query) + if(!query_get_message_output.Execute()) + var/err = query_get_message_output.ErrorMsg() + log_game("SQL ERROR obtaining id, adminckey, text, timestamp, lasteditor from messages table. Error : \[[err]\]\n") + return + while(query_get_message_output.NextRow()) + var/id = query_get_message_output.item[1] + var/admin_ckey = query_get_message_output.item[2] + var/text = query_get_message_output.item[3] + var/timestamp = query_get_message_output.item[4] + var/editor_ckey = query_get_message_output.item[5] + switch(type) + if("message") + output += "Admin message left by [admin_ckey] on [timestamp]" + output += "
[text]" + delete_message(id, 0) + if("watchlist entry") + message_admins("Notice: [key_name_admin(target_ckey)] is on the watchlist and has just connected - Reason: [text]") + send2admindiscord("Watchlist", "[key_name(target_ckey)] is on the watchlist and has just connected - Reason: [text]") + if("memo") + output += "Memo by [admin_ckey] on [timestamp]" + if(editor_ckey) + output += "
Last edit by [editor_ckey] (Click here to see edit log)" + output += "
[text]

" + return output + +#define NOTESFILE "data/player_notes.sav" +//if the AUTOCONVERT_NOTES is turned on, anytime a player connects this will be run to try and add all their notes to the databas +/proc/convert_notes_sql(ckey) + var/savefile/notesfile = new(NOTESFILE) + if(!notesfile) + log_game("Error: Cannot access [NOTESFILE]") + return + notesfile.cd = "/[ckey]" + while(!notesfile.eof) + var/notetext + notesfile >> notetext + var/server + if(config && config.server_name) + server = config.server_name + var/regex/note = new("^(\\d{2}-\\w{3}-\\d{4}) \\| (.+) ~(\\w+)$", "i") + note.Find(notetext) + var/timestamp = note.group[1] + notetext = note.group[2] + var/admin_ckey = note.group[3] + var/DBQuery/query_convert_time = dbcon.NewQuery("SELECT ADDTIME(STR_TO_DATE('[timestamp]','%d-%b-%Y'), '0')") + if(!query_convert_time.Execute()) + var/err = query_convert_time.ErrorMsg() + log_game("SQL ERROR converting timestamp. Error : \[[err]\]\n") + return + if(query_convert_time.NextRow()) + timestamp = query_convert_time.item[1] + if(ckey && notetext && timestamp && admin_ckey && server) + create_message("note", ckey, admin_ckey, notetext, timestamp, server, 1, 0) + notesfile.cd = "/" + notesfile.dir.Remove(ckey) + +/*alternatively this proc can be run once to pass through every note and attempt to convert it before deleting the file, if done then AUTOCONVERT_NOTES should be turned off +this proc can take several minutes to execute fully if converting and cause DD to hang if converting a lot of notes; it's not advised to do so while a server is live +/proc/mass_convert_notes() + world << "Beginning mass note conversion" + var/savefile/notesfile = new(NOTESFILE) + if(!notesfile) + log_game("Error: Cannot access [NOTESFILE]") + return + notesfile.cd = "/" + for(var/ckey in notesfile.dir) + convert_notes_sql(ckey) + world << "Deleting NOTESFILE" + fdel(NOTESFILE) + world << "Finished mass note conversion, remember to turn off AUTOCONVERT_NOTES"*/ +#undef NOTESFILE \ No newline at end of file diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm deleted file mode 100644 index 44244d36f3..0000000000 --- a/code/modules/admin/sql_notes.dm +++ /dev/null @@ -1,260 +0,0 @@ -/proc/add_note(target_ckey, notetext, timestamp, adminckey, logged = 1, server, secret) - if(!dbcon.IsConnected()) - usr << "Failed to establish database connection." - return - if(!target_ckey) - var/new_ckey = ckey(input(usr,"Who would you like to add a note for?","Enter a ckey",null) as text) - if(!new_ckey) - return - new_ckey = sanitizeSQL(new_ckey) - var/DBQuery/query_find_ckey = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[new_ckey]'") - if(!query_find_ckey.Execute()) - var/err = query_find_ckey.ErrorMsg() - log_game("SQL ERROR obtaining ckey from player table. Error : \[[err]\]\n") - return - if(!query_find_ckey.NextRow()) - if(alert(usr, "[new_ckey] has not been seen before, are you sure you want to add a note for them?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes") - return - target_ckey = new_ckey - var/target_sql_ckey = sanitizeSQL(target_ckey) - if(!notetext) - notetext = input(usr,"Write your Note","Add Note") as null|message - if(!notetext) - return - notetext = sanitizeSQL(notetext) - if(!timestamp) - timestamp = SQLtime() - if(!adminckey) - adminckey = usr.ckey - if(!adminckey) - return - var/admin_sql_ckey = sanitizeSQL(adminckey) - if(!server) - if (config && config.server_name) - server = config.server_name - server = sanitizeSQL(server) - if(isnull(secret)) - switch(alert("Hide note from being viewed by players?", "Secret Note?","Yes","No","Cancel")) - if("Yes") - secret = 1 - if("No") - secret = 0 - else - return - var/DBQuery/query_noteadd = dbcon.NewQuery("INSERT INTO [format_table_name("notes")] (ckey, timestamp, notetext, adminckey, server, secret) VALUES ('[target_sql_ckey]', '[timestamp]', '[notetext]', '[admin_sql_ckey]', '[server]', '[secret]')") - if(!query_noteadd.Execute()) - var/err = query_noteadd.ErrorMsg() - log_game("SQL ERROR adding new note to table. Error : \[[err]\]\n") - return - if(logged) - log_admin("[key_name(usr)] has added a note to [target_ckey]: [notetext]") - message_admins("[key_name_admin(usr)] has added a note to [target_ckey]:
[notetext]") - show_note(target_ckey) - -/proc/remove_note(note_id) - var/ckey - var/notetext - var/adminckey - if(!dbcon.IsConnected()) - usr << "Failed to establish database connection." - return - if(!note_id) - return - note_id = text2num(note_id) - var/DBQuery/query_find_note_del = dbcon.NewQuery("SELECT ckey, notetext, adminckey FROM [format_table_name("notes")] WHERE id = [note_id]") - if(!query_find_note_del.Execute()) - var/err = query_find_note_del.ErrorMsg() - log_game("SQL ERROR obtaining ckey, notetext, adminckey from notes table. Error : \[[err]\]\n") - return - if(query_find_note_del.NextRow()) - ckey = query_find_note_del.item[1] - notetext = query_find_note_del.item[2] - adminckey = query_find_note_del.item[3] - var/DBQuery/query_del_note = dbcon.NewQuery("DELETE FROM [format_table_name("notes")] WHERE id = [note_id]") - if(!query_del_note.Execute()) - var/err = query_del_note.ErrorMsg() - log_game("SQL ERROR removing note from table. Error : \[[err]\]\n") - return - log_admin("[key_name(usr)] has removed a note made by [adminckey] from [ckey]: [notetext]") - message_admins("[key_name_admin(usr)] has removed a note made by [adminckey] from [ckey]:
[notetext]") - show_note(ckey) - -/proc/edit_note(note_id) - if(!dbcon.IsConnected()) - usr << "Failed to establish database connection." - return - if(!note_id) - return - note_id = text2num(note_id) - var/target_ckey - var/sql_ckey = sanitizeSQL(usr.ckey) - var/DBQuery/query_find_note_edit = dbcon.NewQuery("SELECT ckey, notetext, adminckey FROM [format_table_name("notes")] WHERE id = [note_id]") - if(!query_find_note_edit.Execute()) - var/err = query_find_note_edit.ErrorMsg() - log_game("SQL ERROR obtaining notetext from notes table. Error : \[[err]\]\n") - return - if(query_find_note_edit.NextRow()) - target_ckey = query_find_note_edit.item[1] - var/old_note = query_find_note_edit.item[2] - var/adminckey = query_find_note_edit.item[3] - var/new_note = input("Input new note", "New Note", "[old_note]") as null|message - if(!new_note) - return - new_note = sanitizeSQL(new_note) - var/edit_text = "Edited by [sql_ckey] on [SQLtime()] from
[old_note]
to
[new_note]
" - edit_text = sanitizeSQL(edit_text) - var/DBQuery/query_update_note = dbcon.NewQuery("UPDATE [format_table_name("notes")] SET notetext = '[new_note]', last_editor = '[sql_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE id = [note_id]") - if(!query_update_note.Execute()) - var/err = query_update_note.ErrorMsg() - log_game("SQL ERROR editing note. Error : \[[err]\]\n") - return - log_admin("[key_name(usr)] has edited [target_ckey]'s note made by [adminckey] from [old_note] to [new_note]") - message_admins("[key_name_admin(usr)] has edited [target_ckey]'s note made by [adminckey] from
[old_note]
to
[new_note]") - show_note(target_ckey) - -/proc/toggle_note_secrecy(note_id) - if(!dbcon.IsConnected()) - usr << "Failed to establish database connection." - return - if(!note_id) - return - note_id = text2num(note_id) - var/DBQuery/query_find_note_secret = dbcon.NewQuery("SELECT ckey, adminckey, secret FROM [format_table_name("notes")] WHERE id = [note_id]") - if(!query_find_note_secret.Execute()) - var/err = query_find_note_secret.ErrorMsg() - log_game("SQL ERROR obtaining ckey, adminckey, secret from notes table. Error : \[[err]\]\n") - return - if(query_find_note_secret.NextRow()) - var/target_ckey = query_find_note_secret.item[1] - var/adminckey = query_find_note_secret.item[2] - var/secret = text2num(query_find_note_secret.item[3]) - var/sql_ckey = sanitizeSQL(usr.ckey) - var/edit_text = "Made [secret ? "not secret" : "secret"] by [sql_ckey] on [SQLtime()]
" - var/DBQuery/query_update_note = dbcon.NewQuery("UPDATE [format_table_name("notes")] SET secret = NOT secret, last_editor = '[sql_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE id = [note_id]") - if(!query_update_note.Execute()) - var/err = query_update_note.ErrorMsg() - log_game("SQL ERROR toggling note secrecy. Error : \[[err]\]\n") - return - log_admin("[key_name(usr)] has toggled [target_ckey]'s note made by [adminckey] to [secret ? "not secret" : "secret"]") - message_admins("[key_name_admin(usr)] has toggled [target_ckey]'s note made by [adminckey] to [secret ? "not secret" : "secret"]") - show_note(target_ckey) - -/proc/show_note(target_ckey, index, linkless = 0) - if(!dbcon.IsConnected()) - usr << "Failed to establish database connection." - return - var/output - var/ruler = "
" - var/navbar = "\[All\]|\[#\]" - for(var/letter in alphabet) - navbar += "|\[[letter]\]" - navbar += "
\ - \ - \ -
" - if(!linkless) - output = navbar - if(target_ckey) - var/target_sql_ckey = sanitizeSQL(target_ckey) - var/DBQuery/query_get_notes = dbcon.NewQuery("SELECT secret, timestamp, notetext, adminckey, last_editor, server, id FROM [format_table_name("notes")] WHERE ckey = '[target_sql_ckey]' ORDER BY timestamp") - if(!query_get_notes.Execute()) - var/err = query_get_notes.ErrorMsg() - usr << "SQL ERROR: Failed to obtain DB records. Error : \[[err]\]\" - log_game("SQL ERROR obtaining secret, timestamp, notetext, adminckey, last_editor, server, id from notes table. Error : \[[err]\]\n") - return - output += "

Notes of [target_ckey]

" - if(!linkless) - output += "
\[Add Note\]" - output += " \[Refresh Page\]
" - else - output += " \[Refresh Page\]" - output += ruler - while(query_get_notes.NextRow()) - var/secret = text2num(query_get_notes.item[1]) - if(linkless && secret) - continue - var/timestamp = query_get_notes.item[2] - var/notetext = query_get_notes.item[3] - var/adminckey = query_get_notes.item[4] - var/last_editor = query_get_notes.item[5] - var/server = query_get_notes.item[6] - var/id = query_get_notes.item[7] - output += "[timestamp] | [server] | [adminckey]" - if(!linkless) - output += " \[Remove Note\] [secret ? "\[Secret\]" : "\[Not Secret\]"] \[Edit Note\]" - if(last_editor) - output += " Last edit by [last_editor] (Click here to see edit log)" - output += "
[notetext]
" - else if(index) - var/index_ckey - var/search - output += "
\[Add Note\]
" - output += ruler - if(!isnum(index)) - index = sanitizeSQL(index) - switch(index) - if(1) - search = "^." - if(2) - search = "^\[^\[:alpha:\]\]" - else - search = "^[index]" - var/DBQuery/query_list_notes = dbcon.NewQuery("SELECT DISTINCT ckey FROM [format_table_name("notes")] WHERE ckey REGEXP '[search]' ORDER BY ckey") - if(!query_list_notes.Execute()) - var/err = query_list_notes.ErrorMsg() - log_game("SQL ERROR obtaining ckey from notes table. Error : \[[err]\]\n") - return - while(query_list_notes.NextRow()) - index_ckey = query_list_notes.item[1] - output += "[index_ckey]
" - else - output += "
\[Add Note\]
" - output += ruler - usr << browse(output, "window=show_notes;size=900x500") - -#define NOTESFILE "data/player_notes.sav" -//if the AUTOCONVERT_NOTES is turned on, anytime a player connects this will be run to try and add all their notes to the databas -/proc/convert_notes_sql(ckey) - var/savefile/notesfile = new(NOTESFILE) - if(!notesfile) - log_game("Error: Cannot access [NOTESFILE]") - return - notesfile.cd = "/[ckey]" - while(!notesfile.eof) - var/notetext - notesfile >> notetext - var/server - if(config && config.server_name) - server = config.server_name - var/regex/note = new("^(\\d{2}-\\w{3}-\\d{4}) \\| (.+) ~(\\w+)$", "i") - note.Find(notetext) - var/timestamp = note.group[1] - notetext = note.group[2] - var/adminckey = note.group[3] - var/DBQuery/query_convert_time = dbcon.NewQuery("SELECT ADDTIME(STR_TO_DATE('[timestamp]','%d-%b-%Y'), '0')") - if(!query_convert_time.Execute()) - var/err = query_convert_time.ErrorMsg() - log_game("SQL ERROR converting timestamp. Error : \[[err]\]\n") - return - if(query_convert_time.NextRow()) - timestamp = query_convert_time.item[1] - if(ckey && notetext && timestamp && adminckey && server) - add_note(ckey, notetext, timestamp, adminckey, 0, server, 1) - notesfile.cd = "/" - notesfile.dir.Remove(ckey) - -/*alternatively this proc can be run once to pass through every note and attempt to convert it before deleting the file, if done then AUTOCONVERT_NOTES should be turned off -this proc can take several minutes to execute fully if converting and cause DD to hang if converting a lot of notes; it's not advised to do so while a server is live -/proc/mass_convert_notes() - world << "Beginning mass note conversion" - var/savefile/notesfile = new(NOTESFILE) - if(!notesfile) - log_game("Error: Cannot access [NOTESFILE]") - return - notesfile.cd = "/" - for(var/ckey in notesfile.dir) - convert_notes_sql(ckey) - world << "Deleting NOTESFILE" - fdel(NOTESFILE) - world << "Finished mass note conversion, remember to turn off AUTOCONVERT_NOTES"*/ -#undef NOTESFILE diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 68976c6c5e..00f7dd2e7e 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -8,7 +8,7 @@ if(href_list["rejectadminhelp"]) if(!check_rights(R_ADMIN)) return - var/client/C = locate(href_list["rejectadminhelp"]) + var/client/C = locate(href_list["rejectadminhelp"]) in clients if(!C) return if (deltimer(C.adminhelptimerid)) @@ -23,6 +23,20 @@ message_admins("[key_name_admin(usr)] Rejected [C.key]'s admin help. [C.key]'s Adminhelp verb has been returned to them.") log_admin("[key_name(usr)] Rejected [C.key]'s admin help.") + else if(href_list["icissue"]) + var/client/C = locate(href_list["icissue"]) in clients + if(!C) + return + + var/msg = "- AdminHelp marked as IC issue! -
" + msg += "Losing is part of the game!
" + msg += "Your character will frequently die, sometimes without even a possibility of avoiding it. Events will often be out of your control. No matter how good or prepared you are, sometimes you just lose." + + C << msg + + message_admins("[key_name_admin(usr)] marked [C.key]'s admin help as an IC issue.") + log_admin("[key_name(usr)] marked [C.key]'s admin help as an IC issue.") + else if(href_list["stickyban"]) stickyban(href_list["stickyban"],href_list) @@ -238,10 +252,7 @@ if(!DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid )) usr << "Failed to apply ban." return - add_note(banckey, banreason, null, usr.ckey, 0, null, 0) - - else if(href_list["editrights"]) - edit_rights_topic(href_list) + create_message("note", banckey, null, banreason, null, null, 0, 0) else if(href_list["mentor"]) if(!check_rights(R_ADMIN)) return @@ -287,6 +298,9 @@ M.verbs -= /client/proc/cmd_mentor_say M.verbs -= /client/proc/show_mentor_memo + else if(href_list["editrights"]) + edit_rights_topic(href_list) + else if(href_list["call_shuttle"]) if(!check_rights(R_ADMIN)) return @@ -587,7 +601,7 @@ ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]") log_admin("[key_name(usr)] appearance banned [key_name(M)]. \nReason: [reason]") feedback_inc("ban_appearance",1) - add_note(M.ckey, "Appearance banned - [reason]", null, usr.ckey, 0, null, 0) + create_message("note", M.ckey, null, "Appearance banned - [reason]", null, null, 0, 0) message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)].") M << "You have been appearance banned by [usr.client.ckey]." M << "The reason is: [reason]" @@ -977,7 +991,7 @@ msg = job else msg += ", [job]" - add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0, null, 0) + create_message("note", M.ckey, null, "Banned from [msg] - [reason]", null, null, 0, 0) message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes.") M << "You have been [(msg == ("ooc" || "appearance")) ? "banned" : "jobbanned"] by [usr.client.ckey] from: [msg]." M << "The reason is: [reason]" @@ -1002,7 +1016,7 @@ msg = job else msg += ", [job]" - add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0, null, 0) + create_message("note", M.ckey, null, "Banned from [msg] - [reason]", null, null, 0, 0) message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg].") M << "You have been [(msg == ("ooc" || "appearance")) ? "banned" : "jobbanned"] by [usr.client.ckey] from: [msg]." M << "The reason is: [reason]" @@ -1054,58 +1068,88 @@ //M.client = null qdel(M.client) - //Player Notes + else if(href_list["addmessage"]) + var/target_ckey = href_list["addmessage"] + create_message("message", target_ckey, secret = 0) + else if(href_list["addnote"]) var/target_ckey = href_list["addnote"] - add_note(target_ckey) + create_message("note", target_ckey) + + else if(href_list["addwatch"]) + var/target_ckey = href_list["addwatch"] + create_message("watchlist entry", target_ckey, secret = 1) + + else if(href_list["addmemo"]) + create_message("memo", secret = 0, browse = 1) + + else if(href_list["addmessageempty"]) + create_message("message", secret = 0) else if(href_list["addnoteempty"]) - add_note() + create_message("note") - else if(href_list["removenote"]) - var/note_id = href_list["removenote"] - remove_note(note_id) + else if(href_list["addwatchempty"]) + create_message("watchlist entry", secret = 1) - else if(href_list["editnote"]) - var/note_id = href_list["editnote"] - edit_note(note_id) + else if(href_list["deletemessage"]) + var/message_id = href_list["deletemessage"] + delete_message(message_id) - else if(href_list["shownote"]) - var/target = href_list["shownote"] - show_note(index = target) + else if(href_list["deletemessageempty"]) + var/message_id = href_list["deletemessageempty"] + delete_message(message_id, browse = 1) + + else if(href_list["editmessage"]) + var/message_id = href_list["editmessage"] + edit_message(message_id) + + else if(href_list["editmessageempty"]) + var/message_id = href_list["editmessageempty"] + edit_message(message_id, browse = 1) + + else if(href_list["secretmessage"]) + var/message_id = href_list["secretmessage"] + toggle_message_secrecy(message_id) + + else if(href_list["searchmessages"]) + var/target = href_list["searchmessages"] + browse_messages(index = target) else if(href_list["nonalpha"]) var/target = href_list["nonalpha"] target = text2num(target) - show_note(index = target) + browse_messages(index = target) - else if(href_list["shownoteckey"]) - var/target_ckey = href_list["shownoteckey"] - show_note(target_ckey) + else if(href_list["showmessages"]) + var/target = href_list["showmessages"] + browse_messages(index = target) - else if(href_list["shownoteckeylinkless"]) - var/target_ckey = href_list["shownoteckeylinkless"] - show_note(target_ckey, null, 1) + else if(href_list["showmemo"]) + browse_messages("memo") - else if(href_list["notessearch"]) - var/target = href_list["notessearch"] - show_note(index = target) + else if(href_list["showwatch"]) + browse_messages("watchlist entry") - else if(href_list["noteedits"]) - var/note_id = sanitizeSQL("[href_list["noteedits"]]") - var/DBQuery/query_noteedits = dbcon.NewQuery("SELECT edits FROM [format_table_name("notes")] WHERE id = '[note_id]'") - if(!query_noteedits.Execute()) - var/err = query_noteedits.ErrorMsg() - log_game("SQL ERROR obtaining edits from notes table. Error : \[[err]\]\n") + else if(href_list["showmessageckey"]) + var/target = href_list["showmessageckey"] + browse_messages(target_ckey = target) + + else if(href_list["showmessageckeylinkless"]) + var/target = href_list["showmessageckeylinkless"] + browse_messages(target_ckey = target, linkless = 1) + + else if(href_list["messageedits"]) + var/message_id = sanitizeSQL("[href_list["messageedits"]]") + var/DBQuery/query_get_message_edits = dbcon.NewQuery("SELECT edits FROM [format_table_name("messages")] WHERE id = '[message_id]'") + if(!query_get_message_edits.Execute()) + var/err = query_get_message_edits.ErrorMsg() + log_game("SQL ERROR obtaining edits from messages table. Error : \[[err]\]\n") return - if(query_noteedits.NextRow()) - var/edit_log = query_noteedits.item[1] + if(query_get_message_edits.NextRow()) + var/edit_log = query_get_message_edits.item[1] usr << browse(edit_log,"window=noteedits") - else if(href_list["secretnote"]) - var/note_id = href_list["secretnote"] - toggle_note_secrecy(note_id) - else if(href_list["newban"]) if(!check_rights(R_BAN)) return @@ -1170,48 +1214,6 @@ if("Cancel") return - //Watchlist - else if(href_list["watchadd"]) - var/target_ckey = locate(href_list["watchadd"]) - usr.client.watchlist_add(target_ckey) - - else if(href_list["watchremove"]) - var/target_ckey = href_list["watchremove"] - usr.client.watchlist_remove(target_ckey) - - else if(href_list["watchedit"]) - var/target_ckey = href_list["watchedit"] - usr.client.watchlist_edit(target_ckey) - - else if(href_list["watchaddbrowse"]) - usr.client.watchlist_add(null, 1) - - else if(href_list["watchremovebrowse"]) - var/target_ckey = href_list["watchremovebrowse"] - usr.client.watchlist_remove(target_ckey, 1) - - else if(href_list["watcheditbrowse"]) - var/target_ckey = href_list["watcheditbrowse"] - usr.client.watchlist_edit(target_ckey, 1) - - else if(href_list["watchsearch"]) - var/target_ckey = href_list["watchsearch"] - usr.client.watchlist_show(target_ckey) - - else if(href_list["watchshow"]) - usr.client.watchlist_show() - - else if(href_list["watcheditlog"]) - var/target_ckey = sanitizeSQL("[href_list["watcheditlog"]]") - var/DBQuery/query_watchedits = dbcon.NewQuery("SELECT edits FROM [format_table_name("watch")] WHERE ckey = '[target_ckey]'") - if(!query_watchedits.Execute()) - var/err = query_watchedits.ErrorMsg() - log_game("SQL ERROR obtaining edits from watch table. Error : \[[err]\]\n") - return - if(query_watchedits.NextRow()) - var/edit_log = query_watchedits.item[1] - usr << browse(edit_log,"window=watchedits") - else if(href_list["mute"]) if(!check_rights(R_ADMIN)) return @@ -2176,33 +2178,11 @@ FM.locked ^= 1 src.access_news_network() - else if(href_list["memoeditlist"]) - var/sql_key = sanitizeSQL("[href_list["memoeditlist"]]") - var/DBQuery/query_memoedits = dbcon.NewQuery("SELECT edits FROM [format_table_name("memo")] WHERE (ckey = '[sql_key]')") - if(!query_memoedits.Execute()) - var/err = query_memoedits.ErrorMsg() - log_game("SQL ERROR obtaining edits from memo table. Error : \[[err]\]\n") - return - if(query_memoedits.NextRow()) - var/edit_log = query_memoedits.item[1] - usr << browse(edit_log,"window=memoeditlist") - else if(href_list["check_antagonist"]) if(!check_rights(R_ADMIN)) return usr.client.check_antagonists() - else if(href_list["mentormemoeditlist"]) - var/sql_key = sanitizeSQL("[href_list["memoeditlist"]]") - var/DBQuery/query_memoedits = dbcon.NewQuery("SELECT edits FROM [format_table_name("mentor_memo")] WHERE (ckey = '[sql_key]')") - if(!query_memoedits.Execute()) - var/err = query_memoedits.ErrorMsg() - log_game("SQL ERROR obtaining edits from memo table. Error : \[[err]\]\n") - return - if(query_memoedits.NextRow()) - var/edit_log = query_memoedits.item[1] - usr << browse(edit_log,"window=mentormemoeditlist") - else if(href_list["kick_all_from_lobby"]) if(!check_rights(R_ADMIN)) return @@ -2277,3 +2257,14 @@ message_admins("[key_name(usr)] created \"[G.name]\" station goal.") ticker.mode.station_goals += G modify_goals() + + else if(href_list["mentormemoeditlist"]) + var/sql_key = sanitizeSQL("[href_list["memoeditlist"]]") + var/DBQuery/query_memoedits = dbcon.NewQuery("SELECT edits FROM [format_table_name("mentor_memo")] WHERE (ckey = '[sql_key]')") + if(!query_memoedits.Execute()) + var/err = query_memoedits.ErrorMsg() + log_game("SQL ERROR obtaining edits from memo table. Error : \[[err]\]\n") + return + if(query_memoedits.NextRow()) + var/edit_log = query_memoedits.item[1] + usr << browse(edit_log,"window=mentormemoeditlist") \ No newline at end of file diff --git a/code/modules/admin/watchlist.dm b/code/modules/admin/watchlist.dm deleted file mode 100644 index d5ac928272..0000000000 --- a/code/modules/admin/watchlist.dm +++ /dev/null @@ -1,119 +0,0 @@ -/client/proc/watchlist_add(target_ckey, browse = 0) - if(!target_ckey) - var/new_ckey = ckey(input(usr,"Who would you like to add to the watchlist?","Enter a ckey",null) as text) - if(!new_ckey) - return - new_ckey = sanitizeSQL(new_ckey) - var/DBQuery/query_watchfind = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[new_ckey]'") - if(!query_watchfind.Execute()) - var/err = query_watchfind.ErrorMsg() - log_game("SQL ERROR obtaining ckey from player table. Error : \[[err]\]\n") - return - if(!query_watchfind.NextRow()) - if(alert(usr, "[new_ckey] has not been seen before, are you sure you want to add them to the watchlist?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes") - return - target_ckey = new_ckey - var/target_sql_ckey = sanitizeSQL(target_ckey) - if(check_watchlist(target_sql_ckey)) - usr << "[target_sql_ckey] is already on the watchlist." - return - var/reason = input(usr,"Please State Reason","Reason") as message - if(!reason) - return - reason = sanitizeSQL(reason) - var/timestamp = SQLtime() - var/adminckey = usr.ckey - if(!adminckey) - return - var/admin_sql_ckey = sanitizeSQL(adminckey) - var/DBQuery/query_watchadd = dbcon.NewQuery("INSERT INTO [format_table_name("watch")] (ckey, reason, adminckey, timestamp) VALUES ('[target_sql_ckey]', '[reason]', '[admin_sql_ckey]', '[timestamp]')") - if(!query_watchadd.Execute()) - var/err = query_watchadd.ErrorMsg() - log_game("SQL ERROR during adding new watch entry. Error : \[[err]\]\n") - return - log_admin("[key_name(usr)] has added [target_ckey] to the watchlist - Reason: [reason]") - message_admins("[key_name_admin(usr)] has added [target_ckey] to the watchlist - Reason: [reason]", 1) - if(browse) - watchlist_show(target_sql_ckey) - - add_note(target_ckey, "Added to Watchlist - [reason]", null, usr.ckey, 0, null, 1) - -/client/proc/watchlist_remove(target_ckey, browse = 0) - var/target_sql_ckey = sanitizeSQL(target_ckey) - var/DBQuery/query_watchdel = dbcon.NewQuery("DELETE FROM [format_table_name("watch")] WHERE ckey = '[target_sql_ckey]'") - if(!query_watchdel.Execute()) - var/err = query_watchdel.ErrorMsg() - log_game("SQL ERROR during removing watch entry. Error : \[[err]\]\n") - return - log_admin("[key_name(usr)] has removed [target_ckey] from the watchlist") - message_admins("[key_name_admin(usr)] has removed [target_ckey] from the watchlist", 1) - if(browse) - watchlist_show() - -/client/proc/watchlist_edit(target_ckey, browse = 0) - var/target_sql_ckey = sanitizeSQL(target_ckey) - var/DBQuery/query_watchreason = dbcon.NewQuery("SELECT reason FROM [format_table_name("watch")] WHERE ckey = '[target_sql_ckey]'") - if(!query_watchreason.Execute()) - var/err = query_watchreason.ErrorMsg() - log_game("SQL ERROR obtaining reason from watch table. Error : \[[err]\]\n") - return - if(query_watchreason.NextRow()) - var/watch_reason = query_watchreason.item[1] - var/new_reason = input("Input new reason", "New Reason", "[watch_reason]") as message - new_reason = sanitizeSQL(new_reason) - if(!new_reason) - return - var/sql_ckey = sanitizeSQL(usr.ckey) - var/edit_text = "Edited by [sql_ckey] on [SQLtime()] from
[watch_reason]
to
[new_reason]
" - edit_text = sanitizeSQL(edit_text) - var/DBQuery/query_watchupdate = dbcon.NewQuery("UPDATE [format_table_name("watch")] SET reason = '[new_reason]', last_editor = '[sql_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE ckey = '[target_sql_ckey]'") - if(!query_watchupdate.Execute()) - var/err = query_watchupdate.ErrorMsg() - log_game("SQL ERROR editing watchlist reason. Error : \[[err]\]\n") - return - log_admin("[key_name(usr)] has edited [target_ckey]'s watchlist reason from [watch_reason] to [new_reason]") - message_admins("[key_name_admin(usr)] has edited [target_ckey]'s watchlist reason from
[watch_reason]
to
[new_reason]") - if(browse) - watchlist_show(target_sql_ckey) - -/client/proc/watchlist_show(search) - var/output - output += "
\ - \ - \ -
" - output += "\[Clear Search\] \[Add Ckey\]" - output += "
" - if(search) - search = "^[search]" - else - search = "^." - search = sanitizeSQL(search) - var/DBQuery/query_watchlist = dbcon.NewQuery("SELECT ckey, reason, adminckey, timestamp, last_editor FROM [format_table_name("watch")] WHERE ckey REGEXP '[search]' ORDER BY ckey") - if(!query_watchlist.Execute()) - var/err = query_watchlist.ErrorMsg() - log_game("SQL ERROR obtaining ckey, reason, adminckey, timestamp, last_editor from watch table. Error : \[[err]\]\n") - return - while(query_watchlist.NextRow()) - var/ckey = query_watchlist.item[1] - var/reason = query_watchlist.item[2] - var/adminckey = query_watchlist.item[3] - var/timestamp = query_watchlist.item[4] - var/last_editor = query_watchlist.item[5] - output += "[ckey] | Added by [adminckey] on [timestamp] \[Remove\] \[Edit Reason\]" - if(last_editor) - output += " Last edit by [last_editor] (Click here to see edit log)" - output += "
[reason]
" - usr << browse(output, "window=watchwin;size=900x500") - -/client/proc/check_watchlist(target_ckey) - var/target_sql_ckey = sanitizeSQL(target_ckey) - var/DBQuery/query_watch = dbcon.NewQuery("SELECT reason FROM [format_table_name("watch")] WHERE ckey = '[target_sql_ckey]'") - if(!query_watch.Execute()) - var/err = query_watch.ErrorMsg() - log_game("SQL ERROR obtaining reason from watch table. Error : \[[err]\]\n") - return - if(query_watch.NextRow()) - return query_watch.item[1] - else - return 0 diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 50272fde49..797215184a 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -69,7 +69,7 @@ // What the device does when turned on /obj/item/device/assembly/proc/activate() - if(qdeleted(src) || !secured || (next_activate > world.time)) + if(QDELETED(src) || !secured || (next_activate > world.time)) return FALSE next_activate = world.time + 30 return TRUE diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index bd49648711..3d3db696fb 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -252,7 +252,7 @@ else user << "You begin to replace the bulb." if(do_after(user, 20, target = src)) - if(flash.crit_fail || !flash || qdeleted(flash)) + if(flash.crit_fail || !flash || QDELETED(flash)) return crit_fail = FALSE times_used = 0 diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index e796d3cf64..4c52f127f5 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -149,15 +149,13 @@ /obj/effect/hotspot/Destroy() SetLuminosity(0) SSair.hotspots -= src - if(isturf(loc)) - var/turf/open/T = loc - if(T.active_hotspot == src) - T.active_hotspot = null + var/turf/open/T = loc + if(istype(T) && T.active_hotspot == src) + T.active_hotspot = null DestroyTurf() loc = null . = ..() - /obj/effect/hotspot/proc/DestroyTurf() if(isturf(loc)) var/turf/T = loc diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 88a2c65e7b..5a793d0bd9 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -142,7 +142,7 @@ Pipelines + Other Objects -> Pipe network user << "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?" unsafe_wrenching = TRUE //Oh dear oh dear - if (do_after(user, 20*W.toolspeed, target = src) && !qdeleted(src)) + if (do_after(user, 20*W.toolspeed, target = src) && !QDELETED(src)) user.visible_message( \ "[user] unfastens \the [src].", \ "You unfasten \the [src].", \ diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 7ae2313959..60942b7137 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -13,6 +13,7 @@ var/autoeject = FALSE var/volume = 100 var/running_bob_animation = 0 + var/efficiency = 1 var/sleep_factor = 750 var/paralyze_factor = 1000 @@ -26,7 +27,6 @@ var/radio_key = /obj/item/device/encryptionkey/headset_med var/radio_channel = "Medical" - /obj/machinery/atmospherics/components/unary/cryo_cell/New() ..() initialize_directions = dir @@ -144,6 +144,7 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/process() ..() + if(!on) return if(!is_operational()) @@ -214,12 +215,16 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/relaymove(mob/user) container_resist(user) -/obj/machinery/atmospherics/components/unary/cryo_cell/open_machine() +/obj/machinery/atmospherics/components/unary/cryo_cell/open_machine(drop = 0) if(!state_open && !panel_open) on = FALSE ..() - if(beaker) - beaker.forceMove(src) + for(var/mob/M in contents) //only drop mobs + M.forceMove(get_turf(src)) + if(isliving(M)) + var/mob/living/L = M + L.update_canmove() + occupant = null /obj/machinery/atmospherics/components/unary/cryo_cell/close_machine(mob/living/carbon/user) if((isnull(user) || istype(user)) && state_open && !panel_open) @@ -350,4 +355,4 @@ return //can't ventcrawl in or out of cryo. /obj/machinery/atmospherics/components/unary/cryo_cell/can_see_pipes() - return 0 //you can't see the pipe network when inside a cryo cell. \ No newline at end of file + return 0 //you can't see the pipe network when inside a cryo cell. diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index a0f93f31f4..d0941a516e 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -86,7 +86,7 @@ qdel(meter) . = ..() - if(parent && !qdeleted(parent)) + if(parent && !QDELETED(parent)) qdel(parent) parent = null diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index c9bdd58a30..86d08ebf1f 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -193,7 +193,7 @@ /obj/machinery/capture_the_flag/attack_ghost(mob/user) if(ctf_enabled == FALSE) return - if(ticker.current_state != GAME_STATE_PLAYING) + if(ticker.current_state < GAME_STATE_PLAYING) return if(user.ckey in team_members) if(user.ckey in recently_dead_ckeys) @@ -580,7 +580,7 @@ CTF.dead_barricades += src /obj/effect/ctf/dead_barricade/proc/respawn() - if(!qdeleted(src)) + if(!QDELETED(src)) new /obj/structure/barricade/security/ctf(get_turf(src)) qdel(src) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 0801b1c3d5..d3aeec4b8f 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -144,7 +144,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null return if(!detect()) return - if(!awaygate || qdeleted(awaygate)) + if(!awaygate || QDELETED(awaygate)) return if(awaygate.calibrated) @@ -214,7 +214,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null return if(!active) return - if(!stationgate || qdeleted(stationgate)) + if(!stationgate || QDELETED(stationgate)) return if(istype(AM, /mob/living/carbon)) var/mob/living/carbon/C = AM diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index b920c6dd4c..d12141e230 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -91,6 +91,8 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they return FALSE if(!get_cost(O, contr, emag)) return FALSE + if(O.flags & HOLOGRAM) + return FALSE return TRUE // Called only once, when the object is actually sold by the datum. diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 7b6b468c38..cf6a29d701 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -69,18 +69,6 @@ src << "Your previous action was ignored because you've done too many in a second" return - //Logs all hrefs - if(config && config.log_hrefs && href_logfile) - href_logfile << "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" - - // Admin PM - if(href_list["priv_msg"]) - if (href_list["ahelp_reply"]) - cmd_ahelp_reply(href_list["priv_msg"]) - return - cmd_admin_pm(href_list["priv_msg"],null) - return - if(href_list["mentor_msg"]) if(config.mentors_mobname_only) var/mob/M = locate(href_list["mentor_msg"]) @@ -93,6 +81,14 @@ if(config && config.log_hrefs && href_logfile) href_logfile << "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" + // Admin PM + if(href_list["priv_msg"]) + if (href_list["ahelp_reply"]) + cmd_ahelp_reply(href_list["priv_msg"]) + return + cmd_admin_pm(href_list["priv_msg"],null) + return + switch(href_list["_src_"]) if("holder") hsrc = holder @@ -257,7 +253,7 @@ var/next_external_rsc = 0 if(holder) add_admin_verbs() - admin_memo_output("Show") + src << get_message_output("memo") adminGreet() if((global.comms_key == "default_pwd" || length(global.comms_key) <= 6) && global.comms_allowed) //It's the default value or less than 6 characters long, but it somehow didn't disable comms. src << "The server's API key is either too short or is the default value! Consider changing it immediately!" @@ -294,7 +290,7 @@ var/next_external_rsc = 0 findJoinDate() sync_client_with_db(tdata) - + get_message_output("watchlist entry", ckey) check_ip_intel() send_resources() @@ -318,7 +314,7 @@ var/next_external_rsc = 0 if(config && config.autoconvert_notes) convert_notes_sql(ckey) - + src << get_message_output("message", ckey) if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. src << "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you." @@ -399,12 +395,6 @@ var/next_external_rsc = 0 if (check_randomizer(connectiontopic)) return - var/watchreason = check_watchlist(sql_ckey) - if(watchreason) - current_watchlist[sql_ckey] = watchreason - message_admins("Notice: [key_name_admin(src)] is on the watchlist and has just connected - Reason: [watchreason]") -// send2irc_adminless_only("Watchlist", "[key_name(src)] is on the watchlist and has just connected - Reason: [watchreason]") - var/sql_ip = sanitizeSQL(src.address) var/sql_computerid = sanitizeSQL(src.computer_id) var/sql_admin_rank = sanitizeSQL(admin_rank) @@ -499,24 +489,24 @@ var/next_external_rsc = 0 var/const/adminckey = "CID-Error" var/sql_ckey = sanitizeSQL(ckey) //check to see if we noted them in the last day. - var/DBQuery/query_get_notes = dbcon.NewQuery("SELECT id FROM [format_table_name("notes")] WHERE ckey = '[sql_ckey]' AND adminckey = '[adminckey]' AND timestamp + INTERVAL 1 DAY < NOW()") + var/DBQuery/query_get_notes = dbcon.NewQuery("SELECT id FROM [format_table_name("messages")] WHERE type = 'note' AND targetckey = '[sql_ckey]' AND adminckey = '[adminckey]' AND timestamp + INTERVAL 1 DAY < NOW()") if(!query_get_notes.Execute()) var/err = query_get_notes.ErrorMsg() - log_game("SQL ERROR obtaining id from notes table. Error : \[[err]\]\n") + log_game("SQL ERROR obtaining id from messages table. Error : \[[err]\]\n") return if (query_get_notes.NextRow()) return //regardless of above, make sure their last note is not from us, as no point in repeating the same note over and over. - query_get_notes = dbcon.NewQuery("SELECT adminckey FROM [format_table_name("notes")] WHERE ckey = '[sql_ckey]' ORDER BY timestamp DESC LIMIT 1") + query_get_notes = dbcon.NewQuery("SELECT adminckey FROM [format_table_name("messages")] WHERE targetckey = '[sql_ckey]' ORDER BY timestamp DESC LIMIT 1") if(!query_get_notes.Execute()) var/err = query_get_notes.ErrorMsg() - log_game("SQL ERROR obtaining id from notes table. Error : \[[err]\]\n") + log_game("SQL ERROR obtaining adminckey from notes table. Error : \[[err]\]\n") return if (query_get_notes.NextRow()) if (query_get_notes.item[1] == adminckey) return - add_note(ckey, "Detected as using a cid randomizer.", null, adminckey, 0, null, 0) + create_message("note", sql_ckey, adminckey, "Detected as using a cid randomizer.", null, null, 0, 0) /client/proc/check_ip_intel() @@ -584,3 +574,9 @@ var/next_external_rsc = 0 return FALSE if ("key") return FALSE + +/client/proc/change_view(new_size) + if (isnull(new_size)) + CRASH("change_view called without argument.") + + view = new_size diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 173cbda3f7..3036ee0326 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -156,7 +156,7 @@ var/global/normal_ooc_colour = OOC_COLOR usr << "Sorry, that function is not enabled on this server." return - show_note(usr.ckey, null, 1) + browse_messages(null, usr.ckey, null, 1) /client/proc/ignore_key(client) var/client/C = client diff --git a/code/modules/client/verbs/sethotkeys.dm b/code/modules/client/verbs/sethotkeys.dm index f7bf137c31..ee14787011 100644 --- a/code/modules/client/verbs/sethotkeys.dm +++ b/code/modules/client/verbs/sethotkeys.dm @@ -1,6 +1,7 @@ /client/verb/sethotkeys(from_pref = 0 as num) set name = "Set Hotkeys" - set hidden = 1 + set hidden = TRUE + set waitfor = FALSE set desc = "Used to set mob-specific hotkeys or load hoykey mode from preferences" var/hotkey_default = "default" @@ -21,4 +22,4 @@ if(current_setting in default_macros) winset(src, null, "mainwindow.macro=[hotkey_default] input.focus=true input.background-color=#d3b5b5") else - winset(src, null, "mainwindow.macro=[hotkey_macro] mapwindow.map.focus=true input.background-color=#e0e0e0") \ No newline at end of file + winset(src, null, "mainwindow.macro=[hotkey_macro] mapwindow.map.focus=true input.background-color=#e0e0e0") diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 9802a2421e..781f06b4ac 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -4,7 +4,10 @@ set hidden = 1 if(!canSuicide()) return + var/oldkey = ckey var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + if(ckey != oldkey) + return if(!canSuicide()) return if(confirm == "Yes") diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 46ac98b224..ff281a7cb3 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -97,7 +97,7 @@ for(var/obj/item/I in user.held_items) if(I in hands_nodrop) I.flags &= ~NODROP - if(phase_underlay && !qdeleted(phase_underlay)) + if(phase_underlay && !QDELETED(phase_underlay)) user.underlays -= phase_underlay qdel(phase_underlay) phase_underlay = null diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index fe099ed9a9..05b2091a59 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -1272,12 +1272,12 @@ /obj/item/clothing/head/helmet/space/hardsuit/flightsuit/proc/toggle_zoom(mob/living/user, force_off = FALSE) if(zoom || force_off) - user.client.view = world.view + user.client.change_view(world.view) user << "Disabling smart zooming image enhancement..." zoom = FALSE return FALSE else - user.client.view = zoom_range + user.client.change_view(zoom_range) user << "Enabling smart zooming image enhancement!" zoom = TRUE return TRUE diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 7066250cd5..359afc302f 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -39,10 +39,43 @@ name = "plasma envirosuit helmet" desc = "A special containment helmet that allows plasma-based lifeforms to exist safely in an oxygenated environment. It is space-worthy, and may be worn in tandem with other EVA gear." icon_state = "plasmaman-helm" - item_color = "plasma" //needed for the helmet lighting item_state = "plasmaman-helm" strip_delay = 80 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 0, fire = 100, acid = 75) resistance_flags = FIRE_PROOF + var/brightness_on = 4 //luminosity when the light is on + var/on = 0 + actions_types = list(/datum/action/item_action/toggle_helmet_light) +/obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user) + on = !on + icon_state = "[initial(icon_state)][on ? "-light":""]" + item_state = icon_state + user.update_inv_head() //So the mob overlay updates + + if(on) + turn_on(user) + else + turn_off(user) + for(var/X in actions) + var/datum/action/A=X + A.UpdateButtonIcon() + +/obj/item/clothing/head/helmet/space/plasmaman/pickup(mob/user) + ..() + if(on) + user.AddLuminosity(brightness_on) + SetLuminosity(0) + +/obj/item/clothing/head/helmet/space/plasmaman/dropped(mob/user) + ..() + if(on) + user.AddLuminosity(-brightness_on) + SetLuminosity(brightness_on) + +/obj/item/clothing/head/helmet/space/plasmaman/proc/turn_on/(mob/user) + user.AddLuminosity(brightness_on) + +/obj/item/clothing/head/helmet/space/plasmaman/proc/turn_off/(mob/user) + user.AddLuminosity(-brightness_on) diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 94569f769e..671105f5c5 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -327,6 +327,16 @@ category = CAT_MISC +/datum/crafting_recipe/flashlight_eyes + name = "Flashlight Eyes" + result = /obj/item/organ/eyes/robotic/flashlight + time = 10 + reqs = list( + /obj/item/device/flashlight = 2, + /obj/item/weapon/restraints/handcuffs/cable = 1 + ) + category = CAT_MISC + /datum/crafting_recipe/chemical_payload name = "Chemical Payload (C4)" result = /obj/item/weapon/bombcore/chemical diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index fc2795110c..67651c6bee 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -37,7 +37,7 @@ /datum/round_event/ghost_role/alien_infestation/spawn_role() var/list/vents = list() for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in machines) - if(qdeleted(temp_vent)) + if(QDELETED(temp_vent)) continue if(temp_vent.loc.z == ZLEVEL_STATION && !temp_vent.welded) var/datum/pipeline/temp_vent_parent = temp_vent.PARENT1 diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index f7f03366c8..d70c38722a 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -40,7 +40,7 @@ /datum/round_event/brand_intelligence/tick() - if(!originMachine || qdeleted(originMachine) || originMachine.shut_up || originMachine.wires.is_all_cut()) //if the original vending machine is missing or has it's voice switch flipped + if(!originMachine || QDELETED(originMachine) || originMachine.shut_up || originMachine.wires.is_all_cut()) //if the original vending machine is missing or has it's voice switch flipped for(var/obj/machinery/vending/saved in infectedMachines) saved.shoot_inventory = 0 if(originMachine) @@ -51,7 +51,7 @@ vendingMachines = removeNullsFromList(vendingMachines) if(!vendingMachines.len) //if every machine is infected for(var/obj/machinery/vending/upriser in infectedMachines) - if(prob(70) && !qdeleted(upriser)) + if(prob(70) && !QDELETED(upriser)) var/mob/living/simple_animal/hostile/mimic/copy/M = new(upriser.loc, upriser, null, 1) // it will delete upriser on creation and override any machine checks M.faction = list("profit") M.speak = rampant_speeches.Copy() diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index ec15894f57..bcb215ff93 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -19,6 +19,45 @@ var/obj/item/weapon/storage/backpack/b = locate() in H.contents new /obj/item/weapon/reagent_containers/food/snacks/candyheart(b) + + var/list/valentines = list() + for(var/mob/living/M in player_list) + if(!M.stat && M.client && M.mind) + valentines |= M + + + while(valentines.len) + var/mob/living/L = pick_n_take(valentines) + if(valentines.len) + var/mob/living/date = pick_n_take(valentines) + + + forge_valentines_objective(L, date) + + forge_valentines_objective(date, L) + + + + else + L << "You didn't get a date! They're all having fun without you! you'll show them though..." + var/datum/objective/martyr/normiesgetout = new + normiesgetout.owner = L.mind + ticker.mode.traitors |= L.mind + L.mind.objectives += normiesgetout + +/proc/forge_valentines_objective(mob/living/lover,mob/living/date) + + ticker.mode.traitors |= lover.mind + lover.mind.special_role = "valentine" + + var/datum/objective/protect/protect_objective = new /datum/objective/protect + protect_objective.owner = lover.mind + protect_objective.target = date.mind + protect_objective.explanation_text = "Protect [date.real_name], your date." + lover.mind.objectives += protect_objective + lover << "You're on a date with [date]! Protect them at all costs. This takes priority over all other loyalties." + + /datum/round_event/valentines/announce() priority_announce("It's Valentine's Day! Give a valentine to that special someone!") @@ -126,4 +165,4 @@ "A heart-shaped candy that reads: FACEHUGGER", "A heart-shaped candy that reads: DOMINATOR", "A heart-shaped candy that reads: GET TESLA'D") - icon_state = pick("candyheart", "candyheart2", "candyheart3", "candyheart4") \ No newline at end of file + icon_state = pick("candyheart", "candyheart2", "candyheart3", "candyheart4") diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index 443135cfcb..2ef42bb25f 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -35,6 +35,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 anchored = 1 var/z_original = 0 var/destination + var/notify = TRUE /obj/effect/immovablerod/New(atom/start, atom/end) ..() @@ -42,9 +43,10 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 SSaugury.register_doom(src, 2000) z_original = z destination = end - notify_ghosts("\A [src] is inbound!", - enter_link="(Click to orbit)", - source=src, action=NOTIFY_ORBIT) + if(notify) + notify_ghosts("\A [src] is inbound!", + enter_link="(Click to orbit)", + source=src, action=NOTIFY_ORBIT) poi_list += src if(end && end.z==z_original) walk_towards(src, destination, 1) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 5b94c6a566..4e68fc6fed 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -497,7 +497,7 @@ var/list/obj/structure/spacevine/queue_end = list() for(var/obj/structure/spacevine/SV in growth_queue) - if(qdeleted(SV)) + if(QDELETED(SV)) continue i++ queue_end += SV diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index cc2c98e998..ef7a59c666 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -147,3 +147,10 @@ list_reagents = list("nutriment" = 6, "vitamin" = 1) bitesize = 3 w_class = WEIGHT_CLASS_NORMAL + +/obj/item/weapon/reagent_containers/food/snacks/deepfryholder + name = "Deep Fried Foods Holder Obj" + desc = "If you can see this description the code for the deep fryer fucked up." + icon = 'icons/obj/food/food.dmi' + icon_state = "" + bitesize = 2 diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm new file mode 100644 index 0000000000..56b1c12fee --- /dev/null +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -0,0 +1,118 @@ +/* +April 3rd, 2014 marks the day this machine changed the face of the kitchen on NTStation13 +God bless America. +insert ascii eagle on american flag background here +*/ + +// April 3rd, 2014 marks the day this machine changed the face of the kitchen on NTStation13 +// God bless America. +/obj/machinery/deepfryer + name = "deep fryer" + desc = "Deep fried everything." + icon = 'icons/obj/kitchen.dmi' + icon_state = "fryer_off" + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 5 + container_type = OPENCONTAINER + var/obj/item/frying = null //What's being fried RIGHT NOW? + var/cook_time = 0 + +/obj/item/weapon/circuitboard/machine/deep_fryer + name = "circuit board (Deep Fryer)" + build_path = /obj/machinery/deepfryer + origin_tech = "programming=1" + req_components = list(/obj/item/weapon/stock_parts/micro_laser = 1) + +/obj/machinery/deepfryer/New() + ..() + create_reagents(50) + reagents.add_reagent("nutriment", 25) + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/machine/deep_fryer(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) + RefreshParts() + +/obj/machinery/deepfryer/examine() + ..() + if(frying) + usr << "You can make out [frying] in the oil." + +/obj/machinery/deepfryer/attackby(obj/item/I, mob/user) + if(!reagents.total_volume) + user << "There's nothing to fry with in [src]!" + return + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/deepfryholder)) + user << "Your cooking skills are not up to the legendary Doublefry technique." + return + else + if(user.drop_item() && !frying) + user << "You put [I] into [src]." + frying = I + frying.forceMove(src) + icon_state = "fryer_on" + +/obj/machinery/deepfryer/process() + ..() + if(!reagents.total_volume) + return + if(frying) + cook_time++ + if(cook_time == 30) + playsound(src.loc, "sound/machines/ding.ogg", 50, 1) + visible_message("[src] dings!") + else if (cook_time == 60) + visible_message("[src] emits an acrid smell!") + + +/obj/machinery/deepfryer/attack_hand(mob/user) + if(frying) + if(frying.loc == src) + user << "You eject [frying] from [src]." + var/obj/item/weapon/reagent_containers/food/snacks/deepfryholder/S = new(get_turf(src)) + if(istype(frying, /obj/item/weapon/reagent_containers/)) + var/obj/item/weapon/reagent_containers/food = frying + food.reagents.trans_to(S, food.reagents.total_volume) + S.icon = frying.icon + S.overlays = frying.overlays + S.icon_state = frying.icon_state + S.desc = frying.desc + reagents.trans_to(S, 2*(cook_time/15)) + switch(cook_time) + if(0 to 15) + S.color = rgb(166,103,54) + S.name = "lightly-fried [frying.name]" + if(16 to 49) + S.color = rgb(103,63,24) + S.name = "fried [frying.name]" + if(50 to 59) + S.color = rgb(63, 23, 4) + S.name = "deep-fried [frying.name]" + if(60 to INFINITY) + S.color = rgb(33,19,9) + S.name = "the physical manifestation of the very concept of fried foods" + S.desc = "A heavily fried...something. Who can tell anymore?" + S.filling_color = S.color + if(istype(frying, /obj/item/weapon/reagent_containers/food/snacks/)) + qdel(frying) + else + frying.forceMove(S) + + icon_state = "fryer_off" + user.put_in_hands(S) + frying = null + cook_time = 0 + return + else if(user.pulling && user.a_intent == "grab" && iscarbon(user.pulling) && reagents.total_volume) + if(user.grab_state < GRAB_AGGRESSIVE) + user << "You need a better grip to do that!" + return + var/mob/living/carbon/C = user.pulling + user.visible_message("[user] dunks [C]'s face in [src]!") + reagents.reaction(C, TOUCH) + C.adjustFireLoss(reagents.total_volume) + reagents.remove_any((reagents.total_volume/2)) + C.Weaken(3) + user.changeNext_move(CLICK_CD_MELEE) + ..() \ No newline at end of file diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index da214333a2..a3c3e6c2b3 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -33,6 +33,9 @@ if(istype(O,/obj/machinery)) var/obj/machinery/M = O M.power_change() + + if(holoitem) + O.flags |= HOLOGRAM return O diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 3f513f0a7d..de43b317af 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -194,16 +194,16 @@ /obj/machinery/computer/holodeck/Destroy() emergency_shutdown() - ..() + return ..() /obj/machinery/computer/holodeck/emp_act(severity) emergency_shutdown() - ..() + return ..() /obj/machinery/computer/holodeck/ex_act(severity, target) emergency_shutdown() - ..() + return ..() /obj/machinery/computer/holodeck/blob_act(obj/structure/blob/B) emergency_shutdown() - ..() \ No newline at end of file + return ..() \ No newline at end of file diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 36406bcc6a..71e6debf25 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -130,7 +130,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE) if(!disassembled) prime() - if(!qdeleted(src)) + if(!QDELETED(src)) qdel(src) /obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/ex_act(severity) diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index cdab5f9e15..e94c0d9a41 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -130,7 +130,7 @@ awakening = 1 spawn(30) - if(!qdeleted(src)) + if(!QDELETED(src)) var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(get_turf(src.loc)) K.maxHealth += round(seed.endurance / 3) K.melee_damage_lower += round(seed.potency / 10) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 6d305bce7a..1c18e485ad 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -685,7 +685,7 @@ return if(alert(user, "This will make [src] self-sustaining but consume [O] forever. Are you sure?", "[name]", "I'm Sure", "Abort") == "Abort" || !user) return - if(!O || qdeleted(O)) + if(!O || QDELETED(O)) return if(!Adjacent(user)) return diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index 7129e39b12..9fe97f8253 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -277,4 +277,4 @@ Janitor belt = /obj/item/device/pda/janitor ears = /obj/item/device/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/janitor - backpack_contents = list(/obj/item/device/modular_computer/tablet/preset/advanced=1) + backpack_contents = list(/obj/item/device/modular_computer/tablet/preset/advanced=1, /obj/item/soapstone/empty=1) diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm index 031fa08fa0..a512f12125 100644 --- a/code/modules/library/soapstone.dm +++ b/code/modules/library/soapstone.dm @@ -1,6 +1,6 @@ /obj/item/soapstone name = "chisel" - desc = "Leave informative messages for the crew, including the crew of future shifts!\n(Not suitable for engraving on shuttles, off station or on cats. Side effects may include beatings, bannings and orbital bombardment.)" + desc = "Leave informative messages for the crew, including the crew of future shifts!\nEven if out of uses, it can still be used to remove messages.\n(Not suitable for engraving on shuttles, off station or on cats. Side effects may include beatings, bannings and orbital bombardment.)" icon = 'icons/obj/items.dmi' icon_state = "soapstone" throw_speed = 3 @@ -18,6 +18,7 @@ /obj/item/soapstone/New() . = ..() random_name() + check_name() // could start empty /obj/item/soapstone/proc/random_name() name = pick("soapstone", "chisel", "chalk", "magic marker") @@ -58,7 +59,7 @@ if(already_message) our_message = already_message.creator_key == user.ckey - if(!remaining_uses && !our_message) + if(!remaining_uses && !already_message) // The dull chisel is dull. user << "[src] is [w_dull]." return @@ -73,15 +74,13 @@ // Removing our own messages refunds a charge - if((our_message || can_use()) && do_after(user, tool_speed, target=target) && (our_message || can_use())) + if(do_after(user, tool_speed, target=target)) user.visible_message("[user] has erased [already_message].", "You erased [already_message].") already_message.persists = FALSE qdel(already_message) playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1) if(our_message) refund_use() - else - remove_use() return var/message = stripped_input(user, "What would you like to [w_engrave]?", "[name] Message") @@ -115,18 +114,19 @@ return remaining_uses-- - if(!remaining_uses) - non_dull_name = name - name = "[w_dull] [name]" + check_name() /obj/item/soapstone/proc/refund_use() if(remaining_uses == -1) return - var/was_dull = !remaining_uses remaining_uses++ + check_name() - if(was_dull) +/obj/item/soapstone/proc/check_name() + if(remaining_uses) name = non_dull_name + else + name = "[w_dull] [name]" /* Persistent engraved messages, etched onto the station turfs to serve as instructions and/or memes for the next generation of spessmen. @@ -138,6 +138,9 @@ /obj/item/soapstone/infinite remaining_uses = -1 +/obj/item/soapstone/empty + remaining_uses = 0 + /proc/good_chisel_message_location(turf/T) if(!T) . = FALSE @@ -176,6 +179,9 @@ persists = FALSE qdel(src) +/obj/structure/chisel_message/singularity_pull() + return + /obj/structure/chisel_message/proc/register(mob/user, newmessage) hidden_message = newmessage creator_name = user.real_name diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 3446a42c99..3073c3bd08 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -144,7 +144,7 @@ var/list/total_extraction_beacons = list() icon_state = "subspace_amplifier" /obj/item/fulton_core/attack_self(mob/user) - if(do_after(user,15,target = user) && !qdeleted(src)) + if(do_after(user,15,target = user) && !QDELETED(src)) new /obj/structure/extraction_point(get_turf(user)) qdel(src) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index dfed01db9e..fece3a809b 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -355,7 +355,7 @@ icon = 'icons/obj/lavaland/dragonboat.dmi' resistance_flags = LAVA_PROOF | FIRE_PROOF -/obj/vehicle/lavaboat/buckle_mob() +/obj/vehicle/lavaboat/buckle_mob(mob/living/M, force = 0, check_loc = 1) . = ..() riding_datum = new/datum/riding/boat @@ -403,7 +403,7 @@ desc = "This boat moves where you will it, without the need for an oar." icon_state = "dragon_boat" -/obj/vehicle/lavaboat/dragon/buckle_mob() +/obj/vehicle/lavaboat/dragon/buckle_mob(mob/living/M, force = 0, check_loc = 1) ..() riding_datum = new/datum/riding/boat/dragon @@ -831,7 +831,7 @@ blast_range -= round(health_percent * 10) //one additional range for each missing 10% of health /obj/item/weapon/hierophant_club/update_icon() - icon_state = "hierophant_club[timer <= world.time ? "_ready":""][(beacon && !qdeleted(beacon)) ? "":"_beacon"]" + icon_state = "hierophant_club[timer <= world.time ? "_ready":""][(beacon && !QDELETED(beacon)) ? "":"_beacon"]" item_state = icon_state if(ismob(loc)) var/mob/M = loc @@ -853,7 +853,7 @@ if(!user.is_holding(src)) //you need to hold the staff to teleport user << "You need to hold the club in your hands to [beacon ? "teleport with it":"detach the beacon"]!" return - if(!beacon || qdeleted(beacon)) + if(!beacon || QDELETED(beacon)) if(isturf(user.loc)) user.visible_message("[user] starts fiddling with [src]'s pommel...", \ "You start detaching the hierophant beacon...") @@ -906,7 +906,7 @@ new /obj/effect/overlay/temp/hierophant/telegraph(source, user) playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1) playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1) - if(!do_after(user, 3, target = user) || !user || !beacon || qdeleted(beacon)) //no walking away shitlord + if(!do_after(user, 3, target = user) || !user || !beacon || QDELETED(beacon)) //no walking away shitlord teleporting = FALSE if(user) user.update_action_buttons_icon() diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index ae34f20087..df703a94dc 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -167,7 +167,7 @@ var/items = list("Survival Capsule and Explorer's Webbing", "Resonator and Advanced Scanner", "Mining Drone", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit") var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items - if(!selection || !Adjacent(redeemer) || qdeleted(voucher) || voucher.loc != redeemer) + if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) return switch(selection) if("Survival Capsule and Explorer's Webbing") diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index 0615e7effb..a812617eb7 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -73,7 +73,7 @@ var/global/posibrain_notif_cooldown = 0 return var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No") - if(posi_ask == "No" || qdeleted(src)) + if(posi_ask == "No" || QDELETED(src)) return transfer_personality(user) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 5c26e69662..516e00effb 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -42,13 +42,13 @@ create_internal_organs() - AddAbility(new/obj/effect/proc_holder/alien/nightvisiontoggle(null)) ..() /mob/living/carbon/alien/create_internal_organs() internal_organs += new /obj/item/organ/brain/alien internal_organs += new /obj/item/organ/alien/hivenode internal_organs += new /obj/item/organ/tongue/alien + internal_organs += new /obj/item/organ/eyes/night_vision/alien ..() /mob/living/carbon/alien/assess_threat() // beepsky won't hunt aliums @@ -152,40 +152,5 @@ Des: Removes all infected images from the alien. #undef HEAT_DAMAGE_LEVEL_2 #undef HEAT_DAMAGE_LEVEL_3 - -/mob/living/carbon/alien/update_sight() - if(!client) - return - if(stat == DEAD) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_OBSERVER - return - - sight = SEE_MOBS - if(nightvision) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - else - see_in_dark = 4 - see_invisible = SEE_INVISIBLE_LIVING - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - - for(var/obj/item/organ/cyberimp/eyes/E in internal_organs) - sight |= E.sight_flags - if(E.dark_view) - see_in_dark = max(see_in_dark, E.dark_view) - if(E.see_invisible) - see_invisible = min(see_invisible, E.see_invisible) - - if(see_override) - see_invisible = see_override - /mob/living/carbon/alien/can_hold_items() return has_fine_manipulation diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 103ace63e7..cb4020c98d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -286,26 +286,6 @@ Doesn't work on other aliens/AI.*/ user.visible_message("[user] hurls out the contents of their stomach!") return -/obj/effect/proc_holder/alien/nightvisiontoggle - name = "Toggle Night Vision" - desc = "Toggles Night Vision" - plasma_cost = 0 - has_action = 0 // Has dedicated GUI button already - -/obj/effect/proc_holder/alien/nightvisiontoggle/fire(mob/living/carbon/alien/user) - if(!user.nightvision) - user.see_in_dark = 8 - user.see_invisible = SEE_INVISIBLE_MINIMUM - user.nightvision = 1 - user.hud_used.nightvisionicon.icon_state = "nightvision1" - else if(user.nightvision == 1) - user.see_in_dark = 4 - user.see_invisible = 45 - user.nightvision = 0 - user.hud_used.nightvisionicon.icon_state = "nightvision0" - - return 1 - /obj/effect/proc_holder/alien/sneak name = "Sneak" desc = "Blend into the shadows to stalk your prey." diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index a148473f03..984e4111c0 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -141,7 +141,7 @@ recent_queen_death = 1 owner.throw_alert("alien_noqueen", /obj/screen/alert/alien_vulnerable) spawn(2400) //four minutes - if(qdeleted(src)) //In case the node is deleted + if(QDELETED(src)) //In case the node is deleted return recent_queen_death = 0 if(!owner) //In case the xeno is butchered or subjected to surgery after death. diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 82d1c20baf..fba1682828 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -529,21 +529,34 @@ see_invisible = SEE_INVISIBLE_OBSERVER return - see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) sight = initial(sight) + var/obj/item/organ/eyes/E = getorganslot("eye_sight") + if(!E) + update_tint() + else + see_invisible = E.see_invisible + see_in_dark = E.see_in_dark + sight |= E.sight_flags if(client.eye != src) var/atom/A = client.eye if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return - for(var/obj/item/organ/cyberimp/eyes/E in internal_organs) - sight |= E.sight_flags - if(E.dark_view) - see_in_dark = max(see_in_dark,E.dark_view) - if(E.see_invisible) - see_invisible = min(see_invisible, E.see_invisible) + if(glasses) + var/obj/item/clothing/glasses/G = glasses + sight |= G.vision_flags + see_in_dark = max(G.darkness_view, see_in_dark) + if(G.invis_override) + see_invisible = G.invis_override + else + see_invisible = min(G.invis_view, see_invisible) + if(dna) + for(var/X in dna.mutations) + var/datum/mutation/M = X + if(M.name == XRAY) + sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_in_dark = max(see_in_dark, 8) if(see_override) see_invisible = see_override @@ -569,6 +582,13 @@ if(wear_mask) . += wear_mask.tint + var/obj/item/organ/eyes/E = getorganslot("eye_sight") + if(E) + . += E.tint + + else + . += INFINITY + //this handles hud updates /mob/living/carbon/update_damage_hud() @@ -709,7 +729,7 @@ return 0 /mob/living/carbon/harvest(mob/living/user) - if(qdeleted(src)) + if(QDELETED(src)) return var/organs_amt = 0 for(var/X in internal_organs) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index a53930c3f7..313aef8fd3 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -1,8 +1,12 @@ /mob/living/carbon/get_eye_protection() var/number = ..() - for(var/obj/item/organ/cyberimp/eyes/EFP in internal_organs) - number += EFP.flash_protect + + var/obj/item/organ/eyes/E = getorganslot("eye_sight") + if(!E) + number = INFINITY //Can't get flashed without eyes + else + number += E.flash_protect return number /mob/living/carbon/get_ear_protection() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3d620a37dc..b455fd754f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -47,6 +47,8 @@ internal_organs += new /obj/item/organ/lungs() if(!(NOBLOOD in dna.species.species_traits)) internal_organs += new /obj/item/organ/heart + + internal_organs += new dna.species.mutanteyes() internal_organs += new /obj/item/organ/brain ..() @@ -764,17 +766,6 @@ if(R) R.fields["name"] = newname -/mob/living/carbon/human/update_sight() - if(!client) - return - if(stat == DEAD) - sight = (SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_OBSERVER - return - - dna.species.update_sight(src) - /mob/living/carbon/human/get_total_tint() . = ..() if(glasses) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 6e18691730..73cdf949f0 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -15,8 +15,6 @@ var/name = null // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever var/roundstart = 0 // can this mob be chosen at roundstart? (assuming the config option is checked?) var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race - - var/eyes = "eyes" // which eyes the race uses. at the moment, the only types of eyes are "eyes" (regular eyes) and "jelleyes" (three eyes) var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows var/hair_color = null // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent. @@ -47,9 +45,6 @@ var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded? var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"] - var/invis_sight = SEE_INVISIBLE_LIVING - var/darksight = 2 - // species flags. these can be found in flags.dm var/list/species_traits = list() @@ -65,6 +60,9 @@ //Flight and floating var/override_float = 0 + //Eyes + var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes + //Citadel snowflake var/fixed_mut_color2 = "" var/fixed_mut_color3 = "" @@ -250,6 +248,13 @@ var/obj/item/bodypart/head/HD = H.get_bodypart("head") + // eyes + var/has_eyes = TRUE + + if(!H.getorgan(/obj/item/organ/eyes) && HD) + standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "eyes_missing", "layer" = -BODY_LAYER) + has_eyes = FALSE + if(!(H.disabilities & HUSK)) // lipstick if(H.lip_style && (LIPS in species_traits) && HD) @@ -258,8 +263,8 @@ standing += lips // eyes - if((EYECOLOR in species_traits) && HD) - var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[eyes]", "layer" = -BODY_LAYER) + if((EYECOLOR in species_traits) && HD && has_eyes) + var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes", "layer" = -BODY_LAYER) img_eyes.color = "#" + H.eye_color standing += img_eyes @@ -867,7 +872,6 @@ hunger_rate = 3 * HUNGER_FACTOR H.nutrition = max(0, H.nutrition - hunger_rate) - if (H.nutrition > NUTRITION_LEVEL_FULL) if(H.overeatduration < 600) //capped so people don't take forever to unfat H.overeatduration++ @@ -901,42 +905,6 @@ else H.throw_alert("nutrition", /obj/screen/alert/starving) - -/datum/species/proc/update_sight(mob/living/carbon/human/H) - H.sight = initial(H.sight) - H.see_in_dark = darksight - H.see_invisible = invis_sight - - if(H.client.eye != H) - var/atom/A = H.client.eye - if(A.update_remote_sight(H)) //returns 1 if we override all other sight updates. - return - - for(var/obj/item/organ/cyberimp/eyes/E in H.internal_organs) - H.sight |= E.sight_flags - if(E.dark_view) - H.see_in_dark = E.dark_view - if(E.see_invisible) - H.see_invisible = min(H.see_invisible, E.see_invisible) - - if(H.glasses) - var/obj/item/clothing/glasses/G = H.glasses - H.sight |= G.vision_flags - H.see_in_dark = max(G.darkness_view, H.see_in_dark) - if(G.invis_override) - H.see_invisible = G.invis_override - else - H.see_invisible = min(G.invis_view, H.see_invisible) - - for(var/X in H.dna.mutations) - var/datum/mutation/M = X - if(M.name == XRAY) - H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) - H.see_in_dark = max(H.see_in_dark, 8) - - if(H.see_override) //Override all - H.see_invisible = H.see_override - /datum/species/proc/update_health_hud(mob/living/carbon/human/H) return 0 diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 33d0c61f82..109a14c7f7 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -1,7 +1,6 @@ /datum/species/abductor name = "Abductor" id = "abductor" - darksight = 3 say_mod = "gibbers" sexes = 0 species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS) 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 bd41175673..1682953960 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -116,6 +116,7 @@ datum/species/canid //EXOTIC// //These races will likely include lots of downsides and upsides. Keep them relatively balanced.// +/* /datum/species/xeno name = "Xenomorph" id = "xeno" @@ -170,7 +171,7 @@ datum/species/canid toxpwr = 0 acidpwr = 12 -/* + /datum/species/yautja name = "Yautja" id = "pred" 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 3dc76e0459..6154cd9e0f 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -4,7 +4,6 @@ id = "jelly" default_color = "00FF90" say_mod = "chirps" - eyes = "jelleyes" species_traits = list(MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE,TOXINLOVER) meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime exotic_blood = "slimejelly" @@ -99,10 +98,8 @@ name = "Slimeperson" id = "slime" default_color = "00FFFF" - darksight = 3 species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD,VIRUSIMMUNE, TOXINLOVER) say_mod = "says" - eyes = "eyes" hair_color = "mutcolor" hair_alpha = 150 ignored_by = list(/mob/living/simple_animal/slime) @@ -131,8 +128,8 @@ /* slime_split = new slime_split.Grant(C) swap_body = new - swap_body.Grant(C) */ - + swap_body.Grant(C) +*/ if(!bodies || !bodies.len) bodies = list(C) else @@ -248,10 +245,10 @@ var/list/data = list() data["bodies"] = list() for(var/b in SS.bodies) - if(!b || qdeleted(b) || !isslimeperson(b)) + var/mob/living/carbon/human/body = b + if(!body || QDELETED(body) || !isslimeperson(body)) SS.bodies -= b continue - var/mob/living/carbon/human/body = b var/list/L = list() // HTML colors need a # prefix @@ -311,7 +308,7 @@ var/mob/living/carbon/human/selected = locate(params["ref"]) if(!(selected in SS.bodies)) return - if(!selected || qdeleted(selected) || !isslimeperson(selected)) + if(!selected || QDELETED(selected) || !isslimeperson(selected)) SS.bodies -= selected return if(M.current == selected) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index ee8396205b..400e0f4509 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -2,42 +2,14 @@ // Humans cursed to stay in the darkness, lest their life forces drain. They regain health in shadow and die in light. name = "???" id = "shadow" - darksight = 8 - invis_sight = SEE_INVISIBLE_MINIMUM sexes = 0 blacklisted = 1 ignored_by = list(/mob/living/simple_animal/hostile/faithless) meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow species_traits = list(NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE) dangerous_existence = 1 - var/datum/action/innate/shadow/darkvision/vision_toggle + mutanteyes = /obj/item/organ/eyes/night_vision -/datum/action/innate/shadow/darkvision //Darkvision toggle so shadowpeople can actually see where darkness is - name = "Toggle Darkvision" - check_flags = AB_CHECK_CONSCIOUS - background_icon_state = "bg_default" - button_icon_state = "blind" - -/datum/action/innate/shadow/darkvision/Activate() - var/mob/living/carbon/human/H = owner - if(H.see_in_dark < 8) - H.see_in_dark = 8 - H.see_invisible = SEE_INVISIBLE_MINIMUM - H << "You adjust your vision to pierce the darkness." - else - H.see_in_dark = 2 - H.see_invisible = SEE_INVISIBLE_LIVING - H << "You adjust your vision to recognize the shadows." - -/datum/species/shadow/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - vision_toggle = new - vision_toggle.Grant(C) - -/datum/species/shadow/on_species_loss(mob/living/carbon/C) - . = ..() - if(vision_toggle) - vision_toggle.Remove(C) /datum/species/shadow/spec_life(mob/living/carbon/human/H) var/light_amount = 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 16786e413c..a666573d16 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -137,7 +137,7 @@ There are several things that need to be remembered: else if(!(dna && dna.species.nojumpsuit)) // Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY - for(var/obj/item/thing in list(r_store, l_store, wear_id, belt)) + for(var/obj/item/thing in list(r_store, l_store, wear_id, belt)) // dropItemToGround(thing) apply_overlay(UNIFORM_LAYER) @@ -576,4 +576,4 @@ generate/load female uniform sprites matching all previously decided variables observers -= observe if(!observers.len) observers = null - break \ No newline at end of file + break diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index efb9754f9d..a58eabd44d 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -345,7 +345,7 @@ for(var/obj/item/I in M.held_items) if(I == pickupTarget) M.visible_message("[src] snatches [pickupTarget] from [M].", "[src] snatched [pickupTarget]!") - if(M.temporarilyRemoveItemFromInventory(pickupTarget) && !qdeleted(pickupTarget)) + if(M.temporarilyRemoveItemFromInventory(pickupTarget) && !QDELETED(pickupTarget)) equip_item(pickupTarget) else M.visible_message("[src] tried to snatch [pickupTarget] from [M], but failed!", "[src] tried to grab [pickupTarget]!") diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index bac852e0c8..a4628812ea 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -45,6 +45,7 @@ internal_organs += new /obj/item/organ/heart internal_organs += new /obj/item/organ/brain internal_organs += new /obj/item/organ/tongue + internal_organs += new /obj/item/organ/eyes ..() /mob/living/carbon/monkey/movement_delay() diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 7ac329a212..964af69a7d 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -301,4 +301,4 @@ var/global/list/limb_icon_cache = list() remove_overlay(BODYPARTS_LAYER) overlays_standing[BODYPARTS_LAYER] = limb_icon_cache[icon_render_key] apply_overlay(BODYPARTS_LAYER) - update_damage_overlays() \ No newline at end of file + update_damage_overlays() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index cb05fbbf4a..e3901cf1c6 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -766,7 +766,7 @@ return 0 /mob/living/proc/harvest(mob/living/user) - if(qdeleted(src)) + if(QDELETED(src)) return if(butcher_results) for(var/path in butcher_results) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index b378eba0b0..6127b30469 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -33,6 +33,7 @@ var/list/ai_list = list() var/list/connected_robots = list() var/aiRestorePowerRoutine = 0 var/requires_power = POWER_REQ_ALL + var/can_be_carded = TRUE //var/list/laws = list() var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) var/viewalerts = 0 @@ -790,6 +791,10 @@ var/list/ai_list = list() if(!mind) user << "No intelligence patterns detected." //No more magical carding of empty cores, AI RETURN TO BODY!!!11 return + if(!can_be_carded) + user << "Transfer failed." + return + ShutOffDoomsdayDevice() new /obj/structure/AIcore/deactivated(loc)//Spawns a deactivated terminal at AI location. ai_restore_power()//So the AI initially has power. control_disabled = 1//Can't control things remotely if you're stuck in a card! @@ -881,7 +886,7 @@ var/list/ai_list = list() malfhacking = 0 clear_alert("hackingapc") - if(!istype(apc) || qdeleted(apc) || apc.stat & BROKEN) + if(!istype(apc) || QDELETED(apc) || apc.stat & BROKEN) src << "Hack aborted. The designated APC no \ longer exists on the power network." playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 1) @@ -902,6 +907,9 @@ var/list/ai_list = list() exclusive control." apc.update_icon() +/mob/living/silicon/ai/resist() + return + /mob/living/silicon/ai/spawned/New(loc, datum/ai_laws/L, mob/target_ai) if(!target_ai) target_ai = src //cheat! just give... ourselves as the spawned AI, because that's technically correct diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 4130c5f138..f769bf5cc2 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -19,17 +19,8 @@ shuttle_caller_list -= src SSshuttle.autoEvac() - if(nuking) - set_security_level("red") - nuking = FALSE - for(var/obj/item/weapon/pinpointer/P in pinpointer_list) - P.switch_mode_to(TRACK_NUKE_DISK) //Party's over, back to work, everyone - P.nuke_warning = FALSE + ShutOffDoomsdayDevice() - if(doomsday_device) - doomsday_device.timing = FALSE - SSshuttle.clearHostileEnvironment(doomsday_device) - qdel(doomsday_device) if(explosive) spawn(10) explosion(src.loc, 3, 6, 12, 15) @@ -40,3 +31,15 @@ if(istype(loc, /obj/item/device/aicard)) loc.icon_state = "aicard-404" +/mob/living/silicon/ai/proc/ShutOffDoomsdayDevice() + if(nuking) + set_security_level("red") + nuking = FALSE + for(var/obj/item/weapon/pinpointer/P in pinpointer_list) + P.switch_mode_to(TRACK_NUKE_DISK) //Party's over, back to work, everyone + P.nuke_warning = FALSE + + if(doomsday_device) + doomsday_device.timing = FALSE + SSshuttle.clearHostileEnvironment(doomsday_device) + qdel(doomsday_device) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index ae7234e944..7271732d33 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -87,7 +87,7 @@ cameraFollow = null unset_machine() - if(!eyeobj || !eyeobj.loc || qdeleted(eyeobj)) + if(!eyeobj || !eyeobj.loc || QDELETED(eyeobj)) src << "ERROR: Eyeobj not found. Creating new eye..." eyeobj = new(loc) eyeobj.ai = src diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 20abad8bf4..e3631a56d8 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -19,7 +19,7 @@ // messenging the client malfhacked(malfhack) - if(!eyeobj || qdeleted(eyeobj) || !eyeobj.loc) + if(!eyeobj || QDELETED(eyeobj) || !eyeobj.loc) view_core() if(machine) diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 075dbb58a5..d03aeada87 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -30,4 +30,4 @@ update_icons() - sql_report_cyborg_death(src) \ No newline at end of file + sql_report_death(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index da33418b6f..697e504f9b 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -136,7 +136,7 @@ bot_patrol() if(target) - if(qdeleted(target) || !isturf(target.loc)) + if(QDELETED(target) || !isturf(target.loc)) target = null mode = BOT_IDLE return diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index d75b7230c9..5e5a15d095 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -35,7 +35,7 @@ user << "Can't become a drone before the game has started." return var/be_drone = alert("Become a drone? (Warning, You can no longer be cloned!)",,"Yes","No") - if(be_drone == "No" || qdeleted(src) || !isobserver(user)) + if(be_drone == "No" || QDELETED(src) || !isobserver(user)) return var/mob/living/simple_animal/drone/D = new drone_type(get_turf(loc)) D.admin_spawned = admin_spawned diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm index 441f27fc9e..db245fea50 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm @@ -55,11 +55,12 @@ removechains() /mob/living/simple_animal/hostile/guardian/beam/proc/cleardeletedchains() - if(summonerchain && qdeleted(summonerchain)) + if(summonerchain && QDELETED(summonerchain)) summonerchain = null if(enemychains.len) for(var/chain in enemychains) - if(!chain || qdeleted(chain)) + var/datum/cd = chain + if(!chain || QDELETED(cd)) enemychains -= chain /mob/living/simple_animal/hostile/guardian/beam/proc/shockallchains() diff --git a/code/modules/mob/living/simple_animal/hostile/flan.dm b/code/modules/mob/living/simple_animal/hostile/flan.dm index f793e2a8dc..1d0bfd9aac 100644 --- a/code/modules/mob/living/simple_animal/hostile/flan.dm +++ b/code/modules/mob/living/simple_animal/hostile/flan.dm @@ -48,7 +48,7 @@ casting = 1 icon_state = "[initial(icon_state)][casting]" if(do_after_mob(src, A, spellcasttime, uninterruptible = 1, progress = 0)) //Break LOS to dodge. - if(qdeleted(src)) + if(QDELETED(src)) return if((A in view(src))) A.do_attack_animation(A, spellanimation) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 04a92f23b8..4b9b18a122 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -50,7 +50,6 @@ see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 4 var/playable_spider = FALSE - devourable = 1 /mob/living/simple_animal/hostile/poison/giant_spider/Topic(href, href_list) if(href_list["activate"]) @@ -66,7 +65,7 @@ if(key || !playable_spider)//Someone is in it or the fun police are shutting it down return 0 var/spider_ask = alert("Become a spider?", "Are you australian?", "Yes", "No") - if(spider_ask == "No" || !src || qdeleted(src)) + if(spider_ask == "No" || !src || QDELETED(src)) return 1 if(key) user << "Someone else already took this spider." diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index df86bd8e93..e2beff5d83 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -579,7 +579,7 @@ Difficulty: Very Hard ..() if(ready_to_deploy) var/be_helper = alert("Become a Lightgeist? (Warning, You can no longer be cloned!)",,"Yes","No") - if(be_helper == "Yes" && !qdeleted(src) && isobserver(user)) + if(be_helper == "Yes" && !QDELETED(src) && isobserver(user)) var/mob/living/simple_animal/hostile/lightgeist/W = new /mob/living/simple_animal/hostile/lightgeist(get_turf(loc)) W.key = user.key @@ -706,7 +706,7 @@ Difficulty: Very Hard /obj/structure/closet/stasis/process() if(holder_animal) - if(holder_animal.stat == DEAD && !qdeleted(holder_animal)) + if(holder_animal.stat == DEAD && !QDELETED(holder_animal)) dump_contents() holder_animal.gib() return @@ -734,7 +734,7 @@ Difficulty: Very Hard L.disabilities &= ~MUTE L.status_flags &= ~GODMODE L.notransform = 0 - if(holder_animal && !qdeleted(holder_animal)) + if(holder_animal && !QDELETED(holder_animal)) holder_animal.mind.transfer_to(L) L.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession) if(kill || !isanimal(loc)) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 78c3bf3e2d..e6de280cd0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -213,7 +213,7 @@ Difficulty: Medium fire_rain() icon_state = "dragon" - if(swoop_target && !qdeleted(swoop_target) && swoop_target.z == src.z) + if(swoop_target && !QDELETED(swoop_target) && swoop_target.z == src.z) tturf = get_turf(swoop_target) else tturf = get_turf(src) @@ -228,7 +228,7 @@ Difficulty: Medium L.gib() else L.adjustBruteLoss(75) - if(L && !qdeleted(L)) // Some mobs are deleted on death + if(L && !QDELETED(L)) // Some mobs are deleted on death var/throw_dir = get_dir(src, L) if(L.loc == loc) throw_dir = pick(alldirs) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index ad104e5677..8c070a29a8 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -80,7 +80,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/Life() . = ..() - if(. && spawned_beacon && !qdeleted(spawned_beacon) && !client) + if(. && spawned_beacon && !QDELETED(spawned_beacon) && !client) if(target || loc == spawned_beacon.loc) timeout_time = initial(timeout_time) else @@ -500,7 +500,7 @@ Difficulty: Hard if(!currently_seeking) currently_seeking = TRUE targetturf = get_turf(target) - while(target && src && !qdeleted(src) && currently_seeking && x && y && targetturf) //can this target actually be sook out + while(target && src && !QDELETED(src) && currently_seeking && x && y && targetturf) //can this target actually be sook out if(!moving) //we're out of tiles to move, find more and where the target is! more_previouser_moving_dir = previous_moving_dir previous_moving_dir = moving_dir diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 3e8d9d633e..f38ee85705 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -207,16 +207,7 @@ /obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets,mob/user = usr) for(var/mob/living/target in targets) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.dna.species.invis_sight == SEE_INVISIBLE_LIVING) - H.dna.species.invis_sight = SEE_INVISIBLE_NOLIGHTING - name = "Toggle Nightvision \[ON]" - else - H.dna.species.invis_sight = SEE_INVISIBLE_LIVING - name = "Toggle Nightvision \[OFF]" - - else + if(!iscarbon(target)) //Carbons should be toggling their vision via organ, this spell is used as a power for simple mobs if(target.see_invisible == SEE_INVISIBLE_LIVING) target.see_invisible = SEE_INVISIBLE_NOLIGHTING name = "Toggle Nightvision \[ON]" @@ -224,7 +215,6 @@ target.see_invisible = SEE_INVISIBLE_LIVING name = "Toggle Nightvision \[OFF]" - /mob/living/simple_animal/hostile/statue/sentience_act() faction -= "neutral" diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 040b73ce53..dd4f89b1c1 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -71,4 +71,5 @@ update_client_colour() if(client) client.click_intercept = null - client.view = world.view // Resets the client.view in case it was changed. \ No newline at end of file + + client.view = world.view // Resets the client.view in case it was changed. \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 8b73f2be27..45dbdc9f69 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1381,414 +1381,3 @@ /datum/sprite_accessory/legs/digitigrade_lizard name = "Digitigrade Legs" - -/* tbi eventually idk -/datum/sprite_accessory/legs/digitigrade_mam - name = "Anthro Digitigrade Legs" - icon = 'icons/mob/mam_bodyparts.dmi' -*/ -//Human Ears/Tails - -/datum/sprite_accessory/ears/fox - name = "Fox" - icon_state = "fox" - hasinner = 0 - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/ears/wolf - name = "Wolf" - icon_state = "wolf" - hasinner = 1 - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails/human/fox - name = "Fox" - icon_state = "fox" - icon = 'icons/mob/mam_bodyparts.dmi' - extra = 1 - -/datum/sprite_accessory/tails_animated/human/fox - name = "Fox" - icon_state = "fox" - icon = 'icons/mob/mam_bodyparts.dmi' - extra = 1 - -/datum/sprite_accessory/tails/human/wolf - name = "Wolf" - icon_state = "wolf" - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails_animated/human/wolf - name = "Wolf" - icon_state = "wolf" - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails/human/catbig - name = "Cat, Big" - icon_state = "catbig" - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails_animated/human/catbig - name = "Cat, Big" - icon_state = "catbig" - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/ears/fennec - name = "Fennec" - icon_state = "fennec" - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails/human/fennec - name = "Fennec" - icon_state = "fennec" - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails_animated/human/fennec - name = "Fennec" - icon_state = "fennec" - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/ears/lab - name = "Dog, Floppy" - icon_state = "lab" - hasinner = 0 - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails/human/husky - name = "Husky" - icon_state = "husky" - icon = 'icons/mob/mam_bodyparts.dmi' - extra = 1 - -/datum/sprite_accessory/tails_animated/human/husky - name = "Husky" - icon_state = "husky" - icon = 'icons/mob/mam_bodyparts.dmi' - extra = 1 - -/datum/sprite_accessory/ears/murid - name = "Murid" - icon_state = "murid" - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails/human/murid - name = "Murid" - icon_state = "murid" - color_src = 0 - icon = 'icons/mob/mam_bodyparts.dmi' - - -/datum/sprite_accessory/tails_animated/human/murid - name = "Murid" - icon_state = "murid" - color_src = 0 - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails/human/shark - name = "Shark" - icon_state = "shark" - color_src = 0 - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails/human/shark/datashark - name = "datashark" - icon_state = "datashark" - color_src = 0 - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails/human/ailurus - name = "ailurus" - icon_state = "ailurus" - color_src = 0 - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/ears/squirrel - name = "Squirrel" - icon_state = "squirrel" - hasinner= 1 - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails/human/squirrel - name = "Squirrel" - icon_state = "squirrel" - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/tails_animated/human/squirrel - name = "Squirrel" - icon_state = "squirrel" - icon = 'icons/mob/mam_bodyparts.dmi' - -//Mammal Bodyparts -/datum/sprite_accessory/mam_ears - icon = 'icons/mob/mam_bodyparts.dmi' -/datum/sprite_accessory/mam_ears/none - name = "None" - -/datum/sprite_accessory/mam_tails - icon = 'icons/mob/mam_bodyparts.dmi' -/datum/sprite_accessory/mam_tails/none - name = "None" - -/datum/sprite_accessory/mam_tails_animated - icon = 'icons/mob/mam_bodyparts.dmi' -/datum/sprite_accessory/mam_tails_animated/none - name = "None" - -//Snouts -/datum/sprite_accessory/snouts/lcanid - name = "Fox, Long" - icon_state = "lcanid" - icon = 'icons/mob/mam_bodyparts.dmi' - extra = 1 - -/datum/sprite_accessory/snouts/scanid - name = "Fox, Short" - icon_state = "scanid" - icon = 'icons/mob/mam_bodyparts.dmi' - extra = 1 - -/datum/sprite_accessory/snouts/wolf - name = "Wolf" - icon_state = "wolf" - icon = 'icons/mob/mam_bodyparts.dmi' - extra = 1 - -/datum/sprite_accessory/snouts/husky - name = "Husky" - icon_state = "husky" - icon = 'icons/mob/mam_bodyparts.dmi' - extra = 1 - -//Cat, Big -/datum/sprite_accessory/mam_ears/catbig - name = "Cat, Big" - icon_state = "cat" - hasinner = 1 - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/mam_tails/catbig - name = "Cat, Big" - icon_state = "catbig" - -/datum/sprite_accessory/mam_tails_animated/catbig - name = "Cat, Big" - icon_state = "catbig" - -//Wolf -/datum/sprite_accessory/mam_ears/wolf - name = "Wolf" - icon_state = "wolf" - hasinner = 1 - -/datum/sprite_accessory/mam_tails/wolf - name = "Wolf" - icon_state = "wolf" - -/datum/sprite_accessory/mam_tails_animated/wolf - name = "Wolf" - icon_state = "wolf" - -//Fox -/datum/sprite_accessory/mam_ears/fox - name = "Fox" - icon_state = "fox" - hasinner = 0 - -/datum/sprite_accessory/mam_tails/fox - name = "Fox" - icon_state = "fox" - extra = 1 - extra_color_src = MUTCOLORS2 - -/datum/sprite_accessory/mam_tails_animated/fox - name = "Fox" - icon_state = "fox" - extra = 1 - extra_color_src = MUTCOLORS2 - -//Fennec -/datum/sprite_accessory/mam_ears/fennec - name = "Fennec" - icon_state = "fennec" - hasinner = 1 - -/datum/sprite_accessory/mam_tails/fennec - name = "Fennec" - icon_state = "fennec" - -/datum/sprite_accessory/mam_tails_animated/fennec - name = "Fennec" - icon_state = "fennec" - -//Lab -/datum/sprite_accessory/mam_ears/lab - name = "Dog, Long" - icon_state = "lab" - -/datum/sprite_accessory/mam_tails/lab - name = "Lab" - icon_state = "lab" - -/datum/sprite_accessory/mam_tails_animated/lab - name = "Lab" - icon_state = "lab" - -//Husky -/datum/sprite_accessory/mam_ears/husky - name = "Husky" - icon_state = "wolf" - hasinner = 1 - icon = 'icons/mob/mam_bodyparts.dmi' - extra = 1 - -/datum/sprite_accessory/mam_tails/husky - name = "Husky" - icon_state = "husky" - extra = 1 - -/datum/sprite_accessory/mam_tails_animated/husky - name = "Husky" - icon_state = "husky" - extra = 1 - -//Murid -/datum/sprite_accessory/mam_ears/murid - name = "Murid" - icon_state = "murid" - -/datum/sprite_accessory/mam_tails/murid - name = "Murid" - icon_state = "murid" - color_src = 0 - -/datum/sprite_accessory/mam_tails_animated/murid - name = "Murid" - icon_state = "murid" - color_src = 0 - -//Shark -/datum/sprite_accessory/mam_tails/shark - name = "Shark" - icon_state = "shark" - color_src = 0 - icon = 'icons/mob/mam_bodyparts.dmi' - - -/datum/sprite_accessory/mam_tails/shark/datashark - name = "DataShark" - icon_state = "datashark" - color_src = 0 - icon = 'icons/mob/mam_bodyparts.dmi' - - -//Squirrel -/datum/sprite_accessory/mam_ears/squirrel - name = "Squirrel" - icon_state = "squirrel" - hasinner= 1 - -/datum/sprite_accessory/mam_tails/squirrel - name = "Squirrel" - icon_state = "squirrel" - -/datum/sprite_accessory/mam_tails_animated/squirrel - name = "Squirrel" - icon_state = "squirrel" - -/datum/sprite_accessory/mam_tails/ailurus - name = "Ailurus" - icon_state = "ailurus" - -//Capra -/datum/sprite_accessory/mam_tails/capra - name = "Capra" - icon_state = "capra" - -//Hawk -/datum/sprite_accessory/mam_tails/hawk - name = "Hawk" - icon_state = "hawk" - - -//Mammal Specific Body Markings -/datum/sprite_accessory/mam_body_markings - color_src = MUTCOLORS2 - icon = 'icons/mob/mam_bodyparts.dmi' - -/datum/sprite_accessory/mam_body_markings/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/mam_body_markings/belly - name = "Belly" - icon_state = "belly" - gender_specific = 1 -/* -/datum/sprite_accessory/mam_body_markings/bellyhandsfeet - name = "Belly, Hands, & Feet" - icon_state = "bellyhandsfeet" - gender_specific = 1 - extra = 1 - extra_color_src = MUTCOLORS3 -*/ - -//Xeno Dorsal Tubes -/datum/sprite_accessory/xeno_dorsal - icon = 'icons/mob/exotic_bodyparts.dmi' - color_src = 0 - -/datum/sprite_accessory/xeno_dorsal/none - name = "None" - -/datum/sprite_accessory/xeno_dorsal/normal - name = "Dorsal Tubes" - icon_state = "dortubes" - -//Xeno Tail -/datum/sprite_accessory/xeno_tail - icon = 'icons/mob/exotic_bodyparts.dmi' - color_src = 0 - -/datum/sprite_accessory/xeno_tail/none - name = "None" - -/datum/sprite_accessory/xeno_tail/normal - name = "Xenomorph Tail" - icon_state = "xeno" - -//Xeno Caste Heads -//unused as of October 3, 2016 -/datum/sprite_accessory/xeno_head - icon = 'icons/mob/exotic_bodyparts.dmi' - color_src = 0 - -/datum/sprite_accessory/xeno_head/none - name = "None" - - -/datum/sprite_accessory/xeno_head/hunter - name = "Hunter" - icon_state = "hunter" - -/datum/sprite_accessory/xeno_head/drone - name = "Drone" - icon_state = "drone" - -/datum/sprite_accessory/xeno_head/sentinel - name = "Sentinel" - icon_state = "sentinel" -/* -//Slimecoon Parts -/datum/sprite_accessory/slimecoon_ears - icon = 'icons/mob/exotic_bodyparts.dmi' - name = "Slimecoon Ears" - icon_state = "slimecoon" -/datum/sprite_accessory/slimecoon_tail - icon = 'icons/mob/exotic_bodyparts.dmi' - name = "Slimecoon Tail" - icon_state = "slimecoon" -/datum/sprite_accessory/slimecoon_snout - icon = 'icons/mob/exotic_bodyparts.dmi' - name = "Hunter" - icon_state = "slimecoon" */ - diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 71a24826ec..9269459308 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -118,7 +118,7 @@ D.target = null D.error = "Connection to quantum relay severed" - ..() + return ..() /obj/item/weapon/circuitboard/machine/ntnet_relay name = "NTNet Relay (Machine Board)" @@ -126,4 +126,4 @@ origin_tech = "programming=3;bluespace=3;magnets=2" req_components = list( /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/subspace/filter = 1) \ No newline at end of file + /obj/item/weapon/stock_parts/subspace/filter = 1) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 898ef176d4..5f469d0f02 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -141,6 +141,7 @@ var/list/global_modular_computers = list() /obj/machinery/modular_computer/ex_act(severity) if(cpu) cpu.ex_act(severity) + ..() // EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components /obj/machinery/modular_computer/emp_act(severity) @@ -152,4 +153,4 @@ var/list/global_modular_computers = list() // "Brute" damage mostly damages the casing. /obj/machinery/modular_computer/bullet_act(obj/item/projectile/Proj) if(cpu) - cpu.bullet_act(Proj) \ No newline at end of file + cpu.bullet_act(Proj) diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm index 50a07014e5..c2cbd4cf5e 100644 --- a/code/modules/modular_computers/file_system/programs/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -15,7 +15,7 @@ return 1 var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD] - var/obj/item/weapon/computer_hardware/hard_drive/RHDD = computer.all_components[MC_HDD] + var/obj/item/weapon/computer_hardware/hard_drive/RHDD = computer.all_components[MC_SDD] var/obj/item/weapon/computer_hardware/printer/printer = computer.all_components[MC_PRINT] switch(action) @@ -24,7 +24,7 @@ open_file = params["name"] if("PRG_newtextfile") . = 1 - var/newname = sanitize(input(usr, "Enter file name or leave blank to cancel:", "File rename")) + var/newname = stripped_input(usr, "Enter file name or leave blank to cancel:", "File rename", max_length=50) if(!newname) return 1 if(!HDD) @@ -69,7 +69,7 @@ var/datum/computer_file/file = HDD.find_file_by_name(params["name"]) if(!file || !istype(file)) return 1 - var/newname = sanitize(input(usr, "Enter new file name:", "File rename", file.filename)) + var/newname = stripped_input(usr, "Enter new file name:", "File rename", file.filename, max_length=50) if(file && newname) file.filename = newname if("PRG_edit") @@ -84,7 +84,7 @@ if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No")) return 1 // 16384 is the limit for file length in characters. Currently, papers have value of 2048 so this is 8 times as long, since we can't edit parts of the file independently. - var/newtext = sanitize(html_decode(input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", F.stored_data) as message|null), 16384) + var/newtext = stripped_multiline_input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", html_decode(F.stored_data), 16384, TRUE) if(!newtext) return if(F) @@ -110,7 +110,7 @@ if(!printer) error = "Missing Hardware: Your computer does not have required hardware to complete this operation." return 1 - if(!printer.print_text(parse_tags(F.stored_data))) + if(!printer.print_text("" + prepare_printjob(F.stored_data) + "", open_file)) error = "Hardware error: Printer was unable to print the file. It may be out of paper." return 1 if("PRG_copytousb") @@ -132,11 +132,11 @@ var/datum/computer_file/C = F.clone(0) HDD.store_file(C) - /datum/computer_file/program/filemanager/proc/parse_tags(t) t = replacetext(t, "\[center\]", "
") t = replacetext(t, "\[/center\]", "
") t = replacetext(t, "\[br\]", "
") + t = replacetext(t, "\n", "
") t = replacetext(t, "\[b\]", "") t = replacetext(t, "\[/b\]", "") t = replacetext(t, "\[i\]", "") @@ -167,9 +167,14 @@ t = replacetext(t, "\[tr\]", "") t = replacetext(t, "\[td\]", "") t = replacetext(t, "\[cell\]", "") - t = replacetext(t, "\[logo\]", "") + t = replacetext(t, "\[tab\]", "    ") return t +/datum/computer_file/program/filemanager/proc/prepare_printjob(t) // Additional stuff to parse if we want to print it and make a happy Head of Personnel. Forms FTW. + t = replacetext(t, "\[field\]", "") + t = replacetext(t, "\[sign\]", "") + t = parse_tags(t) + return t /datum/computer_file/program/filemanager/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state) @@ -179,7 +184,7 @@ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) assets.send(user) - ui = new(user, src, ui_key, "file_manager", "NTOS File Manage", 575, 700, state = state) + ui = new(user, src, ui_key, "file_manager", "NTOS File Manager", 575, 700, state = state) ui.open() ui.set_autoupdate(state = 1) @@ -227,4 +232,4 @@ ))) data["usbfiles"] = usbfiles - return data \ No newline at end of file + return data diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index c038fd09b3..417690a7e0 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -46,8 +46,11 @@ if(stored_card && stored_card2) user << "You try to insert \the [I] into \the [src], but its slots are occupied." return FALSE - if(user && !user.transferItemToLoc(I, src)) - return FALSE + if(user) + if(!user.transferItemToLoc(I, src)) + return FALSE + else + I.forceMove(src) if(!stored_card) stored_card = I @@ -100,4 +103,4 @@ /obj/item/weapon/computer_hardware/card_slot/examine(mob/user) ..() if(stored_card || stored_card2) - user << "There appears to be something loaded in the card slots." \ No newline at end of file + user << "There appears to be something loaded in the card slots." diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm index 294ed329b0..f0351776de 100644 --- a/code/modules/modular_computers/hardware/printer.dm +++ b/code/modules/modular_computers/hardware/printer.dm @@ -34,6 +34,7 @@ if(paper_title) P.name = paper_title P.update_icon() + P.reload_fields() stored_paper-- P = null return TRUE diff --git a/code/modules/orbit/orbit.dm b/code/modules/orbit/orbit.dm index 9bfc2d7746..27fc2d86df 100644 --- a/code/modules/orbit/orbit.dm +++ b/code/modules/orbit/orbit.dm @@ -33,7 +33,7 @@ if (!orbiting.orbiters.len)//we are the last orbit, delete the list orbiting.orbiters = null orbiting = null - ..() + return ..() /datum/orbit/proc/Check(turf/targetloc) if (!orbiter) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 26d66e01e6..7f83bba8ab 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -181,6 +181,7 @@ t = replacetext(t, "\[center\]", "
") t = replacetext(t, "\[/center\]", "
") t = replacetext(t, "\[br\]", "
") + t = replacetext(t, "\n", "
") t = replacetext(t, "\[b\]", "") t = replacetext(t, "\[/b\]", "") t = replacetext(t, "\[i\]", "") @@ -191,7 +192,7 @@ t = replacetext(t, "\[/large\]", "") t = replacetext(t, "\[sign\]", "[user.real_name]") t = replacetext(t, "\[field\]", "") - t = replacetext(t, "\[tab\]", " ") + t = replacetext(t, "\[tab\]", "    ") if(!iscrayon) t = replacetext(t, "\[*\]", "
  • ") @@ -226,6 +227,17 @@ return t +/obj/item/weapon/paper/proc/reload_fields() // Useful if you made the paper programicly and want to include fields. Also runs updateinfolinks() for you. + fields = 0 + var/laststart = 1 + while(1) + var/i = findtext(info, "", laststart) + if(i == 0) + break + laststart = i+1 + fields++ + updateinfolinks() + /obj/item/weapon/paper/proc/openhelp(mob/user) user << browse({"Pen Help @@ -256,7 +268,7 @@ if(href_list["write"]) var/id = href_list["write"] - var/t = stripped_multiline_input("Enter what you want to write:", "Write") + var/t = stripped_multiline_input("Enter what you want to write:", "Write", no_trim=TRUE) if(!t) return var/obj/item/i = usr.get_active_held_item() //Check to see if he still got that darn pen, also check if he's using a crayon or pen. diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 002fd92554..a21ec06b83 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -301,7 +301,7 @@ playsound(loc, O.usesound, 50, 1) user << "You start [anchored ? "unwrenching" : "wrenching"] [src]..." if(do_after(user, 20*O.toolspeed, target = src)) - if(qdeleted(src)) + if(QDELETED(src)) return user << "You [anchored ? "unwrench" : "wrench"] [src]." anchored = !anchored @@ -325,7 +325,7 @@ user.visible_message("[user] starts putting [target] onto the photocopier!", "You start putting [target] onto the photocopier...") if(do_after(user, 20, target = src)) - if(!target || qdeleted(target) || qdeleted(src) || !Adjacent(target)) //check if the photocopier/target still exists. + if(!target || QDELETED(target) || QDELETED(src) || !Adjacent(target)) //check if the photocopier/target still exists. return if(target == user) @@ -363,7 +363,7 @@ return 1 /obj/machinery/photocopier/proc/copier_blocked() - if(qdeleted(src)) + if(QDELETED(src)) return if(loc.density) return 1 diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index e63214fe07..df4421f971 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -419,7 +419,7 @@ By design, d1 is the smallest direction and d2 is the highest powernet.remove_cable(src) //remove the cut cable from its powernet spawn(0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables - if(O && !qdeleted(O)) + if(O && !QDELETED(O)) var/datum/powernet/newPN = new()// creates a new powernet... propagate_network(O, newPN)//... and propagates it to the other side of the cable diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index d62b543afa..ee06fa04ba 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -140,7 +140,7 @@ /obj/item/weapon/stock_parts/cell/ex_act(severity, target) ..() - if(!qdeleted(src)) + if(!QDELETED(src)) switch(severity) if(2) if(prob(50)) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 3c46a653a3..bd7b268fb6 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -384,7 +384,7 @@ /obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) . = ..() - if(. && !qdeleted(src)) + if(. && !QDELETED(src)) if(prob(damage_amount * 5)) break_light_tube() diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index f4d303c019..e9409e42e9 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -100,7 +100,7 @@ tesla_zap(src, 10, power/shock_coeff) /obj/machinery/power/grounding_rod - name = "Grounding Rod" + name = "grounding rod" desc = "Keep an area from being fried from Edison's Bane." icon = 'icons/obj/tesla_engine/tesla_coil.dmi' icon_state = "grounding_rod0" diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 80224c622a..fba93b7d5b 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -17,8 +17,8 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics, /obj/structure/sign, /obj/machinery/gateway, /obj/structure/lattice, - /obj/structure/grille)) - + /obj/structure/grille, + /obj/machinery/the_singularitygen/tesla)) /obj/singularity/energy_ball name = "energy ball" desc = "An energy ball." @@ -147,14 +147,18 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics, orbitingball.orbiting_balls -= src orbitingball.dissipate_strength = orbitingball.orbiting_balls.len ..() - if (!loc && !qdeleted(src)) + if (!loc && !QDELETED(src)) qdel(src) /obj/singularity/energy_ball/proc/dust_mobs(atom/A) - if(istype(A, /mob/living/carbon)) - var/mob/living/carbon/C = A - C.dust() + if(!iscarbon(A)) + return + for(var/obj/machinery/power/grounding_rod/GR in orange(src, 2)) + if(GR.anchored) + return + var/mob/living/carbon/C = A + C.dust() /proc/tesla_zap(atom/source, zap_range = 3, power, explosive = FALSE) . = source.dir diff --git a/code/modules/power/tesla/generator.dm b/code/modules/power/tesla/generator.dm index f511c650c8..63bce099fa 100644 --- a/code/modules/power/tesla/generator.dm +++ b/code/modules/power/tesla/generator.dm @@ -3,4 +3,8 @@ desc = "Makes the wardenclyffe look like a child's plaything when shot with a particle accelerator." icon = 'icons/obj/tesla_engine/tesla_generator.dmi' icon_state = "TheSingGen" - creation_type = /obj/singularity/energy_ball \ No newline at end of file + creation_type = /obj/singularity/energy_ball + +/obj/machinery/the_singularitygen/tesla/tesla_act(power, explosive = FALSE) + if(explosive) + energy += power diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index a7f8bfb203..9a3085b7e5 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -233,7 +233,7 @@ return vol_each = min(reagents.total_volume / amount, 50) var/name = stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || qdeleted(src) || !usr.canUseTopic(src, be_close=TRUE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE)) return var/obj/item/weapon/reagent_containers/pill/P @@ -248,7 +248,7 @@ reagents.trans_to(P,vol_each) else var/name = stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || qdeleted(src) || !usr.canUseTopic(src, be_close=TRUE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE)) return var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(src.loc) @@ -270,7 +270,7 @@ return vol_each = min(reagents.total_volume / amount, 40) var/name = stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || qdeleted(src) || !usr.canUseTopic(src, be_close=TRUE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE)) return var/obj/item/weapon/reagent_containers/pill/P @@ -289,7 +289,7 @@ if(condi) var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || qdeleted(src) || !usr.canUseTopic(src, be_close=TRUE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE)) return var/obj/item/weapon/reagent_containers/food/condiment/P = new(src.loc) P.originalname = name @@ -302,7 +302,7 @@ amount_full = round(reagents.total_volume / 30) vol_part = reagents.total_volume % 30 var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || qdeleted(src) || !usr.canUseTopic(src, be_close=TRUE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE)) return var/obj/item/weapon/reagent_containers/glass/bottle/P diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 8944381db3..0c6a3e4302 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -260,7 +260,7 @@ /datum/reagent/medicine/salglu_solution name = "Saline-Glucose Solution" id = "salglu_solution" - description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a blood substitute on an IV drip." + description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a blood substitute on an IV drip." reagent_state = LIQUID color = "#DCDCDC" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -269,6 +269,9 @@ if(prob(33)) M.adjustBruteLoss(-0.5*REM, 0) M.adjustFireLoss(-0.5*REM, 0) + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.blood_volume += 0.2 . = 1 ..() @@ -277,7 +280,7 @@ var/mob/living/carbon/human/H = M if(H.dna && !(NOBLOOD in H.dna.species.species_traits)) var/efficiency = (BLOOD_VOLUME_NORMAL-H.blood_volume)/700 + 0.2//The lower the blood of the patient, the better it is as a blood substitute. - efficiency = min(0.75,efficiency) + efficiency = Clamp(efficiency, 0.1, 0.75) //As it's designed for an IV drip, make large injections not as effective as repeated small injections. H.blood_volume += round(efficiency * min(5,reac_volume), 0.1) ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index f27d8ec507..568426dba9 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -214,7 +214,7 @@ name = "Unholy Water" id = "unholywater" description = "Something that shouldn't exist on this plane of existence." - + /datum/reagent/fuel/unholywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) M.reagents.add_reagent("unholywater", (reac_volume/4)) @@ -379,7 +379,7 @@ H.visible_message("[H] falls to the ground and screams as [H.p_their()] skin bubbles and froths!") //'froths' sounds painful when used with SKIN. H.Weaken(3, 0) spawn(30) - if(!H || qdeleted(H)) + if(!H || QDELETED(H)) return var/current_species = H.dna.species.type @@ -896,6 +896,23 @@ H.wash_cream() M.clean_blood() +/datum/reagent/space_cleaner/ez_clean + name = "EZ Clean" + id = "ez_clean" + description = "A powerful, acidic cleaner sold by Waffle Co. Affects organic matter while leaving other objects unaffected." + metabolization_rate = 1.5 * REAGENTS_METABOLISM + +/datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/M) + M.adjustBruteLoss(3.33) + M.adjustFireLoss(3.33) + M.adjustToxLoss(3.33) + ..() + +/datum/reagent/space_cleaner/ez_clean/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + ..() + if((method == TOUCH || method == VAPOR) && !issilicon(M)) + M.adjustBruteLoss(1) + M.adjustFireLoss(1) /datum/reagent/cryptobiolin name = "Cryptobiolin" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 014bef467d..48d07e6417 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -692,7 +692,7 @@ color = "#3C5133" metabolization_rate = 0.08 * REAGENTS_METABOLISM toxpwr = 0.15 - + /datum/reagent/toxin/anacea/on_mob_life(mob/living/M) var/remove_amt = 5 if(holder.has_reagent("calomel") || holder.has_reagent("pen_acid")) @@ -700,7 +700,7 @@ for(var/datum/reagent/medicine/R in M.reagents.reagent_list) M.reagents.remove_reagent(R.id,remove_amt) return ..() - + //ACID diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index c15d3f14fc..1a47ea728f 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -214,7 +214,7 @@ name = "Mulligan" id = "mulligan" results = list("mulligan" = 1) - required_reagents = list("humanmutationtoxin" = 1, "mutagen" = 1) + required_reagents = list("stablemutationtoxin" = 1, "mutagen" = 1) ////////////////////////////////// VIROLOGY ////////////////////////////////////////// diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 56cb258e2a..481f21897c 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -71,7 +71,7 @@ if(reagents) for(var/datum/reagent/R in reagents.reagent_list) R.on_ex_act() - if(!qdeleted(src)) + if(!QDELETED(src)) ..() /obj/item/weapon/reagent_containers/fire_act(exposed_temperature, exposed_volume) @@ -109,7 +109,7 @@ else visible_message("[src] spills its contents all over [target].") reagents.reaction(target, TOUCH) - if(qdeleted(src)) + if(QDELETED(src)) return reagents.clear_reagents() diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index e372bb8fe1..e6d2e20213 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -24,7 +24,7 @@ Borg Hypospray var/bypass_protection = 0 //If the hypospray can go through armor or thick material var/list/datum/reagents/reagent_list = list() - var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "antitoxin", "epinephrine", "spaceacillin") + var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "antitoxin", "epinephrine", "spaceacillin", "salglu_solution") var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed. var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values. //Used as list for input() in shakers. diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 4f6e1d3d90..a8e4da9160 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -84,7 +84,7 @@ /obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P) ..() - if(!qdeleted(src)) //wasn't deleted by the projectile's effects. + if(!QDELETED(src)) //wasn't deleted by the projectile's effects. if(!P.nodamage && ((P.damage_type == BURN) || (P.damage_type == BRUTE))) var/boom_message = "[key_name_admin(P.firer)] triggered a fueltank explosion via projectile." bombers += boom_message @@ -162,7 +162,7 @@ /obj/structure/reagent_dispensers/beerkeg/blob_act(obj/structure/blob/B) explosion(src.loc,0,3,5,7,10) - if(!qdeleted(src)) + if(!QDELETED(src)) qdel(src) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 09337e8e2f..e66587ffd3 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -119,7 +119,7 @@ user.visible_message("[user] struggles to pry up \the [src] with \the [I].", \ "You struggle to pry up \the [src] with \the [I].") if(do_after(user, 40*I.toolspeed, target = src)) - if(qdeleted(src)) + if(QDELETED(src)) return //prevent multiple decontructs if(!(stat & BROKEN)) var/obj/item/conveyor_construct/C = new/obj/item/conveyor_construct(src.loc) diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index f244a4d748..856fbc90ef 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -150,7 +150,7 @@ /obj/structure/disposalpipe/New(loc,var/obj/structure/disposalconstruct/make_from) ..() - if(make_from && !qdeleted(make_from)) + if(make_from && !QDELETED(make_from)) base_icon_state = make_from.base_state setDir(make_from.dir) dpdir = make_from.dpdir diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 11bba1f0d2..3423673612 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -196,7 +196,7 @@ playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0) last_sound = world.time sleep(5) - if(qdeleted(src)) + if(QDELETED(src)) return var/obj/structure/disposalholder/H = new() newHolderDestination(H) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 671f1a4404..bc3f2001e1 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -409,4 +409,12 @@ id = "limbgrower" req_tech = list("programming" = 3, "biotech" = 2) build_path = /obj/item/weapon/circuitboard/machine/limbgrower - category = list("Medical Machinery") \ No newline at end of file + category = list("Medical Machinery") + +/datum/design/board/deepfryer + name = "Machine Design (Deep Fryer)" + desc = "The circuit board for a Deep Fryer." + id = "deepfryer" + req_tech = list("programming" = 1) + build_path = /obj/item/weapon/circuitboard/machine/deep_fryer + category = list ("Misc. Machinery") diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 818d616bb3..752bc73919 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -180,14 +180,14 @@ ///////////////////////////////////////// /datum/design/cyberimp_welding - name = "Welding Shield implant" + name = "Welding Shield Eyes" desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." id = "ci-welding" req_tech = list("materials" = 4, "biotech" = 4, "engineering" = 5, "plasmatech" = 4) build_type = PROTOLATHE | MECHFAB construction_time = 40 materials = list(MAT_METAL = 600, MAT_GLASS = 400) - build_path = /obj/item/organ/cyberimp/eyes/shield + build_path = /obj/item/organ/eyes/robotic/shield category = list("Misc", "Medical Designs") /datum/design/cyberimp_breather @@ -235,25 +235,25 @@ category = list("Misc", "Medical Designs") /datum/design/cyberimp_xray - name = "X-Ray implant" + name = "X-Ray eyes" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." id = "ci-xray" req_tech = list("materials" = 7, "programming" = 5, "biotech" = 7, "magnets" = 5,"plasmatech" = 6) build_type = PROTOLATHE | MECHFAB construction_time = 60 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_URANIUM = 1000, MAT_DIAMOND = 2000) - build_path = /obj/item/organ/cyberimp/eyes/xray + build_path = /obj/item/organ/eyes/robotic/xray category = list("Misc", "Medical Designs") /datum/design/cyberimp_thermals - name = "Thermals implant" + name = "Thermal eyes" desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." id = "ci-thermals" req_tech = list("materials" = 6, "programming" = 4, "biotech" = 7, "magnets" = 5,"plasmatech" = 4) build_type = PROTOLATHE | MECHFAB construction_time = 60 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) - build_path = /obj/item/organ/cyberimp/eyes/thermals + build_path = /obj/item/organ/eyes/robotic/thermals category = list("Misc", "Medical Designs") /datum/design/cyberimp_antidrop diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index d33a57bbd9..72999fe375 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -130,68 +130,6 @@ var/global/list/obj/machinery/message_server/message_servers = list() return - -/datum/feedback_variable - var/variable - var/value - var/details - -/datum/feedback_variable/New(var/param_variable,var/param_value = 0) - variable = param_variable - value = param_value - -/datum/feedback_variable/proc/inc(num = 1) - if (isnum(value)) - value += num - else - value = text2num(value) - if (isnum(value)) - value += num - else - value = num - -/datum/feedback_variable/proc/dec(num = 1) - if (isnum(value)) - value -= num - else - value = text2num(value) - if (isnum(value)) - value -= num - else - value = -num - -/datum/feedback_variable/proc/set_value(num) - if (isnum(num)) - value = num - -/datum/feedback_variable/proc/get_value() - if (!isnum(value)) - return 0 - return value - -/datum/feedback_variable/proc/get_variable() - return variable - -/datum/feedback_variable/proc/set_details(text) - if (istext(text)) - details = text - -/datum/feedback_variable/proc/add_details(text) - if (istext(text)) - text = replacetext(text, " ", "_") - if (!details) - details = text - else - details += " [text]" - -/datum/feedback_variable/proc/get_details() - return details - -/datum/feedback_variable/proc/get_parsed() - return list(variable,value,details) - -var/obj/machinery/blackbox_recorder/blackbox - /obj/machinery/blackbox_recorder icon = 'icons/obj/stationobjs.dmi' icon_state = "blackbox" @@ -202,170 +140,3 @@ var/obj/machinery/blackbox_recorder/blackbox idle_power_usage = 10 active_power_usage = 100 armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70) - var/list/messages = list() //Stores messages of non-standard frequencies - var/list/messages_admin = list() - - var/list/msg_common = list() - var/list/msg_science = list() - var/list/msg_command = list() - var/list/msg_medical = list() - var/list/msg_engineering = list() - var/list/msg_security = list() - var/list/msg_deathsquad = list() - var/list/msg_syndicate = list() - var/list/msg_service = list() - var/list/msg_cargo = list() - - var/list/datum/feedback_variable/feedback = new() - - //Only one can exsist in the world! -/obj/machinery/blackbox_recorder/New() - if (blackbox) - if (istype(blackbox,/obj/machinery/blackbox_recorder)) - qdel(src) - return - blackbox = src - - -/obj/machinery/blackbox_recorder/Destroy() - var/turf/T = locate(1,1,2) - if (T) - blackbox = null - var/obj/machinery/blackbox_recorder/BR = new/obj/machinery/blackbox_recorder(T) - BR.msg_common = msg_common - BR.msg_science = msg_science - BR.msg_command = msg_command - BR.msg_medical = msg_medical - BR.msg_engineering = msg_engineering - BR.msg_security = msg_security - BR.msg_deathsquad = msg_deathsquad - BR.msg_syndicate = msg_syndicate - BR.msg_service = msg_service - BR.msg_cargo = msg_cargo - BR.feedback = feedback - BR.messages = messages - BR.messages_admin = messages_admin - if(blackbox != BR) - blackbox = BR - return ..() - -/obj/machinery/blackbox_recorder/proc/find_feedback_datum(variable) - for (var/datum/feedback_variable/FV in feedback) - if (FV.get_variable() == variable) - return FV - var/datum/feedback_variable/FV = new(variable) - feedback += FV - return FV - -/obj/machinery/blackbox_recorder/proc/get_round_feedback() - return feedback - -/obj/machinery/blackbox_recorder/proc/round_end_data_gathering() - - var/pda_msg_amt = 0 - var/rc_msg_amt = 0 - - for (var/obj/machinery/message_server/MS in message_servers) - if (MS.pda_msgs.len > pda_msg_amt) - pda_msg_amt = MS.pda_msgs.len - if (MS.rc_msgs.len > rc_msg_amt) - rc_msg_amt = MS.rc_msgs.len - - feedback_set_details("radio_usage","") - - feedback_add_details("radio_usage","COM-[msg_common.len]") - feedback_add_details("radio_usage","SCI-[msg_science.len]") - feedback_add_details("radio_usage","HEA-[msg_command.len]") - feedback_add_details("radio_usage","MED-[msg_medical.len]") - feedback_add_details("radio_usage","ENG-[msg_engineering.len]") - feedback_add_details("radio_usage","SEC-[msg_security.len]") - feedback_add_details("radio_usage","DTH-[msg_deathsquad.len]") - feedback_add_details("radio_usage","SYN-[msg_syndicate.len]") - feedback_add_details("radio_usage","SRV-[msg_service.len]") - feedback_add_details("radio_usage","CAR-[msg_cargo.len]") - feedback_add_details("radio_usage","OTH-[messages.len]") - feedback_add_details("radio_usage","PDA-[pda_msg_amt]") - feedback_add_details("radio_usage","RC-[rc_msg_amt]") - - - feedback_set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set. - - -//This proc is only to be called at round end. -/obj/machinery/blackbox_recorder/proc/save_all_data_to_sql() - if (!feedback) return - - round_end_data_gathering() //round_end time logging and some other data processing - establish_db_connection() - if (!dbcon.IsConnected()) return - var/round_id - - var/DBQuery/query = dbcon.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]") - query.Execute() - while (query.NextRow()) - round_id = query.item[1] - - if (!isnum(round_id)) - round_id = text2num(round_id) - round_id++ - - var/sqlrowlist = "" - - - for (var/datum/feedback_variable/FV in feedback) - if (sqlrowlist != "") - sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error - - sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")" - - if (sqlrowlist == "") - return - - var/DBQuery/query_insert = dbcon.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist) - query_insert.Execute() - - -/proc/feedback_set(variable,value) - if (!blackbox) return - - var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) - - if (!FV) return - - FV.set_value(value) - -/proc/feedback_inc(variable,value) - if (!blackbox) return - - var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) - - if (!FV) return - - FV.inc(value) - -/proc/feedback_dec(variable,value) - if (!blackbox) return - - var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) - - if (!FV) return - - FV.dec(value) - -/proc/feedback_set_details(variable,details) - if (!blackbox) return - - var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) - - if(!FV) return - - FV.set_details(details) - -/proc/feedback_add_details(variable,details) - if (!blackbox) return - - var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) - - if (!FV) return - - FV.add_details(details) diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index d01f1a1253..d66bd8e3b5 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -34,7 +34,7 @@ var/target_area target_area = input("Area to land", "Select a Landing Zone", target_area) in teleportlocs var/area/picked_area = teleportlocs[target_area] - if(!src || qdeleted(src)) + if(!src || QDELETED(src)) return var/turf/T = safepick(get_area_turfs(picked_area)) diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index b179fec67e..9ac700ae78 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -64,7 +64,7 @@ return switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1)) if(0) - usr << "Shuttle received message and will be sent shortly." + say("Shuttle departing. Please stand away from the doors.") if(1) usr << "Invalid shuttle requested." else diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index a650851256..8211d35095 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -241,7 +241,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/proc/start_recharge() if(action) action.UpdateButtonIcon() - while(charge_counter < charge_max && !qdeleted(src)) + while(charge_counter < charge_max && !QDELETED(src)) sleep(1) charge_counter++ if(action) diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm index f14414684c..4785ebdc6f 100644 --- a/code/modules/spells/spell_types/conjure.dm +++ b/code/modules/spells/spell_types/conjure.dm @@ -65,7 +65,7 @@ cooldown_min = 10 /obj/effect/proc_holder/spell/targeted/conjure_item/cast(list/targets, mob/user = usr) - if (item && !qdeleted(item)) + if (item && !QDELETED(item)) qdel(item) item = null else diff --git a/code/modules/spells/spell_types/devil_boons.dm b/code/modules/spells/spell_types/devil_boons.dm index 85ca441ade..b7ef4b03c4 100644 --- a/code/modules/spells/spell_types/devil_boons.dm +++ b/code/modules/spells/spell_types/devil_boons.dm @@ -41,4 +41,4 @@ for(var/mob/C in targets) if(!C.client) continue - C.client.view = input("Select view range:", "Range", 4) in ranges \ No newline at end of file + C.client.change_view(input("Select view range:", "Range", 4) in ranges) \ No newline at end of file diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index a2a8d7d04c..5b9561b585 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -54,7 +54,7 @@ new jaunt_in_type(mobloc, holder.dir) sleep(jaunt_in_time) qdel(holder) - if(!qdeleted(target)) + if(!QDELETED(target)) if(mobloc.density) for(var/direction in alldirs) var/turf/T = get_step(mobloc, direction) diff --git a/code/modules/spells/spell_types/genetic.dm b/code/modules/spells/spell_types/genetic.dm index 6ed96c53cc..84ec6a777b 100644 --- a/code/modules/spells/spell_types/genetic.dm +++ b/code/modules/spells/spell_types/genetic.dm @@ -24,7 +24,7 @@ target.dna.add_mutation(A) target.disabilities |= disabilities spawn(duration) - if(target && !qdeleted(target)) + if(target && !QDELETED(target)) for(var/A in mutations) target.dna.remove_mutation(A) target.disabilities &= ~disabilities diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index aad30a2b46..5844698c97 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -55,7 +55,7 @@ charge_counter = charge_max return - if(!marked_item || qdeleted(marked_item)) //Wait nevermind + if(!marked_item || QDELETED(marked_item)) //Wait nevermind M << "Your phylactery is gone!" return diff --git a/code/modules/spells/spell_types/rod_form.dm b/code/modules/spells/spell_types/rod_form.dm index 1e8545f76f..5046da7c34 100644 --- a/code/modules/spells/spell_types/rod_form.dm +++ b/code/modules/spells/spell_types/rod_form.dm @@ -28,6 +28,7 @@ var/max_distance = 13 var/mob/living/wizard var/turf/start_turf + notify = FALSE /obj/effect/immovablerod/wizard/Move() if(get_dist(start_turf, get_turf(src)) >= max_distance) @@ -39,4 +40,4 @@ wizard.status_flags &= ~GODMODE wizard.notransform = 0 wizard.forceMove(get_turf(src)) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm index dd55a88bdb..407c36448e 100644 --- a/code/modules/spells/spell_types/summonitem.dm +++ b/code/modules/spells/spell_types/summonitem.dm @@ -43,7 +43,7 @@ name = "Instant Summons" marked_item = null - else if(marked_item && qdeleted(marked_item)) //the item was destroyed at some point + else if(marked_item && QDELETED(marked_item)) //the item was destroyed at some point message = "You sense your marked item has been destroyed!" name = "Instant Summons" marked_item = null diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 877f8b490c..bd01b14c21 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -145,6 +145,9 @@ LB.brainmob.container = LB LB.brainmob.stat = DEAD +/obj/item/organ/eyes/transfer_to_limb(obj/item/bodypart/head/LB, mob/living/carbon/human/C) + LB.eyes = src + ..() /obj/item/bodypart/chest/drop_limb(special) return @@ -289,7 +292,6 @@ H.hair_style = hair_style H.facial_hair_color = facial_hair_color H.facial_hair_style = facial_hair_style - H.eye_color = eye_color H.lip_style = lip_style H.lip_color = lip_color if(real_name) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 110314cb8b..1932793654 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -25,8 +25,9 @@ var/facial_hair_color = "000" var/facial_hair_style = "Shaved" //Eye Colouring - var/eyes = "eyes" - var/eye_color = "" + + var/obj/item/organ/eyes/eyes = null + var/lip_style = null var/lip_color = "white" @@ -61,8 +62,6 @@ real_name = "Unknown" hair_style = "Bald" facial_hair_style = "Shaved" - eyes = "eyes" - eye_color = "" lip_style = null else if(!animal_origin) @@ -106,14 +105,6 @@ else lip_style = null lip_color = "white" - // eyes - if(EYECOLOR in S.species_traits) - eyes = S.eyes - eye_color = H.eye_color - else - eyes = "eyes" - eye_color = "" - ..() /obj/item/bodypart/head/update_icon_dropped() @@ -167,9 +158,12 @@ standing += lips // eyes - if(eye_color) - var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[eyes]", "layer" = -BODY_LAYER, "dir"=SOUTH) - img_eyes.color = "#" + eye_color + if(!eyes) + standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "eyes_missing", "layer" = -BODY_LAYER, "dir"=SOUTH) + + else if(eyes.eye_color) + var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes", "layer" = -BODY_LAYER, "dir"=SOUTH) + img_eyes.color = "#" + eyes.eye_color standing += img_eyes return standing diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 152c50306d..95dd3cf56c 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -11,6 +11,12 @@ implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/pen = 25) time = 64 +/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) + var/obj/item/organ/eyes/E = target.getorganslot("eye_sight") + if(!E) + user << "It's hard to do surgery on someones eyes when they don't have any." + return FALSE + /datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...") @@ -21,7 +27,7 @@ target.cure_nearsighted() target.blur_eyes(35) //this will fix itself slowly. target.set_eye_damage(0) - return 1 + return TRUE /datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(target.getorgan(/obj/item/organ/brain)) @@ -29,4 +35,4 @@ target.adjustBrainLoss(100) else user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.") - return 0 \ No newline at end of file + return FALSE \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index f5bf53e30c..7ca10c5c5e 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -1,5 +1,5 @@ -/obj/item/organ/cyberimp/eyes - name = "cybernetic eyes" +/obj/item/organ/cyberimp/eyes/hud + name = "cybernetic hud" desc = "artificial photoreceptors with specialized functionality" icon_state = "eye_implant" implant_overlay = "eye_implant_overlay" @@ -7,66 +7,6 @@ zone = "eyes" w_class = WEIGHT_CLASS_TINY - var/sight_flags = 0 - var/dark_view = 0 - var/eye_color = "fff" - var/old_eye_color = "fff" - var/flash_protect = 0 - var/see_invisible = 0 - var/aug_message = "Your vision is augmented!" - - -/obj/item/organ/cyberimp/eyes/Insert(var/mob/living/carbon/M, var/special = 0) - ..() - if(ishuman(owner) && eye_color) - var/mob/living/carbon/human/HMN = owner - old_eye_color = HMN.eye_color - HMN.eye_color = eye_color - HMN.regenerate_icons() - if(aug_message && !special) - owner << "[aug_message]" - - owner.update_sight() - -/obj/item/organ/cyberimp/eyes/Remove(var/mob/living/carbon/M, var/special = 0) - M.sight ^= sight_flags - if(ishuman(M) && eye_color) - var/mob/living/carbon/human/HMN = owner - HMN.eye_color = old_eye_color - HMN.regenerate_icons() - ..() - -/obj/item/organ/cyberimp/eyes/emp_act(severity) - if(!owner) - return - if(severity > 1) - if(prob(10 * severity)) - return - owner << "Static obfuscates your vision!" - owner.flash_act(visual = 1) - -/obj/item/organ/cyberimp/eyes/xray - name = "X-ray implant" - desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile." - eye_color = "000" - implant_color = "#000000" - origin_tech = "materials=4;programming=4;biotech=6;magnets=4" - dark_view = 8 - sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS - -/obj/item/organ/cyberimp/eyes/thermals - name = "Thermals implant" - desc = "These cybernetic eye implants will give you Thermal vision. Vertical slit pupil included." - eye_color = "FC0" - implant_color = "#FFCC00" - origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1" - sight_flags = SEE_MOBS - see_invisible = SEE_INVISIBLE_MINIMUM - flash_protect = -1 - dark_view = 8 - aug_message = "You see prey everywhere you look..." - - // HUD implants /obj/item/organ/cyberimp/eyes/hud name = "HUD implant" @@ -91,32 +31,11 @@ /obj/item/organ/cyberimp/eyes/hud/medical name = "Medical HUD implant" desc = "These cybernetic eye implants will display a medical HUD over everything you see." - eye_color = "0ff" - implant_color = "#00FFFF" origin_tech = "materials=4;programming=4;biotech=4" - aug_message = "You suddenly see health bars floating above people's heads..." HUD_type = DATA_HUD_MEDICAL_ADVANCED /obj/item/organ/cyberimp/eyes/hud/security name = "Security HUD implant" desc = "These cybernetic eye implants will display a security HUD over everything you see." - eye_color = "d00" - implant_color = "#CC0000" origin_tech = "materials=4;programming=4;biotech=3;combat=3" - aug_message = "Job indicator icons pop up in your vision. That is not a certified surgeon..." HUD_type = DATA_HUD_SECURITY_ADVANCED - - -// Welding shield implant -/obj/item/organ/cyberimp/eyes/shield - name = "welding shield implant" - desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." - slot = "eye_shield" - origin_tech = "materials=4;biotech=3;engineering=4;plasmatech=3" - implant_color = "#101010" - flash_protect = 2 - aug_message = null - eye_color = null - -/obj/item/organ/cyberimp/eyes/shield/emp_act(severity) - return diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 2c8f377fee..51fc8f1ab2 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -63,7 +63,7 @@ for(var/obj/item/I in stored_items) owner << "Your [owner.get_held_index_name(owner.get_held_index_of_item(I))]'s grip tightens." I.flags |= NODROP - + else release_items() owner << "Your hands relax..." @@ -157,8 +157,8 @@ /obj/item/weapon/storage/box/cyber_implants/bundle name = "boxed cybernetic implants" var/list/boxed = list( - /obj/item/organ/cyberimp/eyes/xray, - /obj/item/organ/cyberimp/eyes/thermals, + /obj/item/organ/eyes/robotic/xray, + /obj/item/organ/eyes/robotic/thermals, /obj/item/organ/cyberimp/brain/anti_stun, /obj/item/organ/cyberimp/chest/reviver) var/amount = 5 diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 5a509604f6..7316a188ce 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -728,3 +728,139 @@ if(!T) T = new() T.Insert(src) + + if(!getorganslot("eye_sight")) + var/obj/item/organ/eyes/E + + if(dna && dna.species && dna.species.mutanteyes) + E = new dna.species.mutanteyes() + + else + E = new() + E.Insert(src) + +//Eyes + +/obj/item/organ/eyes + name = "eyes" + icon_state = "eyeballs" + desc = "I see you!" + zone = "eyes" + slot = "eye_sight" + + var/sight_flags = 0 + var/see_in_dark = 2 + var/tint = 0 + var/eye_color = "fff" + var/old_eye_color = "fff" + var/flash_protect = 0 + var/see_invisible = SEE_INVISIBLE_LIVING + +/obj/item/organ/eyes/Insert(mob/living/carbon/M, special = 0) + ..() + if(ishuman(owner) && eye_color) + var/mob/living/carbon/human/HMN = owner + old_eye_color = HMN.eye_color + HMN.eye_color = eye_color + HMN.regenerate_icons() + M.update_tint() + owner.update_sight() + +/obj/item/organ/eyes/Remove(mob/living/carbon/M, special = 0) + ..() + if(ishuman(M) && eye_color) + var/mob/living/carbon/human/HMN = M + HMN.eye_color = old_eye_color + HMN.regenerate_icons() + M.update_tint() + M.update_sight() + +/obj/item/organ/eyes/night_vision + name = "shadow eyes" + desc = "A spooky set of eyes that can see in the dark." + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + actions_types = list(/datum/action/item_action/organ_action/use) + var/night_vision = TRUE + +/obj/item/organ/eyes/night_vision/ui_action_click() + if(night_vision) + see_in_dark = 4 + see_invisible = SEE_INVISIBLE_LIVING + night_vision = FALSE + else + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + night_vision = TRUE + +/obj/item/organ/eyes/night_vision/alien + name = "alien eyes" + desc = "It turned out they had them after all!" + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + sight_flags = SEE_MOBS + + +///Robotic + +/obj/item/organ/eyes/robotic + name = "robotic eyes" + icon_state = "cybernetic_eyeballs" + desc = "Your vision is augmented." + +/obj/item/organ/eyes/robotic/emp_act(severity) + if(!owner) + return + if(severity > 1) + if(prob(10 * severity)) + return + owner << "Static obfuscates your vision!" + owner.flash_act(visual = 1) + +/obj/item/organ/eyes/robotic/xray + name = "X-ray eyes" + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." + eye_color = "000" + see_in_dark = 8 + sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS + +/obj/item/organ/eyes/robotic/thermals + name = "Thermals eyes" + desc = "These cybernetic eye implants will give you Thermal vision. Vertical slit pupil included." + eye_color = "FC0" + origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1" + sight_flags = SEE_MOBS + see_invisible = SEE_INVISIBLE_MINIMUM + flash_protect = -1 + see_in_dark = 8 + +/obj/item/organ/eyes/robotic/flashlight + name = "flashlight eyes" + desc = "It's two flashlights rigged together with some wire. Why would you put these in someones head?" + eye_color ="fee5a3" + icon = 'icons/obj/lighting.dmi' + icon_state = "flashlight_eyes" + flash_protect = 2 + tint = INFINITY + +/obj/item/organ/eyes/robotic/flashlight/emp_act(severity) + return + +/obj/item/organ/eyes/robotic/flashlight/Insert(var/mob/living/carbon/M, var/special = 0) + ..() + M.AddLuminosity(15) + + +/obj/item/organ/eyes/robotic/flashlight/Remove(var/mob/living/carbon/M, var/special = 0) + M.AddLuminosity(-15) + ..() + +// Welding shield implant +/obj/item/organ/eyes/robotic/shield + name = "shielded robotic eyes" + desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." + origin_tech = "materials=4;biotech=3;engineering=4;plasmatech=3" + flash_protect = 2 + +/obj/item/organ/eyes/robotic/shield/emp_act(severity) + return \ No newline at end of file diff --git a/code/modules/uplink/uplink.dm b/code/modules/uplink/uplink.dm index 091fea9b7e..1fcd8aa230 100644 --- a/code/modules/uplink/uplink.dm +++ b/code/modules/uplink/uplink.dm @@ -69,6 +69,8 @@ var/global/list/uplinks = list() ui.open() /obj/item/device/uplink/ui_data(mob/user) + if(!user.mind) + return var/list/data = list() data["telecrystals"] = telecrystals data["lockable"] = lockable @@ -83,6 +85,13 @@ var/global/list/uplinks = list() var/datum/uplink_item/I = uplink_items[category][item] if(I.limited_stock == 0) continue + if(I.restricted_roles.len) + var/is_inaccessible = 1 + for(var/R in I.restricted_roles) + if(R == user.mind.assigned_role) + is_inaccessible = 0 + if(is_inaccessible) + continue cat["items"] += list(list( "name" = I.name, "cost" = I.cost, diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 2ecd1e9211..65507a3091 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -76,6 +76,7 @@ var/list/uplink_items = list() // Global list so we only initialize this once. var/limited_stock = -1 //Setting this above zero limits how many times this item can be bought by the same traitor in a round, -1 is unlimited var/list/include_modes = list() // Game modes to allow this item in. var/list/exclude_modes = list() // Game modes to disallow this item from. + var/list/restricted_roles = list() //If this uplink item is only available to certain roles. Roles are dependent on the frequency chip or stored ID. var/player_minimum //The minimum crew size needed for this item to be added to uplinks. var/purchase_log_vis = TRUE // Visible in the purchase log? @@ -1130,15 +1131,15 @@ var/list/uplink_items = list() // Global list so we only initialize this once. /datum/uplink_item/cyber_implants/thermals - name = "Thermal Vision Implant" + name = "Thermal eyes" desc = "These cybernetic eyes will give you thermal vision. Comes with a free autoimplanter." - item = /obj/item/organ/cyberimp/eyes/thermals + item = /obj/item/organ/eyes/robotic/thermals cost = 8 /datum/uplink_item/cyber_implants/xray name = "X-Ray Vision Implant" desc = "These cybernetic eyes will give you X-ray vision. Comes with an autoimplanter." - item = /obj/item/organ/cyberimp/eyes/xray + item = /obj/item/organ/eyes/robotic/xray cost = 10 /datum/uplink_item/cyber_implants/antistun @@ -1160,6 +1161,19 @@ var/list/uplink_items = list() // Global list so we only initialize this once. cost = 40 cant_discount = TRUE +// Role-specific items +/datum/uplink_item/role_restricted + category = "Role-Restricted" + exclude_modes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/role_restricted/ez_clean_bundle + name = "EZ Clean Grenade Bundle" + desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. The acid only affects carbon-based creatures." + item = /obj/item/weapon/storage/box/syndie_kit/ez_clean + cost = 6 + surplus = 20 + restricted_roles = list("Janitor") + // Pointless /datum/uplink_item/badass category = "(Pointless) Badassery" diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 3664ad5d70..9c28b5e624 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -42,7 +42,7 @@ M.loc = get_turf(src) ..() if(user.client) - user.client.view = view_range + user.client.change_view(view_range) if(riding_datum) riding_datum.ridden = src riding_datum.handle_vehicle_offsets() diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 0e2bd497ba..8d56850393 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -5,11 +5,11 @@ slot = "zombie_infection" origin_tech = "biotech=5" var/datum/species/old_species - var/living_transformation_time = 5 + var/living_transformation_time = 3 var/converts_living = FALSE - var/revive_time_min = 600 - var/revive_time_max = 1200 + var/revive_time_min = 450 + var/revive_time_max = 700 var/timer_id /obj/item/organ/zombie_infection/New(loc) @@ -49,7 +49,10 @@ return if(owner.stat != DEAD && !converts_living) return - + if(!iszombie(owner)) + owner << "You can feel your heart stopping, but something isn't right... \ + life has not abandoned your broken form. You can only feel a deep and immutable hunger that \ + not even death can stop, you will rise again!" var/revive_time = rand(revive_time_min, revive_time_max) var/flags = TIMER_STOPPABLE timer_id = addtimer(CALLBACK(src, .proc/zombify), revive_time, flags) diff --git a/code/orphaned_procs/statistics.dm b/code/orphaned_procs/statistics.dm index 55acae6608..bc6b6b2988 100644 --- a/code/orphaned_procs/statistics.dm +++ b/code/orphaned_procs/statistics.dm @@ -1,3 +1,211 @@ +var/datum/feedback/blackbox = new() + +//the feedback datum; stores all feedback +/datum/feedback + var/list/messages = list() + var/list/messages_admin = list() + + var/list/msg_common = list() + var/list/msg_science = list() + var/list/msg_command = list() + var/list/msg_medical = list() + var/list/msg_engineering = list() + var/list/msg_security = list() + var/list/msg_deathsquad = list() + var/list/msg_syndicate = list() + var/list/msg_service = list() + var/list/msg_cargo = list() + + var/list/datum/feedback_variable/feedback = new() + +/datum/feedback/proc/find_feedback_datum(variable) + for (var/datum/feedback_variable/FV in feedback) + if (FV.get_variable() == variable) + return FV + var/datum/feedback_variable/FV = new(variable) + feedback += FV + return FV + +/datum/feedback/proc/get_round_feedback() + return feedback + +/datum/feedback/proc/round_end_data_gathering() + var/pda_msg_amt = 0 + var/rc_msg_amt = 0 + + for (var/obj/machinery/message_server/MS in message_servers) + if (MS.pda_msgs.len > pda_msg_amt) + pda_msg_amt = MS.pda_msgs.len + if (MS.rc_msgs.len > rc_msg_amt) + rc_msg_amt = MS.rc_msgs.len + + feedback_set_details("radio_usage","") + + feedback_add_details("radio_usage","COM-[msg_common.len]") + feedback_add_details("radio_usage","SCI-[msg_science.len]") + feedback_add_details("radio_usage","HEA-[msg_command.len]") + feedback_add_details("radio_usage","MED-[msg_medical.len]") + feedback_add_details("radio_usage","ENG-[msg_engineering.len]") + feedback_add_details("radio_usage","SEC-[msg_security.len]") + feedback_add_details("radio_usage","DTH-[msg_deathsquad.len]") + feedback_add_details("radio_usage","SYN-[msg_syndicate.len]") + feedback_add_details("radio_usage","SRV-[msg_service.len]") + feedback_add_details("radio_usage","CAR-[msg_cargo.len]") + feedback_add_details("radio_usage","OTH-[messages.len]") + feedback_add_details("radio_usage","PDA-[pda_msg_amt]") + feedback_add_details("radio_usage","RC-[rc_msg_amt]") + + feedback_set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set. + +//This proc is only to be called at round end. +/datum/feedback/proc/save_all_data_to_sql() + if (!feedback) return + + round_end_data_gathering() //round_end time logging and some other data processing + establish_db_connection() + if (!dbcon.IsConnected()) return + var/round_id + + var/DBQuery/query = dbcon.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]") + query.Execute() + while (query.NextRow()) + round_id = query.item[1] + + if (!isnum(round_id)) + round_id = text2num(round_id) + round_id++ + + var/sqlrowlist = "" + + for (var/datum/feedback_variable/FV in feedback) + if (sqlrowlist != "") + sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error + + sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")" + + if (sqlrowlist == "") + return + + var/DBQuery/query_insert = dbcon.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist) + query_insert.Execute() + + +/proc/feedback_set(variable,value) + if(!blackbox) + return + + var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) + + if(!FV) + return + + FV.set_value(value) + +/proc/feedback_inc(variable,value) + if(!blackbox) + return + + var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) + + if(!FV) + return + + FV.inc(value) + +/proc/feedback_dec(variable,value) + if(!blackbox) + return + + var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) + + if(!FV) + return + + FV.dec(value) + +/proc/feedback_set_details(variable,details) + if(!blackbox) + return + + var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) + + if(!FV) + return + + FV.set_details(details) + +/proc/feedback_add_details(variable,details) + if(!blackbox) + return + + var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) + + if(!FV) + return + + FV.add_details(details) + +//feedback variable datum, for storing all kinds of data +/datum/feedback_variable + var/variable + var/value + var/details + +/datum/feedback_variable/New(var/param_variable,var/param_value = 0) + variable = param_variable + value = param_value + +/datum/feedback_variable/proc/inc(num = 1) + if (isnum(value)) + value += num + else + value = text2num(value) + if (isnum(value)) + value += num + else + value = num + +/datum/feedback_variable/proc/dec(num = 1) + if (isnum(value)) + value -= num + else + value = text2num(value) + if (isnum(value)) + value -= num + else + value = -num + +/datum/feedback_variable/proc/set_value(num) + if (isnum(num)) + value = num + +/datum/feedback_variable/proc/get_value() + if (!isnum(value)) + return 0 + return value + +/datum/feedback_variable/proc/get_variable() + return variable + +/datum/feedback_variable/proc/set_details(text) + if (istext(text)) + details = text + +/datum/feedback_variable/proc/add_details(text) + if (istext(text)) + text = replacetext(text, " ", "_") + if (!details) + details = text + else + details += " [text]" + +/datum/feedback_variable/proc/get_details() + return details + +/datum/feedback_variable/proc/get_parsed() + return list(variable,value,details) + +//sql reporting procs /proc/sql_poll_players() if(!config.sql_enabled) return @@ -15,7 +223,6 @@ var/err = query.ErrorMsg() log_game("SQL ERROR during player polling. Error : \[[err]\]\n") - /proc/sql_poll_admins() if(!config.sql_enabled) return @@ -40,82 +247,45 @@ if(!config.sql_enabled) return -/proc/sql_report_death(mob/living/carbon/human/H) +/proc/sql_report_death(mob/living/L) if(!config.sql_enabled) return - if(!H) + if(!L) return - if(!H.key || !H.mind) + if(!L.key || !L.mind) return - var/turf/T = H.loc + var/turf/T = get_turf(L) var/area/placeofdeath = get_area(T.loc) var/podname = placeofdeath.name - var/sqlname = sanitizeSQL(H.real_name) - var/sqlkey = sanitizeSQL(H.key) + var/sqlname = sanitizeSQL(L.real_name) + var/sqlkey = sanitizeSQL(L.key) var/sqlpod = sanitizeSQL(podname) - var/sqlspecial = sanitizeSQL(H.mind.special_role) - var/sqljob = sanitizeSQL(H.mind.assigned_role) + var/sqlspecial = sanitizeSQL(L.mind.special_role) + var/sqljob = sanitizeSQL(L.mind.assigned_role) var/laname var/lakey - if(H.lastattacker) - laname = sanitizeSQL(H.lastattacker:real_name) - lakey = sanitizeSQL(H.lastattacker:key) + if(L.lastattacker) + laname = sanitizeSQL(L.lastattacker:real_name) + lakey = sanitizeSQL(L.lastattacker:key) var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss") - var/coord = "[H.x], [H.y], [H.z]" - //world << "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])" + var/coord = "[L.x], [L.y], [L.z]" + var/map = MAP_NAME + var/server = "[world.internet_address]:[world.port]" establish_db_connection() if(!dbcon.IsConnected()) log_game("SQL ERROR during death reporting. Failed to connect.") else - var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.getBruteLoss()], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()], '[coord]')") + var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord, mapname, server) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[L.gender]', [L.getBruteLoss()], [L.getFireLoss()], [L.brainloss], [L.getOxyLoss()], '[coord]', '[map]', '[server]')") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during death reporting. Error : \[[err]\]\n") - -/proc/sql_report_cyborg_death(mob/living/silicon/robot/H) - if(!config.sql_enabled) - return - if(!H) - return - if(!H.key || !H.mind) - return - - var/turf/T = H.loc - var/area/placeofdeath = get_area(T.loc) - var/podname = placeofdeath.name - - var/sqlname = sanitizeSQL(H.real_name) - var/sqlkey = sanitizeSQL(H.key) - var/sqlpod = sanitizeSQL(podname) - var/sqlspecial = sanitizeSQL(H.mind.special_role) - var/sqljob = sanitizeSQL(H.mind.assigned_role) - var/laname - var/lakey - if(H.lastattacker) - laname = sanitizeSQL(H.lastattacker:real_name) - lakey = sanitizeSQL(H.lastattacker:key) - var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss") - var/coord = "[H.x], [H.y], [H.z]" - //world << "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])" - establish_db_connection() - if(!dbcon.IsConnected()) - log_game("SQL ERROR during death reporting. Failed to connect.") - else - var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.getBruteLoss()], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()], '[coord]')") - if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during death reporting. Error : \[[err]\]\n") - - - - //This proc is used for feedback. It is executed at round end. /proc/sql_commit_feedback() if(!blackbox) - log_game("Round ended without a blackbox recorder. No feedback was sent to the database.") + log_game("Round ended without a blackbox recorder. No feedback was sent to the database: This should not happen without admin intervention.") return //content is a list of lists. Each item in the list is a list with two fields, a variable name and a value. Items MUST only have these two values. @@ -153,4 +323,4 @@ var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("feedback")] (id, roundid, time, variable, value) VALUES (null, [newroundid], Now(), '[variable]', '[value]')") if(!query.Execute()) var/err = query.ErrorMsg() - log_game("SQL ERROR during feedback reporting. Error : \[[err]\]\n") \ No newline at end of file + log_game("SQL ERROR during feedback reporting. Error : \[[err]\]\n") diff --git a/code/world.dm b/code/world.dm index 0f95ad4012..d69ab5427c 100644 --- a/code/world.dm +++ b/code/world.dm @@ -259,7 +259,7 @@ var/last_irc_status = 0 if(ticker && ticker.round_end_sound) world << sound(ticker.round_end_sound) else - world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg','sound/misc/leavingtg.ogg', 'sound/misc/its_only_game.ogg', 'sound/misc/yeehaw.ogg')) // random end sounds!! - LastyBatsy + world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg','sound/misc/leavingtg.ogg', 'sound/misc/its_only_game.ogg', 'sound/misc/yeehaw.ogg', 'sound/misc/disappointed.ogg')) // random end sounds!! - LastyBatsy if(blackbox) blackbox.save_all_data_to_sql() sleep(soundwait) diff --git a/html/changelog.html b/html/changelog.html index 0626c09906..270dd0e880 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,158 @@ -->
    +

    06 February 2017

    +

    Xhuis updated:

    +
      +
    • Traitor janitors can now order EZ-clean grenades for 6 telecrystals per bundle. They function like normal cleaning grenades with an added "oh god my face is melting" effect, and can also be found in surplus crates.
    • +
    + +

    05 February 2017

    +

    Cyberboss updated:

    +
      +
    • Shuttle docking/round end shouldn't lag as much
    • +
    • There's a new round end sound!
    • +
    +

    Hyena updated:

    +
      +
    • The bible now contains 1 whiskey
    • +
    +

    Joan updated:

    +
      +
    • Ratvar-converted AIs become brass-colored, speak in Ratvarian, and cannot be carded.
    • +
    +

    Kor updated:

    +
      +
    • Eyes are now organs. You can remove or implant them into peoples heads with organ manipulation surgery. A mob without eyes will obviously have trouble seeing.
    • +
    • All special eye powers are now tied to their respective organs. For example, this means you can harvest an alien or shadow persons eyes, have them implanted, and gain toggle-able night vision.
    • +
    • All cybernetic eye implants are now cybernetic eyes, meaning you must replace the patients organic eyes. HUD implants are still just regular implants.
    • +
    +

    Lzimann updated:

    +
      +
    • Tesla zaps can now generate an energy ball if they zap a tesla generator!
    • +
    +

    Sweaterkittens updated:

    +
      +
    • The station's Plasmamen have been issued a new production of envirosuits. The most notable change aside from small aesthetic differences is the addition of an integrated helmet light.
    • +
    • Tweaked a few of the Plasma Envirosuit sprites to be more fitting thematically.
    • +
    +

    Swindly updated:

    +
      +
    • Saline-glucose solution can no longer decrease blood volume
    • +
    • Cyborg hyposprays can now dispense saline-glucose solution
    • +
    • Saline-glucose solution now increases blood volume when it heals
    • +
    +

    coiax updated:

    +
      +
    • The mulligan reagent can now be created with 1u stable mutation toxin + 1u unstable mutagen.
    • +
    • Tesla balls cannot dust people near grounding rods.
    • +
    • Soapstones/chisel/magic markers/chalk can remove messages for free. Removing one of your own messages still grants a use.
    • +
    • The Janitor starts with a dull soapstone for removing unwanted messages.
    • +
    +

    xmikey555 updated:

    +
      +
    • The tesla engine no longer destroys energy ball generators.
    • +
    + +

    04 February 2017

    +

    Cyberboss updated:

    +
      +
    • Modular computers now explode properly
    • +
    • Emagged holograms can no longer be exported for credits
    • +
    • Abstract entities no longer feed the singularity
    • +
    • Machine frames will no longer be anchored when created
    • +
    +

    Joan updated:

    +
      +
    • Vanguard now shows you how long you have until it deactivates.
    • +
    +

    Kor updated:

    +
      +
    • By combing two flashlights and cable coil, you can create a new eye implant: flashlight eyes. People with flashlights for eyes can not see, but they will provide an enormous amount of light to their friends.
    • +
    • Valentines day will now randomly pair up crew members on dates. The paired crewmembers will get an objective to protect each other at all costs.
    • +
    +

    Steelpoint updated:

    +
      +
    • Addition of two security DragNETs to Deltastations, Omegastations and Metastations armouries.
    • +
    +

    Tofa01 updated:

    +
      +
    • [Delta] Removes space money from gold crate replaces with 3 Gold Bars Gold Wrestling belt is still there.
    • +
    • [Delta] Removes space money from silver crate replaces with 5 Silver Coins.
    • +
    • Fixes incorrect placement of RD modular computer on Metastation.
    • +
    +

    WhiteHusky updated:

    +
      +
    • Fields are supported when printing with a modular computer
    • +
    • PRINTER_FONT is now a variable
    • +
    • Removed the [logo] tag on Modular computers as the logo no longer exists
    • +
    • New lines on paper are parsed properly
    • +
    • [tab] is now four non-breaking spaces on papers
    • +
    • Papers have an additional proc, reload_fields, to allow fields made programmatically to be used
    • +
    • stripped_input stripped_multiline_input has a new argument: no_trim
    • +
    • Modular computers no longer spew HTML when looking at a file, rather it is unescaped like it should
    • +
    • Modular computers no longer show escaped HTML entities when editing
    • +
    • Modular computers can now propperly read and write from external media
    • +
    • Modular computers' file browser lists files correctly
    • +
    • NTOS File Manager had a spelling mistake; Manage instead of Manager
    • +
    +

    coiax updated:

    +
      +
    • Engraved messages can no longer be moved by a gravitational singularity.
    • +
    • The deadchat notification of randomly triggered events now uses the deadsay span.
    • +
    • The wizard spell "Rod Form" does not produce a message in deadchat everytime it is used.
    • +
    + +

    03 February 2017

    +

    Cobby updated:

    +
      +
    • Ghosts will now be informed when an event has been triggered by our lovely RNG system.
    • +
    +

    Cyberboss updated:

    +
      +
    • Firedoors will eventually reseal themselves if left open during a fire alarm
    • +
    +

    Joan updated:

    +
      +
    • Clockwork Marauders have 25% less health, 300 health from 400.
    • +
    • The Vitality Matrix scripture is now a Script, from an Application. Its cost has been accordingly adjusted.
    • +
    • Vitality Matrices will be consumed upon successfully reviving a Servant. They also drain and heal conscious targets slightly slower.
    • +
    • The Fellowship Armory scripture is now an Application, from a Script. Its cost has been accordingly adjusted.
    • +
    • Fellowship Armory now affects all Servants in view of the invoker, and will replace weaker gear and armor with its Ratvarian armor. Also, clockwork treads now allow you to move in no gravity like magboots.
    • +
    • Mania Motors no longer instantly convert people next to them.
    • +
    • Instead, you have to remain next to them for several seconds, after which you will be knocked out, then converted if possible.
    • +
    • Mania Motors now cost slightly less power to run.
    • +
    +

    Jordie0608 updated:

    +
      +
    • Admin notes, memos and watchlist entries now use a generalized system, they can all be accessed from the former notes browser.
    • +
    • Added to this are messages, which allow admins to leave a message for players that is delivered to them when they next connect.
    • +
    +

    Lexorion updated:

    +
      +
    • Laser projectiles have a new sprite! They also have a new effect when they hit a wall.
    • +
    +

    Sweaterkittens and Joan updated:

    +
      +
    • Ocular Wardens will now provide auditory feedback when they acquire targets and deal damage.
    • +
    • adds ocularwarden-target.ogg, ocularwarden-dot1.ogg and ocularwarden-dot2.ogg to the game sound files.
    • +
    +

    Tofa01 updated:

    +
      +
    • [Delta] Allows Station Engineers to access Delta Atmospherics Solar Panel Array Room.
    • +
    • [Omega] Adds a Massdriver room to chapel on Omegastation.
    • +
    +

    bgobandit updated:

    +
      +
    • All art storage facilities offer construction paper now!
    • +
    +

    coiax updated:

    +
      +
    • A victim of a transformation disease will retain their name.
    • +
    • The slime transformation disease can turn you into any colour or age of slime.
    • +
    • The Abductor event can now happen at any time, rather than thirty (30) minute plus rounds.
    • +
    +

    01 February 2017

    Cyberboss updated:

      @@ -1214,42 +1366,6 @@
    • Captain's hardsuit/SWAT suit got a few buffs. It's now much more robust.
    • Captain's space suit is now heat proof as well as fireproof. Long overlooked no longer.
    - -

    04 December 2016

    -

    Durkel updated:

    -
      -
    • Recent enemy reports indicate that changelings have grown bored with attacking near desolate stations and have shifted focus to more fertile hunting grounds.
    • -
    - -

    03 December 2016

    -

    Joan updated:

    -
      -
    • Trying to move while bound by Geis will cause you to start resisting, but the time required to resist is up by half a second.
    • -
    • Resisting out of Geis now does damage to the binding, and as such being stunned while bound will no longer totally reset your resist progress.
    • -
    • Using Geis on someone already bound by Geis will interrupt them resisting out of it and will fully repair the binding.
    • -
    • Geis's pre-binding channel now takes longer for each servant above 5. Geis's conversion channel also takes slightly longer for each servant above 5.
    • -
    • Converted engineering and miner cyborgs can now create Sigils of Transgression.
    • -
    -

    RandomMarine updated:

    -
      -
    • Airlocks will keep their original name when their electronics are removed and replaced. You may still use a pen to rename the assembly if desired.
    • -
    - -

    02 December 2016

    -

    Cobby updated:

    -
      -
    • Removes the exploit that allowed you to bypass grabcooldowns with Ctrl+Click
    • -
    -

    PeopleAreStrange updated:

    -
      -
    • Changed F7 to buildmode, F8 to Invismin (again). Removed stealthmin toggle
    • -
    -

    RemieRichards updated:

    -
      -
    • Added a new lavaland "boss"
    • -
    • Hostile mobs will now find a new target if they failed to attack their current one for 30 seconds, this reduces cheese by simply making the mob find something else to do/someone to kill
    • -
    • Hostile mobs with search_objects will now regain that value after a certain amount of time (per-mob, base 3 seconds), this is because being attacked causes mobs with this var to turn it off, so they can run away, however it was literally never turned on which caused swarmers to get depression and never do anything.
    • -
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 8531efdc07..b527155eb0 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9193,3 +9193,137 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: You can now fold up bluespace body bags with creatures or objects inside. You can't fold them up if too many things are inside, but anything you fold up in can be carried around in the object and redeployed at any time. +2017-02-03: + Cobby: + - rscadd: Ghosts will now be informed when an event has been triggered by our lovely + RNG system. + Cyberboss: + - tweak: Firedoors will eventually reseal themselves if left open during a fire + alarm + Joan: + - tweak: Clockwork Marauders have 25% less health, 300 health from 400. + - wip: The Vitality Matrix scripture is now a Script, from an Application. Its cost + has been accordingly adjusted. + - tweak: Vitality Matrices will be consumed upon successfully reviving a Servant. + They also drain and heal conscious targets slightly slower. + - wip: The Fellowship Armory scripture is now an Application, from a Script. Its + cost has been accordingly adjusted. + - tweak: Fellowship Armory now affects all Servants in view of the invoker, and + will replace weaker gear and armor with its Ratvarian armor. Also, clockwork + treads now allow you to move in no gravity like magboots. + - rscdel: Mania Motors no longer instantly convert people next to them. + - rscadd: Instead, you have to remain next to them for several seconds, after which + you will be knocked out, then converted if possible. + - tweak: Mania Motors now cost slightly less power to run. + Jordie0608: + - tweak: Admin notes, memos and watchlist entries now use a generalized system, + they can all be accessed from the former notes browser. + - rscadd: Added to this are messages, which allow admins to leave a message for + players that is delivered to them when they next connect. + Lexorion: + - tweak: Laser projectiles have a new sprite! They also have a new effect when they + hit a wall. + Sweaterkittens and Joan: + - rscadd: Ocular Wardens will now provide auditory feedback when they acquire targets + and deal damage. + - soundadd: adds ocularwarden-target.ogg, ocularwarden-dot1.ogg and ocularwarden-dot2.ogg + to the game sound files. + Tofa01: + - bugfix: '[Delta] Allows Station Engineers to access Delta Atmospherics Solar Panel + Array Room.' + - rscadd: '[Omega] Adds a Massdriver room to chapel on Omegastation.' + bgobandit: + - rscadd: All art storage facilities offer construction paper now! + coiax: + - rscadd: A victim of a transformation disease will retain their name. + - tweak: The slime transformation disease can turn you into any colour or age of + slime. + - rscadd: The Abductor event can now happen at any time, rather than thirty (30) + minute plus rounds. +2017-02-04: + Cyberboss: + - bugfix: Modular computers now explode properly + - bugfix: Emagged holograms can no longer be exported for credits + - bugfix: Abstract entities no longer feed the singularity + - tweak: Machine frames will no longer be anchored when created + Joan: + - rscadd: Vanguard now shows you how long you have until it deactivates. + Kor: + - rscadd: 'By combing two flashlights and cable coil, you can create a new eye implant: + flashlight eyes. People with flashlights for eyes can not see, but they will + provide an enormous amount of light to their friends.' + - rscadd: Valentines day will now randomly pair up crew members on dates. The paired + crewmembers will get an objective to protect each other at all costs. + Steelpoint: + - rscadd: Addition of two security DragNETs to Deltastations, Omegastations and + Metastations armouries. + Tofa01: + - rscadd: '[Delta] Removes space money from gold crate replaces with 3 Gold Bars + Gold Wrestling belt is still there.' + - rscadd: '[Delta] Removes space money from silver crate replaces with 5 Silver + Coins.' + - bugfix: Fixes incorrect placement of RD modular computer on Metastation. + WhiteHusky: + - rscadd: Fields are supported when printing with a modular computer + - rscadd: PRINTER_FONT is now a variable + - rscdel: Removed the [logo] tag on Modular computers as the logo no longer exists + - tweak: New lines on paper are parsed properly + - tweak: '[tab] is now four non-breaking spaces on papers' + - tweak: Papers have an additional proc, reload_fields, to allow fields made programmatically + to be used + - tweak: 'stripped_input stripped_multiline_input has a new argument: no_trim' + - bugfix: Modular computers no longer spew HTML when looking at a file, rather it + is unescaped like it should + - bugfix: Modular computers no longer show escaped HTML entities when editing + - bugfix: Modular computers can now propperly read and write from external media + - bugfix: Modular computers' file browser lists files correctly + - spellcheck: NTOS File Manager had a spelling mistake; Manage instead of Manager + coiax: + - bugfix: Engraved messages can no longer be moved by a gravitational singularity. + - tweak: The deadchat notification of randomly triggered events now uses the deadsay + span. + - rscdel: The wizard spell "Rod Form" does not produce a message in deadchat everytime + it is used. +2017-02-05: + Cyberboss: + - bugfix: Shuttle docking/round end shouldn't lag as much + - rscadd: There's a new round end sound! + Hyena: + - bugfix: The bible now contains 1 whiskey + Joan: + - rscadd: Ratvar-converted AIs become brass-colored, speak in Ratvarian, and cannot + be carded. + Kor: + - rscadd: Eyes are now organs. You can remove or implant them into peoples heads + with organ manipulation surgery. A mob without eyes will obviously have trouble + seeing. + - rscadd: All special eye powers are now tied to their respective organs. For example, + this means you can harvest an alien or shadow persons eyes, have them implanted, + and gain toggle-able night vision. + - rscadd: All cybernetic eye implants are now cybernetic eyes, meaning you must + replace the patients organic eyes. HUD implants are still just regular implants. + Lzimann: + - rscadd: Tesla zaps can now generate an energy ball if they zap a tesla generator! + Sweaterkittens: + - rscadd: The station's Plasmamen have been issued a new production of envirosuits. + The most notable change aside from small aesthetic differences is the addition + of an integrated helmet light. + - tweak: Tweaked a few of the Plasma Envirosuit sprites to be more fitting thematically. + Swindly: + - bugfix: Saline-glucose solution can no longer decrease blood volume + - rscadd: Cyborg hyposprays can now dispense saline-glucose solution + - rscadd: Saline-glucose solution now increases blood volume when it heals + coiax: + - bugfix: The mulligan reagent can now be created with 1u stable mutation toxin + + 1u unstable mutagen. + - rscdel: Tesla balls cannot dust people near grounding rods. + - rscadd: Soapstones/chisel/magic markers/chalk can remove messages for free. Removing + one of your own messages still grants a use. + - rscadd: The Janitor starts with a dull soapstone for removing unwanted messages. + xmikey555: + - tweak: The tesla engine no longer destroys energy ball generators. +2017-02-06: + Xhuis: + - rscadd: Traitor janitors can now order EZ-clean grenades for 6 telecrystals per + bundle. They function like normal cleaning grenades with an added "oh god my + face is melting" effect, and can also be found in surplus crates. diff --git a/icons/effects/clockwork_effects.dmi b/icons/effects/clockwork_effects.dmi index f315ad1fff..8bbf24a7ef 100644 Binary files a/icons/effects/clockwork_effects.dmi and b/icons/effects/clockwork_effects.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 732f2d2d90..31a6983b86 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index aa57dc0ea9..d5af755f21 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 2b4f28029a..e1dbb99158 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index a49080bcd1..8a48c84c2f 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 881652a838..72adf533b6 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 4c32093c75..554144e76e 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 480a515702..811c95536a 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 986b35dac1..3f473e684f 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/smooth_structures/clockwork_window.dmi b/icons/obj/smooth_structures/clockwork_window.dmi index 14494bbd11..90309ac3d5 100644 Binary files a/icons/obj/smooth_structures/clockwork_window.dmi and b/icons/obj/smooth_structures/clockwork_window.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 9d2e8af027..d4f27ed2b8 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index c3716eda37..d1adc29196 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/sound/misc/disappointed.ogg b/sound/misc/disappointed.ogg new file mode 100644 index 0000000000..65b7a302a9 Binary files /dev/null and b/sound/misc/disappointed.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 48f56ea906..fccf050e3d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -954,10 +954,9 @@ #include "code\modules\admin\NewBan.dm" #include "code\modules\admin\player_panel.dm" #include "code\modules\admin\secrets.dm" -#include "code\modules\admin\sql_notes.dm" +#include "code\modules\admin\sql_message_system.dm" #include "code\modules\admin\stickyban.dm" #include "code\modules\admin\topic.dm" -#include "code\modules\admin\watchlist.dm" #include "code\modules\admin\whitelist.dm" #include "code\modules\admin\DB_ban\functions.dm" #include "code\modules\admin\permissionverbs\permissionedit.dm" @@ -1257,6 +1256,7 @@ #include "code\modules\food_and_drinks\food\snacks_vend.dm" #include "code\modules\food_and_drinks\food\snacks\dough.dm" #include "code\modules\food_and_drinks\food\snacks\meat.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm" #include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm" #include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" #include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index 03651d3a6b..061a7de6a6 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb18b25',endColorstr='#ff5f380e',GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input::-moz-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input::-moz-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index cddb68b52c..49c0f5f50e 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,16 +1,16 @@ -require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,p=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),_=o(b.length),x=0,w=e?s(f,_):n?s(f,0):void 0;_>x;x++)if((l||x in b)&&(m=b[x],v=y(m,x,g),t))if(e)w[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,_=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";r(t,f,++y)}return"O"+t[f]},x=function(t,e){var n,a=_(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&p(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=x(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!x(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return u(this[b])}}),c},def:function(t,e,n){var a,r,i=x(t,e);return i?i.v=n:(t._l=i={i:r=_(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:x,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,_={},x=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,P=k[b](m?{}:-0,1)!=k,C=c(function(){k.has(1)}),E=l(function(t){new g(t)});E||(g=e(function(e,n){u(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(C||w)&&(x("delete"),x("has"),h&&x("get")),(w||P)&&x(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),_[t]=g,r(r.G+r.W+r.F*(g!=v),_),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],_=m?r:r[e]||(r[e]={}),x=_[u]||(_[u]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),_[c]!=f&&i(_,c,d),g&&x[c]!=f&&(x[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,_,x){p(n,e,b);var w,k,P=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},C=e+" Iterator",E=y==v,S=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||P(y);if(O){var M=l(T.call(new t));c(M,C,!0),!a&&s(A,h)&&o(M,f,g),E&&O.name!==v&&(S=!0,T=function(){return O.call(this)})}if(a&&!x||!d&&!S&&A[f]||o(A,f,T),u[e]=T,u[C]=g,y)if(w={values:E?T:P(v),keys:_?T:P(m),entries:E?P("entries"):T},x)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||S),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var a=t(83)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){p.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var a=t(22),r=t(16),i=t(24);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",p=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),_=t(76),x=t(79),w=t(34),k=t(82)("__proto__"),P=t(8),C=t(7)(!1),E=Object.prototype,S=Array.prototype,A=S.slice,O=S.join,T=r.setDesc,M=r.getDesc,R=r.setDescs,j={};o||(a=!d(function(){return 7!=T(p("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return M(t,e)}catch(n){}return c(t,e)?s(!E.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=R=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:R});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),D=L.length,F=function(){var t,e=p("iframe"),n=D,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("