diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index e0f33226e8c..ed4fb787b8d 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -254,7 +254,7 @@ CREATE TABLE `player` ( `UI_style_alpha` smallint(4) DEFAULT '255', `be_role` mediumtext, `default_slot` smallint(4) DEFAULT '1', - `toggles` mediumint(8) DEFAULT '383', + `toggles` int(8) DEFAULT '383', `sound` mediumint(8) DEFAULT '31', `randomslot` tinyint(1) DEFAULT '0', `volume` smallint(4) DEFAULT '100', @@ -266,8 +266,9 @@ CREATE TABLE `player` ( `exp` mediumtext, `clientfps` smallint(4) DEFAULT '0', `atklog` smallint(4) DEFAULT '0', - `fuid` BIGINT(20) NULL DEFAULT NULL, - `fupdate` SMALLINT(4) NULL DEFAULT 0, + `fuid` bigint(20) NULL DEFAULT NULL, + `fupdate` smallint(4) NULL DEFAULT '0', + `afk_watch` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; @@ -531,11 +532,11 @@ DROP TABLE IF EXISTS `ipintel`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; 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', -PRIMARY KEY ( `ip` ) -) ENGINE = INNODB; + `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 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -545,7 +546,21 @@ DROP TABLE IF EXISTS `vpn_whitelist`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `vpn_whitelist` ( - `ckey` VARCHAR(32) NOT NULL, - `reason` text + `ckey` varchar(32) NOT NULL, + `reason` text, PRIMARY KEY (`ckey`) -) ENGINE=INNODB; +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `oauth_tokens` +-- +DROP TABLE IF EXISTS `oauth_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `oauth_tokens` ( + `ckey` varchar(32) NOT NULL, + `token` varchar(32) NOT NULL, + PRIMARY KEY (`token`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index ecb28a867e4..b0f7bbc5c82 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -253,7 +253,7 @@ CREATE TABLE `SS13_player` ( `UI_style_alpha` smallint(4) DEFAULT '255', `be_role` mediumtext, `default_slot` smallint(4) DEFAULT '1', - `toggles` mediumint(8) DEFAULT '383', + `toggles` int(8) DEFAULT '383', `sound` mediumint(8) DEFAULT '31', `randomslot` tinyint(1) DEFAULT '0', `volume` smallint(4) DEFAULT '100', @@ -265,8 +265,9 @@ CREATE TABLE `SS13_player` ( `exp` mediumtext, `clientfps` smallint(4) DEFAULT '0', `atklog` smallint(4) DEFAULT '0', - `fuid` BIGINT(20) NULL DEFAULT NULL, - `fupdate` SMALLINT(4) NULL DEFAULT 0, + `fuid` bigint(20) NULL DEFAULT NULL, + `fupdate` smallint(4) NULL DEFAULT '0', + `afk_watch` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; @@ -530,11 +531,11 @@ DROP TABLE IF EXISTS `SS13_ipintel`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; 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; + `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 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -544,7 +545,21 @@ DROP TABLE IF EXISTS `SS13_vpn_whitelist`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `SS13_vpn_whitelist` ( - `ckey` VARCHAR(32) NOT NULL, + `ckey` varchar(32) NOT NULL, `reason` text, PRIMARY KEY (`ckey`) -) ENGINE=INNODB; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `SS13_oauth_tokens` +-- +DROP TABLE IF EXISTS `SS13_oauth_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `SS13_oauth_tokens` ( + `ckey` varchar(32) NOT NULL, + `token` varchar(32) NOT NULL, + PRIMARY KEY (`token`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; diff --git a/SQL/updates/5-6.sql b/SQL/updates/5-6.sql index 91bf4328a2a..ac3be8f8ef8 100644 --- a/SQL/updates/5-6.sql +++ b/SQL/updates/5-6.sql @@ -1,34 +1,37 @@ #Updating the SQL from version 5 to version 6. -Kyep #Make a table to track the results of VPN/proxy lookups for IPs (IPINTEL, TG PORT) -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', -PRIMARY KEY ( `ip` ) -) ENGINE = INNODB; +DROP TABLE IF EXISTS `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', + PRIMARY KEY (`ip`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; #Make a table to track which ckeys are whitelisted for use of VPNs (IPINTEL, CUSTOM) +DROP TABLE IF EXISTS `vpn_whitelist`; CREATE TABLE `vpn_whitelist` ( - `ckey` VARCHAR(32) NOT NULL, + `ckey` varchar(32) NOT NULL, `reason` text, PRIMARY KEY (`ckey`) -) ENGINE=INNODB; +) ENGINE=InnoDB DEFAULT CHARSET=latin1; -# Add fuid (forum userid) which enables quick lookup of which ckey is associated with a specific forum account. (FORUM LINK) -ALTER TABLE `player` ADD `fuid` BIGINT(20) NULL DEFAULT NULL; +#Add fuid (forum userid) which enables quick lookup of which ckey is associated with a specific forum account. (FORUM LINK) +ALTER TABLE `player` ADD `fuid` bigint(20) NULL DEFAULT NULL; ALTER TABLE `player` ADD INDEX(`fuid`); -# Add fupdate (forum update required) which flags specific ckeys as having been banned/unbanned, which requires an update of their forum/etc permissions (FORUM LINK) -ALTER TABLE `player` ADD `fupdate` SMALLINT(4) NULL DEFAULT 0; +#Add fupdate (forum update required) which flags specific ckeys as having been banned/unbanned, which requires an update of their forum/etc permissions (FORUM LINK) +ALTER TABLE `player` ADD `fupdate` smallint(4) NULL DEFAULT 0; ALTER TABLE `player` ADD INDEX(`fupdate`); #Make a table to track oauth tokens for linking forum/web accounts (FORUM LINK) +DROP TABLE IF EXISTS `oauth_tokens`; CREATE TABLE `oauth_tokens` ( - `ckey` VARCHAR(32) NOT NULL, - `token` VARCHAR(32) NOT NULL, + `ckey` varchar(32) NOT NULL, + `token` varchar(32) NOT NULL, PRIMARY KEY (`token`) -) ENGINE=INNODB; +) ENGINE=InnoDB DEFAULT CHARSET=latin1; #Drop the old 'discord' table that is not used anymore DROP TABLE `discord`; diff --git a/SQL/updates/6-7.sql b/SQL/updates/6-7.sql new file mode 100644 index 00000000000..c871302b2de --- /dev/null +++ b/SQL/updates/6-7.sql @@ -0,0 +1,2 @@ +ALTER TABLE player +MODIFY COLUMN toggles int; \ No newline at end of file diff --git a/SQL/updates/7-8.sql b/SQL/updates/7-8.sql new file mode 100644 index 00000000000..16bc90b7a50 --- /dev/null +++ b/SQL/updates/7-8.sql @@ -0,0 +1,2 @@ +# Add afk_watch which gives users the option to make use of the AFK watcher subsystem +ALTER TABLE `player` ADD `afk_watch` tinyint(1) NOT NULL DEFAULT '0'; diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index bac17c5a2ad..447889d17a1 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -208,7 +208,7 @@ /turf/simulated/shuttle/plating, /area/shuttle/abandoned) "aaC" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -383,10 +383,10 @@ }, /area/shuttle/abandoned) "abb" = ( -/obj/structure/chair{ +/obj/effect/decal/remains/human, +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/effect/decal/remains/human, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -598,13 +598,13 @@ /area/shuttle/abandoned) "abx" = ( /obj/item/shard, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/abandoned) "aby" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -667,8 +667,8 @@ icon_state = "1-2"; pixel_y = 0 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "abH" = ( /obj/structure/computerframe{ @@ -728,7 +728,7 @@ }, /area/shuttle/syndicate) "abO" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -859,8 +859,8 @@ icon_state = "2-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "acf" = ( /obj/structure/cable{ @@ -880,29 +880,29 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "acg" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "ach" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "aci" = ( /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "acj" = ( /obj/structure/cable{ @@ -921,8 +921,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "ack" = ( /obj/structure/spacepoddoor, @@ -967,8 +967,8 @@ }, /area/maintenance/auxsolarstarboard) "acp" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "acq" = ( /obj/structure/table, @@ -986,7 +986,7 @@ }, /area/shuttle/abandoned) "acs" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -994,7 +994,7 @@ }, /area/shuttle/syndicate) "act" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -1081,20 +1081,20 @@ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "acF" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "acG" = ( /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "acH" = ( /obj/structure/chair/stool, @@ -1502,9 +1502,6 @@ }, /area/shuttle/pod_1) "adx" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -1515,6 +1512,9 @@ dir = 4; icon_state = "tube1" }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_1) "ady" = ( @@ -1524,9 +1524,6 @@ }, /area/shuttle/pod_2) "adz" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -1537,6 +1534,9 @@ dir = 4; icon_state = "tube1" }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_2) "adA" = ( @@ -1663,25 +1663,25 @@ /turf/simulated/wall/r_wall, /area/hallway/secondary/entry) "adO" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/item/radio/intercom{ dir = 4; name = "station intercom (General)"; pixel_x = 28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_1) "adP" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/item/radio/intercom{ dir = 4; name = "station intercom (General)"; pixel_x = 28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_2) "adQ" = ( @@ -1775,8 +1775,8 @@ pixel_y = -25; req_access_txt = "10;13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "aed" = ( /obj/docking_port/mobile/pod{ @@ -3034,7 +3034,7 @@ }, /area/shuttle/administration) "agw" = ( -/obj/structure/chair/comfy/black, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -3382,13 +3382,13 @@ }, /area/shuttle/administration) "ahn" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/structure/window/plasmareinforced{ color = "#d70000"; dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -3615,7 +3615,7 @@ /turf/simulated/floor/engine/vacuum, /area/engine/mechanic_workshop/hanger) "ahN" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -3737,7 +3737,7 @@ }, /area/security/podbay) "aic" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -3745,10 +3745,10 @@ }, /area/shuttle/administration) "aid" = ( -/obj/structure/chair{ +/obj/machinery/light/spot, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light/spot, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -3798,7 +3798,7 @@ icon_state = "tube1"; dir = 4 }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/transport) "aik" = ( @@ -3810,21 +3810,21 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "ail" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/effect/landmark{ name = "JoinLate" }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "aim" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/landmark{ name = "JoinLate" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "ain" = ( @@ -4073,13 +4073,13 @@ /turf/simulated/shuttle/plating, /area/shuttle/transport) "aiR" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, /area/shuttle/transport) "aiS" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -4094,21 +4094,21 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "aiU" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/effect/landmark{ name = "HONKsquad" }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "aiV" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/landmark{ name = "HONKsquad" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "aiW" = ( @@ -4343,7 +4343,7 @@ }, /area/shuttle/specops) "ajs" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -4354,7 +4354,7 @@ dir = 2; network = list("ERT","CentComm") }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -4407,7 +4407,7 @@ icon_state = "tube1"; dir = 8 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -4418,7 +4418,7 @@ icon_state = "tube1"; dir = 4 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -4601,14 +4601,14 @@ /turf/simulated/shuttle/plating/vox, /area/shuttle/vox) "ajW" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -4866,7 +4866,7 @@ }, /area/shuttle/specops) "aku" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -5036,11 +5036,13 @@ /turf/simulated/shuttle/plating/vox, /area/shuttle/vox) "akN" = ( -/obj/structure/chair/stool, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) "akO" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor4/vox, @@ -5380,7 +5382,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "alw" = ( -/obj/structure/chair/office/dark, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "alx" = ( @@ -5692,9 +5694,6 @@ /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, /area/maintenance/fsmaint) -"ami" = ( -/obj/structure/lattice/catwalk, -/area/space/nearstation) "amj" = ( /obj/machinery/door/poddoor/shutters{ density = 0; @@ -8074,7 +8073,7 @@ /area/shuttle/vox) "arn" = ( /obj/item/stack/spacecash/c50, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor4/vox, @@ -8544,10 +8543,10 @@ "asf" = ( /obj/item/stack/spacecash/c200, /obj/item/stack/spacecash/c50, -/obj/structure/chair{ +/obj/machinery/light/spot, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light/spot, /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) "asg" = ( @@ -8927,8 +8926,8 @@ icon_state = "1-2"; pixel_y = 0 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "asV" = ( /obj/structure/cable{ @@ -8943,8 +8942,8 @@ icon_state = "1-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "asW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -9001,21 +9000,21 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "atb" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "atc" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "atd" = ( /turf/simulated/wall/r_wall, @@ -9354,8 +9353,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "atL" = ( /obj/structure/cable{ @@ -9374,8 +9373,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "atM" = ( /obj/structure/cable{ @@ -9495,8 +9494,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "atV" = ( /obj/structure/disposalpipe/segment{ @@ -9546,8 +9545,8 @@ }, /area/maintenance/auxsolarport) "atZ" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "aua" = ( /obj/effect/decal/cleanable/dirt, @@ -12858,8 +12857,8 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 6 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aAf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -12907,8 +12906,8 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aAj" = ( /obj/structure/cable{ @@ -13822,8 +13821,8 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 5 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aBW" = ( /obj/structure/cable{ @@ -14708,8 +14707,8 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 10 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aDD" = ( /obj/structure/cable{ @@ -14982,23 +14981,23 @@ /obj/machinery/atmospherics/unary/outlet_injector/on{ dir = 8 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/engine/controlroom) "aEa" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 9 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aEb" = ( /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "aEc" = ( /obj/structure/cable{ @@ -15006,8 +15005,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "aEd" = ( /obj/machinery/atmospherics/trinary/filter{ @@ -15772,8 +15771,8 @@ /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 10 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aFA" = ( /turf/simulated/wall, @@ -18103,13 +18102,13 @@ /area/security/prison) "aJy" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space) "aJz" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aJA" = ( /obj/structure/cable{ @@ -19474,8 +19473,8 @@ d2 = 4; icon_state = "0-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarport) "aLR" = ( /obj/structure/chair/stool, @@ -19494,8 +19493,8 @@ /area/crew_quarters/bar/atrium) "aLT" = ( /obj/item/wrench, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aLU" = ( /turf/simulated/wall, @@ -21046,8 +21045,8 @@ /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 5 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aOV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -21060,8 +21059,8 @@ /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aOX" = ( /obj/effect/decal/cleanable/dirt, @@ -25713,8 +25712,8 @@ /obj/structure/disposaloutlet{ dir = 8 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/incinerator) "aWS" = ( /obj/structure/table/reinforced, @@ -27674,8 +27673,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aZZ" = ( /obj/item/radio/intercom{ @@ -27696,8 +27695,8 @@ dir = 8; icon_state = "pipe-c" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bab" = ( /obj/effect/spawner/window/reinforced, @@ -28072,8 +28071,8 @@ dir = 4; level = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/atmos) "baO" = ( /obj/machinery/access_button{ @@ -28605,8 +28604,8 @@ dir = 4; level = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/atmos) "bbG" = ( /turf/simulated/floor/plating, @@ -28632,21 +28631,18 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_3) "bbJ" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/item/radio/intercom{ broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_3) "bbK" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -28654,6 +28650,9 @@ pixel_y = 32 }, /obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_3) "bbL" = ( @@ -30759,7 +30758,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/mining) "bfQ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -33621,8 +33620,8 @@ }, /area/atmos) "bkQ" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/atmos) "bkR" = ( /obj/structure/reagent_dispensers/fueltank, @@ -37929,7 +37928,7 @@ }, /area/shuttle/siberia) "bsy" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -39468,8 +39467,8 @@ dir = 4; level = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/atmos) "buY" = ( /obj/structure/cable{ @@ -41012,15 +41011,12 @@ }, /area/security/nuke_storage) "bxH" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, /area/shuttle/siberia) "bxI" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/flasher{ id = "gulagshuttleflasher"; pixel_x = 25 @@ -41029,6 +41025,9 @@ dir = 4; icon_state = "tube1" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/shuttle/siberia) "bxJ" = ( @@ -52886,8 +52885,8 @@ /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 9 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bRn" = ( /obj/structure/rack, @@ -53123,8 +53122,8 @@ dir = 1; layer = 2.9 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bRH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -54793,8 +54792,8 @@ pixel_y = -20; req_access_txt = "32" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bUc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -55187,8 +55186,8 @@ dir = 4; level = 1 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bUK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -55445,8 +55444,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bVg" = ( /obj/structure/cable{ @@ -55662,8 +55661,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bVt" = ( /obj/structure/sign/vacuum{ @@ -57177,8 +57176,8 @@ pixel_y = 20; req_access_txt = "10;13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bXG" = ( /obj/structure/cable{ @@ -57187,8 +57186,8 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bXH" = ( /obj/item/twohanded/required/kirbyplants, @@ -57380,8 +57379,8 @@ tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bYb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -57463,8 +57462,8 @@ dir = 5; level = 1 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bYm" = ( /obj/structure/cable{ @@ -57477,8 +57476,8 @@ dir = 4; level = 1 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bYn" = ( /obj/structure/sign/directions/evac{ @@ -57686,8 +57685,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bYK" = ( /obj/effect/spawner/window/reinforced, @@ -57907,8 +57906,8 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bZg" = ( /obj/structure/table/reinforced, @@ -58082,8 +58081,8 @@ dir = 4; level = 1 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bZx" = ( /obj/structure/disposalpipe/segment{ @@ -62768,8 +62767,8 @@ dir = 4; level = 1 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "chx" = ( /obj/structure/cable{ @@ -63819,8 +63818,8 @@ tag = "icon-D-SE"; icon_state = "D-SE" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cjm" = ( /obj/structure/closet/crate, @@ -66332,8 +66331,8 @@ tag = "icon-E-SW-NW"; icon_state = "E-SW-NW" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cnI" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -66555,8 +66554,8 @@ /obj/structure/transit_tube{ icon_state = "E-W-Pass" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "coj" = ( /obj/structure/cable/yellow{ @@ -69022,8 +69021,8 @@ level = 1 }, /obj/structure/transit_tube, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "css" = ( /obj/structure/table/reinforced, @@ -69083,8 +69082,8 @@ tag = "icon-W-SE"; icon_state = "W-SE" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "csz" = ( /obj/structure/closet/crate{ @@ -69730,8 +69729,8 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ctJ" = ( /obj/structure/transit_tube{ @@ -69741,8 +69740,8 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ctK" = ( /obj/structure/table/wood, @@ -69890,8 +69889,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ctZ" = ( /obj/effect/spawner/window/reinforced, @@ -72989,8 +72988,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "czx" = ( /obj/structure/cable{ @@ -74431,8 +74430,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cBV" = ( /obj/structure/chair/office/dark, @@ -77524,8 +77523,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cHu" = ( /obj/effect/decal/cleanable/cobweb, @@ -78371,8 +78370,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cJf" = ( /obj/structure/sign/directions/evac{ @@ -78818,8 +78817,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cKk" = ( /obj/structure/cable{ @@ -78833,8 +78832,8 @@ /area/toxins/xenobiology) "cKl" = ( /obj/structure/window/reinforced, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cKm" = ( /obj/structure/cable{ @@ -80269,8 +80268,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cNo" = ( /obj/structure/cable{ @@ -80738,8 +80737,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cOa" = ( /obj/structure/table/reinforced, @@ -80914,8 +80913,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cOn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -81673,8 +81672,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cPL" = ( /obj/structure/disposalpipe/segment{ @@ -81841,8 +81840,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cPY" = ( /obj/machinery/access_button{ @@ -81854,8 +81853,8 @@ pixel_y = 24; req_access_txt = "0" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cPZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -107526,8 +107525,8 @@ pixel_y = 25; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "dKy" = ( /obj/structure/grille, @@ -109774,17 +109773,17 @@ }, /area/hallway/secondary/exit) "dOy" = ( -/obj/structure/chair{ +/obj/effect/decal/warning_stripes/yellow/hollow, +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/effect/decal/warning_stripes/yellow/hollow, /turf/simulated/floor/plasteel, /area/shuttle/escape) "dOz" = ( -/obj/structure/chair{ +/obj/effect/decal/warning_stripes/yellow/hollow, +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/effect/decal/warning_stripes/yellow/hollow, /turf/simulated/floor/plasteel, /area/shuttle/escape) "dOA" = ( @@ -110232,8 +110231,8 @@ icon_state = "0-2"; pixel_y = 0 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "dPo" = ( /obj/structure/bed/roller, @@ -110919,8 +110918,8 @@ }, /area/medical/virology) "dQB" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dQC" = ( /obj/machinery/field/generator{ @@ -112646,7 +112645,7 @@ /turf/simulated/shuttle/floor4, /area/shuttle/escape) "dTN" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "dTO" = ( @@ -112669,16 +112668,16 @@ }, /area/shuttle/escape) "dTR" = ( -/obj/structure/chair, /obj/effect/decal/warning_stripes/yellow/hollow, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/plasteel, /area/shuttle/escape) "dTS" = ( -/obj/structure/chair, /obj/machinery/status_display{ pixel_y = 32 }, /obj/effect/decal/warning_stripes/yellow/hollow, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/plasteel, /area/shuttle/escape) "dTT" = ( @@ -113013,7 +113012,7 @@ /turf/simulated/floor/plating, /area/security/checkpoint) "dUw" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor4, @@ -113429,7 +113428,7 @@ /turf/simulated/floor/plating, /area/security/checkpoint) "dVf" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor4, @@ -113515,16 +113514,16 @@ /turf/simulated/floor/plating, /area/security/checkpoint) "dVr" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "dVs" = ( -/obj/structure/chair{ +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "dVt" = ( @@ -113661,7 +113660,7 @@ }, /area/shuttle/escape) "dVJ" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plasteel{ @@ -113680,7 +113679,7 @@ }, /area/shuttle/escape) "dVL" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -113706,7 +113705,7 @@ }, /area/shuttle/escape) "dVO" = ( -/obj/structure/chair/office/dark, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -114147,14 +114146,14 @@ }, /area/security/checkpoint) "dWB" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/light{ icon_state = "tube1"; dir = 4 }, /obj/effect/decal/warning_stripes/yellow/hollow, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/floor/plasteel, /area/shuttle/escape) "dWC" = ( @@ -114990,8 +114989,8 @@ pixel_y = 24; req_access_txt = "0" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "dXY" = ( /obj/structure/table/reinforced, @@ -115328,8 +115327,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dYJ" = ( /obj/structure/cable{ @@ -115337,8 +115336,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dYK" = ( /obj/structure/cable{ @@ -115355,8 +115354,8 @@ pixel_y = 25; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dYL" = ( /obj/structure/cable{ @@ -115371,8 +115370,8 @@ icon_state = "1-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dYM" = ( /obj/structure/cable{ @@ -115392,16 +115391,16 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dYN" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dYO" = ( /obj/structure/cable{ @@ -115420,8 +115419,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dYP" = ( /obj/structure/cable{ @@ -115435,8 +115434,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dYQ" = ( /obj/machinery/access_button{ @@ -115448,8 +115447,8 @@ pixel_y = 24; req_access_txt = "10;13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "dYR" = ( /obj/structure/cable{ @@ -115457,8 +115456,8 @@ icon_state = "0-2"; pixel_y = 0 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dYS" = ( /obj/structure/cable{ @@ -115467,8 +115466,8 @@ icon_state = "1-2"; pixel_y = 0 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/portsolar) "dYT" = ( /turf/simulated/floor/carpet, @@ -115565,20 +115564,20 @@ }, /area/shuttle/syndicate_elite) "dZc" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/syndicate_elite) "dZd" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -115586,7 +115585,7 @@ }, /area/shuttle/syndicate_elite) "dZe" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -115655,7 +115654,7 @@ /turf/simulated/shuttle/plating, /area/shuttle/syndicate_elite) "dZj" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -115782,15 +115781,15 @@ }, /area/shuttle/syndicate_sit) "dZA" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8 }, /obj/structure/window/reinforced, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -115812,7 +115811,7 @@ }, /area/shuttle/syndicate_sit) "dZD" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -115820,7 +115819,7 @@ }, /area/shuttle/syndicate_sit) "dZE" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -115833,7 +115832,7 @@ icon_state = "tube1"; dir = 8 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -115891,7 +115890,7 @@ }, /area/shuttle/syndicate_sit) "dZI" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -116010,6 +116009,12 @@ }, /turf/space, /area/space) +"udT" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor4/vox, +/area/shuttle/vox) (1,1,1) = {" aaa @@ -129823,7 +129828,7 @@ dyn dyn abj abj -ami +acF aaa aaa aaa @@ -130337,7 +130342,7 @@ dyn dyn abj abj -ami +acF aaa aaa aaa @@ -175945,8 +175950,8 @@ aaa aaa ajm akm -akN -akN +udT +udT akm alU ajO diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 63c912e11d7..8bf89da81b2 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -148,7 +148,7 @@ }, /area/shuttle/syndicate) "aaq" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -234,7 +234,7 @@ }, /area/shuttle/syndicate) "aaB" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -242,7 +242,7 @@ }, /area/shuttle/syndicate) "aaC" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -765,8 +765,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "abB" = ( /turf/simulated/wall/r_wall, @@ -868,8 +868,8 @@ /area/shuttle/syndicate) "abL" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "abM" = ( /obj/structure/cable{ @@ -882,8 +882,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "abN" = ( /obj/structure/table, @@ -958,28 +958,28 @@ d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "abV" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "abW" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "abX" = ( /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "abY" = ( /obj/structure/cable{ @@ -997,8 +997,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "abZ" = ( /obj/structure/cable{ @@ -1011,8 +1011,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "aca" = ( /obj/structure/cable/yellow{ @@ -1055,8 +1055,8 @@ /area/solar/auxport) "acf" = ( /obj/item/stack/cable_coil, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "acg" = ( /obj/effect/spawner/window/reinforced, @@ -1269,8 +1269,8 @@ name = "xeno_spawn"; pixel_x = -1 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "acA" = ( /turf/simulated/floor/plasteel, @@ -1333,9 +1333,6 @@ }, /area/shuttle/pod_2) "acI" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -1344,6 +1341,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_2) "acJ" = ( @@ -1394,12 +1394,12 @@ /turf/simulated/floor/plating, /area/security/permabrig) "acP" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/item/radio/intercom{ pixel_x = 25 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_2) "acQ" = ( @@ -1627,8 +1627,8 @@ icon_state = "0-2"; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "adj" = ( /obj/structure/cable{ @@ -1636,8 +1636,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "adk" = ( /obj/machinery/light/small{ @@ -1990,8 +1990,8 @@ /area/shuttle/vox) "adP" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "adQ" = ( /obj/structure/table, @@ -2117,8 +2117,8 @@ }, /area/security/permabrig) "aee" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "aef" = ( /obj/structure/lattice/catwalk, @@ -2135,8 +2135,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "aeh" = ( /turf/simulated/shuttle/wall{ @@ -2419,8 +2419,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "aeB" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ @@ -2831,11 +2831,13 @@ /turf/simulated/shuttle/plating/vox, /area/shuttle/vox) "afi" = ( -/obj/structure/chair/stool, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) "afj" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor4/vox, @@ -2893,8 +2895,8 @@ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "afp" = ( /obj/structure/chair/stool, @@ -2918,8 +2920,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "afr" = ( /obj/effect/spawner/window/reinforced, @@ -3124,8 +3126,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "afH" = ( /turf/simulated/shuttle/wall{ @@ -3385,8 +3387,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "agf" = ( /obj/machinery/atmospherics/pipe/simple/hidden, @@ -3411,12 +3413,12 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_3) "agi" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/item/radio/intercom{ pixel_y = 25 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_3) "agj" = ( @@ -3451,8 +3453,8 @@ pixel_y = 1; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "ago" = ( /obj/structure/cable, @@ -3654,8 +3656,8 @@ }) "agH" = ( /obj/item/stack/cable_coil, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "agI" = ( /turf/space, @@ -3699,8 +3701,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "agN" = ( /obj/machinery/atmospherics/unary/portables_connector{ @@ -5105,8 +5107,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "aiR" = ( /obj/structure/cable{ @@ -5114,8 +5116,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "aiS" = ( /obj/structure/closet/secure_closet/brig{ @@ -5522,15 +5524,15 @@ /turf/simulated/floor/plating, /area/maintenance/auxsolarport) "ajD" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/status_display{ density = 0; layer = 4; pixel_y = 32 }, /obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_3) "ajE" = ( @@ -6296,8 +6298,8 @@ name = "xeno_spawn"; pixel_x = -1 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "akY" = ( /obj/effect/spawner/window/reinforced, @@ -9245,7 +9247,7 @@ /area/shuttle/vox) "aqo" = ( /obj/item/stack/spacecash/c50, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor4/vox, @@ -9916,10 +9918,10 @@ "ary" = ( /obj/item/stack/spacecash/c200, /obj/item/stack/spacecash/c50, -/obj/structure/chair{ +/obj/machinery/light/spot, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light/spot, /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) "arz" = ( @@ -11430,9 +11432,6 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "auc" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/flasher{ id = "gulagshuttleflasher"; pixel_x = 25 @@ -11440,6 +11439,9 @@ /obj/machinery/light{ dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/shuttle/siberia) "aud" = ( @@ -11642,8 +11644,8 @@ icon_state = "0-2"; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/maintenance/auxsolarstarboard) "auw" = ( /obj/structure/disposalpipe/segment, @@ -12827,10 +12829,10 @@ layer = 4; pixel_y = 32 }, -/obj/structure/chair{ +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/machinery/light, /turf/simulated/shuttle/floor, /area/shuttle/pod_4) "awE" = ( @@ -14058,7 +14060,7 @@ /turf/simulated/floor/plasteel, /area/engine/gravitygenerator) "ayO" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -16682,7 +16684,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/mining) "aDr" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -16910,7 +16912,7 @@ }, /area/security/nuke_storage) "aDJ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -26731,12 +26733,12 @@ /turf/space, /area/space/nearstation) "aUW" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/item/radio/intercom{ pixel_x = 25 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_1) "aUX" = ( @@ -27588,9 +27590,6 @@ name = "Port Maintenance" }) "aWr" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -27599,6 +27598,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_1) "aWs" = ( @@ -27654,10 +27656,6 @@ /obj/effect/decal/cleanable/fungus, /turf/simulated/wall, /area/maintenance/fore) -"aWw" = ( -/turf/space, -/obj/structure/lattice/catwalk, -/area/space/nearstation) "aWx" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room"; @@ -31844,8 +31842,8 @@ }) "bdO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/construction/hallway{ name = "\improper MiniSat Exterior" }) @@ -36496,7 +36494,7 @@ /obj/item/radio/intercom{ pixel_y = 25 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -36689,15 +36687,15 @@ }, /area/shuttle/arrival/station) "blP" = ( -/obj/structure/chair, /obj/machinery/light{ dir = 1; in_use = 1 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "blQ" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "blR" = ( @@ -36708,12 +36706,12 @@ }, /area/shuttle/arrival/station) "blS" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/landmark{ name = "JoinLate" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "blT" = ( @@ -38981,14 +38979,14 @@ name = "\improper MiniSat Exterior" }) "bpw" = ( -/obj/structure/chair{ +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "bpx" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -43950,8 +43948,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bxn" = ( /obj/structure/transit_tube{ @@ -43971,8 +43969,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bxo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -43984,10 +43982,11 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) -"bxp" = (/obj/structure/transit_tube_pod, +"bxp" = ( +/obj/structure/transit_tube_pod, /obj/structure/window/reinforced{ dir = 8 }, @@ -44020,8 +44019,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bxr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -50737,14 +50736,14 @@ }, /area/shuttle/transport) "bIH" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/transport) "bII" = ( @@ -50752,16 +50751,16 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "bIJ" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/transport) "bIK" = ( -/obj/structure/chair, /obj/machinery/light/spot{ tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/transport) "bIL" = ( @@ -53206,16 +53205,16 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "bMz" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, /area/shuttle/transport) "bMA" = ( -/obj/structure/chair{ +/obj/machinery/light/spot, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light/spot, /turf/simulated/shuttle/floor, /area/shuttle/transport) "bMB" = ( @@ -65908,8 +65907,8 @@ /area/hydroponics) "ciB" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "ciC" = ( /obj/effect/decal/warning_stripes/northeast, @@ -66269,8 +66268,8 @@ /turf/simulated/floor/plating, /area/atmos) "cjc" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cjd" = ( /obj/effect/spawner/window/reinforced, @@ -67031,8 +67030,8 @@ icon_state = "0-2"; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cks" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -68466,8 +68465,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cmI" = ( /obj/machinery/vending/wallmed1{ @@ -74375,8 +74374,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cvR" = ( /obj/structure/chair/office/light, @@ -76930,8 +76929,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cAg" = ( /obj/structure/closet, @@ -77549,8 +77548,8 @@ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cBf" = ( /obj/machinery/computer/security/telescreen{ @@ -77572,8 +77571,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cBh" = ( /obj/item/storage/secure/safe{ @@ -78222,8 +78221,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cCg" = ( /obj/item/reagent_containers/glass/beaker/large, @@ -78305,8 +78304,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cCk" = ( /obj/structure/table, @@ -78456,8 +78455,8 @@ /area/medical/surgeryobs) "cCw" = ( /obj/item/stack/cable_coil, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cCx" = ( /obj/structure/cable/yellow{ @@ -78490,8 +78489,8 @@ d2 = 4; icon_state = "0-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cCA" = ( /turf/simulated/floor/plasteel{ @@ -78807,8 +78806,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cDa" = ( /obj/machinery/door/airlock/maintenance{ @@ -82329,8 +82328,8 @@ pixel_x = -1 }, /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cIO" = ( /obj/item/flashlight/lamp, @@ -86865,8 +86864,8 @@ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cPV" = ( /obj/structure/closet/wardrobe/robotics_black{ @@ -91756,8 +91755,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cXO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -92022,8 +92021,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cYj" = ( /obj/structure/chair, @@ -92219,8 +92218,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cYB" = ( /obj/machinery/light/small{ @@ -92476,12 +92475,12 @@ }) "cYY" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cYZ" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cZa" = ( /obj/machinery/light_switch{ @@ -92526,8 +92525,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cZd" = ( /obj/structure/cable{ @@ -92545,8 +92544,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cZe" = ( /turf/simulated/shuttle/wall{ @@ -92593,8 +92592,8 @@ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cZk" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -92801,8 +92800,8 @@ }) "cZA" = ( /obj/item/stack/cable_coil, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cZB" = ( /turf/simulated/shuttle/floor, @@ -92999,8 +92998,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cZX" = ( /obj/machinery/light{ @@ -93368,17 +93367,17 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "daC" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/escape) "daD" = ( -/obj/structure/chair, /obj/machinery/light{ dir = 1; on = 1 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -94194,7 +94193,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "dbQ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -94333,10 +94332,10 @@ }, /area/chapel/main) "dbY" = ( -/obj/structure/chair{ +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -94567,10 +94566,10 @@ }, /area/shuttle/escape) "dcp" = ( -/obj/structure/chair, /obj/machinery/light{ dir = 1 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -94640,8 +94639,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "dcw" = ( /obj/structure/window/reinforced, @@ -94848,8 +94847,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "dcO" = ( /obj/docking_port/stationary{ @@ -94868,9 +94867,6 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "dcQ" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/item/radio/intercom{ broadcasting = 0; listening = 1; @@ -94878,6 +94874,9 @@ pixel_y = -28 }, /obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -94958,13 +94957,13 @@ name = "\improper Secure Lab" }) "dda" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, /area/shuttle/escape) "ddb" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/plating{ @@ -94972,11 +94971,11 @@ }, /area/shuttle/escape) "ddc" = ( -/obj/structure/chair/office/dark, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/escape) "ddd" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -95013,7 +95012,7 @@ name = "\improper Secure Lab" }) "ddi" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -95021,7 +95020,7 @@ }, /area/shuttle/escape) "ddj" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -95125,8 +95124,8 @@ name = "xeno_spawn"; pixel_x = -1 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddx" = ( /turf/simulated/shuttle/wall{ @@ -95197,8 +95196,8 @@ icon_state = "0-2"; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddE" = ( /turf/simulated/shuttle/wall{ @@ -95213,12 +95212,12 @@ }, /area/shuttle/escape) "ddG" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/reagent_dispensers/peppertank{ pixel_x = 31 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -95230,12 +95229,12 @@ }, /area/shuttle/escape) "ddI" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light{ dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/plating{ icon_state = "floorgrime" }, @@ -95381,12 +95380,12 @@ name = "\improper Secure Lab" }) "ddV" = ( -/obj/structure/chair, /obj/item/radio/intercom{ dir = 4; name = "Station Intercom (General)"; pixel_y = 27 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -95419,12 +95418,12 @@ name = "\improper Secure Lab" }) "ddY" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light{ dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -95651,7 +95650,7 @@ /turf/simulated/wall/r_wall, /area/medical/virology) "dev" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -97507,6 +97506,12 @@ }, /turf/simulated/floor/plating, /area/maintenance/fore) +"tXL" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor4/vox, +/area/shuttle/vox) (1,1,1) = {" aaa @@ -112048,7 +112053,7 @@ apf abq aaa abq -aWw +aef abq aaa aaa @@ -112305,7 +112310,7 @@ apf aaa aaa aaa -aWw +aef aaa bZU bZU @@ -134177,9 +134182,9 @@ cHf abq aaa aaa -aWw +aef cPU -aWw +aef aaa abq aaa @@ -134937,7 +134942,7 @@ aaa abq aaa abq -aWw +aef abq abq aaa @@ -135194,7 +135199,7 @@ abq abq abq abq -aWw +aef aaa aaa aaa @@ -143627,8 +143632,8 @@ aCg bjT aTR bgL -aWw -aWw +aef +aef abq abq aaa @@ -144114,7 +144119,7 @@ aaa aaa aaa abq -aWw +aef aCj aDm aFm @@ -144371,7 +144376,7 @@ aaa abq abq abq -aWw +aef bre aCg aDn @@ -147693,8 +147698,8 @@ aaa aaa adM aeF -afi -afi +tXL +tXL aeF agJ aeh @@ -148510,8 +148515,8 @@ abq aaa aaa abq -aWw -aWw +aef +aef abq bsQ abq diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index bed554f54f2..f27926e04f9 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -1771,13 +1771,6 @@ /obj/structure/grille, /turf/simulated/shuttle/plating, /area/centcom/evac) -"eP" = ( -/obj/structure/chair{ - dir = 4; - name = "Prosecution" - }, -/turf/simulated/shuttle/floor, -/area/centcom/evac) "eQ" = ( /obj/structure/closet/secure_closet/cargotech, /turf/unsimulated/floor{ @@ -5049,27 +5042,27 @@ }, /area/tdome/tdomeobserve) "nK" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/light/small{ tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/assault_pod) "nL" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/small{ tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -6113,7 +6106,7 @@ /turf/space, /area/shuttle/escape_pod5/centcom) "xF" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -6121,7 +6114,7 @@ }, /area/centcom/evac) "xG" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -6129,7 +6122,7 @@ }, /area/centcom/evac) "xW" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -6139,13 +6132,13 @@ /turf/simulated/shuttle/floor, /area/centcom/evac) "yd" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, /area/centcom/evac) "yf" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/centcom/evac) "yg" = ( @@ -6160,12 +6153,6 @@ icon_state = "floor4" }, /area/shuttle/escape) -"yl" = ( -/obj/structure/chair/sofa/corner, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/escape) "ym" = ( /obj/structure/chair/office/dark, /turf/unsimulated/floor{ @@ -6265,25 +6252,25 @@ /turf/unsimulated/ai_visible, /area/ai_multicam_room) "EE" = ( -/obj/structure/chair{ +/obj/machinery/light/small, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light/small, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/assault_pod) "Fz" = ( -/obj/structure/chair, /obj/machinery/light/small{ dir = 1 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/assault_pod) "FV" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -6291,13 +6278,19 @@ }, /area/shuttle/assault_pod) "FW" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/assault_pod) +"Gw" = ( +/obj/structure/chair/sofa/left, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/escape) "HX" = ( /turf/unsimulated/ai_visible, /area/ai_multicam_room) @@ -27558,7 +27551,7 @@ fe fd fG eh -eP +xW fd fT fC @@ -47108,7 +47101,7 @@ ab ab ab fi -yk +Gw jE jE jE @@ -47365,7 +47358,7 @@ ab ab ab fi -yl +jE jE jE jE diff --git a/_maps/map_files/MetaStation/z4.dmm b/_maps/map_files/MetaStation/z4.dmm index d73e5d2d490..6b7523f801d 100644 --- a/_maps/map_files/MetaStation/z4.dmm +++ b/_maps/map_files/MetaStation/z4.dmm @@ -4864,8 +4864,8 @@ /area/derelict/se_solar) "nv" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "nw" = ( /obj/structure/grille, @@ -4900,8 +4900,8 @@ icon_state = "0-2"; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "nB" = ( /obj/structure/cable{ @@ -4921,8 +4921,8 @@ icon_state = "1-2"; pixel_y = 0 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "nD" = ( /obj/structure/cable{ @@ -4956,8 +4956,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "nG" = ( /obj/structure/cable{ @@ -4970,8 +4970,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "nH" = ( /obj/structure/cable{ @@ -4979,8 +4979,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "nI" = ( /obj/structure/cable{ @@ -4999,8 +4999,8 @@ icon_state = "1-2"; pixel_y = 0 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "nJ" = ( /obj/structure/cable{ @@ -5013,8 +5013,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "nK" = ( /obj/structure/cable{ @@ -5032,13 +5032,13 @@ d2 = 8; icon_state = "1-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "nL" = ( /obj/item/stack/cable_coil/cut, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "nM" = ( /turf/simulated/floor/plating/airless{ @@ -5120,8 +5120,8 @@ /turf/simulated/wall/r_wall, /area/derelict/se_solar) "oa" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "ob" = ( /obj/machinery/door/airlock/external{ @@ -5156,8 +5156,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "og" = ( /obj/structure/closet/emcloset, @@ -5185,8 +5185,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/derelict_aft) "ok" = ( /obj/effect/landmark/damageturf, diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index e6fda6f503a..7d505d64a28 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -207,8 +207,8 @@ /turf/simulated/floor/wood, /area/ruin/powered/beach) "aN" = ( -/obj/machinery/vending/cola, /obj/effect/turf_decal/sand, +/obj/machinery/vending/cola/free, /turf/simulated/floor/plasteel, /area/ruin/powered/beach) "aO" = ( @@ -235,8 +235,8 @@ /turf/simulated/floor/wood, /area/ruin/powered/beach) "aT" = ( -/obj/machinery/vending/snack, /obj/effect/turf_decal/sand, +/obj/machinery/vending/snack/free, /turf/simulated/floor/plasteel, /area/ruin/powered/beach) "aU" = ( diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm index 5822d05aa8a..5a947203de8 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm @@ -116,6 +116,9 @@ /obj/item/scalpel{ pixel_y = 12 }, +/obj/machinery/defibrillator_mount/loaded{ + pixel_y = 30 + }, /turf/simulated/floor/plasteel/white, /area/ruin/powered/animal_hospital) "aq" = ( @@ -489,7 +492,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/vending/crittercare, +/obj/machinery/vending/crittercare/free, /turf/simulated/floor/plasteel, /area/ruin/powered/animal_hospital) "bn" = ( diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 66d5f5fce80..8bf85306742 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -177,6 +177,7 @@ /obj/structure/stone_tile{ dir = 4 }, +/obj/item/seeds/wheat, /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aC" = ( @@ -189,11 +190,12 @@ dir = 4 }, /obj/structure/closet/crate/medical, -/obj/item/storage/firstaid/regular, /obj/item/reagent_containers/iv_bag/blood, /obj/item/reagent_containers/iv_bag/blood, /obj/item/reagent_containers/iv_bag/blood, /obj/item/stack/sheet/cloth/ten, +/obj/item/stack/medical/splint, +/obj/item/storage/firstaid/adv, /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aF" = ( @@ -255,6 +257,8 @@ /obj/structure/stone_tile/cracked{ dir = 4 }, +/obj/item/seeds/comfrey, +/obj/item/seeds/aloe, /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aN" = ( @@ -1255,10 +1259,7 @@ /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "do" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/reagent_dispensers/watertank, +/obj/structure/sink/puddle, /obj/effect/mapping_helpers/no_lava, /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm index 589f1c194a4..5629bb19b49 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm @@ -151,10 +151,6 @@ /obj/structure/stone_tile/cracked, /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"z" = ( -/obj/effect/baseturf_helper/lava_land/surface, -/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) (1,1,1) = {" a @@ -291,7 +287,7 @@ f j c r -z +c o c c diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm index 121d949e34d..3d224a617d6 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm @@ -121,16 +121,6 @@ }, /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"u" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/effect/baseturf_helper/lava_land/surface, -/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) "v" = ( /obj/structure/stone_tile/block/cracked, /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, @@ -261,7 +251,7 @@ f f o r -u +q w f f diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm index d14383a82dc..0f6c96fb041 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm @@ -57,16 +57,6 @@ /obj/structure/stone_tile/cracked, /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"j" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/effect/baseturf_helper/lava_land/surface, -/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) "k" = ( /obj/structure/stone_tile, /obj/structure/stone_tile{ @@ -274,7 +264,7 @@ d f d f -j +e d w f diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_cube.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_cube.dmm new file mode 100644 index 00000000000..888ead3e24c --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_cube.dmm @@ -0,0 +1,980 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"b" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/obj/effect/decal/remains/human, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/turf/unsimulated/wall, +/area/lavaland/surface/outdoors) +"e" = ( +/obj/machinery/wish_granter, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +b +b +b +b +b +b +a +a +a +a +a +a +a +b +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +b +b +c +b +b +b +b +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +b +a +a +a +a +b +a +a +a +a +a +a +a +b +a +b +b +b +a +a +b +b +a +a +b +b +a +a +a +"} +(4,1,1) = {" +a +a +a +a +b +b +b +a +a +a +a +a +a +a +b +b +b +a +a +b +b +b +b +b +b +b +b +a +b +b +"} +(5,1,1) = {" +a +a +b +b +b +b +b +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +a +a +b +"} +(6,1,1) = {" +b +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +b +"} +(7,1,1) = {" +b +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +b +c +b +b +c +b +b +b +c +b +b +b +b +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(9,1,1) = {" +a +a +b +a +a +a +a +a +a +a +b +b +b +b +c +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +b +c +b +b +b +b +b +b +b +b +c +b +b +b +"} +(11,1,1) = {" +a +a +a +b +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +c +b +b +b +b +b +b +"} +(12,1,1) = {" +a +a +b +a +a +a +b +b +a +a +c +b +b +b +b +b +c +b +c +b +b +b +b +b +b +b +b +b +b +b +"} +(13,1,1) = {" +a +a +b +b +b +b +b +b +b +b +b +b +c +c +b +c +c +b +b +b +b +b +b +b +b +b +b +b +c +b +"} +(14,1,1) = {" +a +a +b +c +b +b +b +b +c +b +c +d +d +d +d +d +b +b +b +b +b +b +c +b +b +b +b +b +b +b +"} +(15,1,1) = {" +a +a +b +b +b +b +c +b +b +b +b +d +d +d +d +d +b +c +b +b +c +b +a +b +b +b +b +b +b +b +"} +(16,1,1) = {" +a +a +b +b +b +b +b +b +b +c +b +d +d +e +d +d +b +b +a +a +b +b +a +a +b +b +b +b +b +b +"} +(17,1,1) = {" +a +a +b +b +b +b +b +c +b +b +c +d +d +d +d +d +c +c +a +a +a +a +a +a +a +b +b +a +b +b +"} +(18,1,1) = {" +a +a +b +a +a +a +b +b +b +b +b +d +d +d +d +d +b +c +b +a +a +a +a +a +b +b +b +c +a +a +"} +(19,1,1) = {" +a +a +b +a +a +a +b +b +b +b +b +c +b +c +c +b +c +b +b +a +a +a +a +a +b +a +b +b +a +a +"} +(20,1,1) = {" +a +a +b +b +b +b +b +b +c +b +b +b +c +b +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +"} +(21,1,1) = {" +a +a +b +b +b +b +b +b +b +b +b +b +b +c +b +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +"} +(22,1,1) = {" +a +a +b +b +b +b +a +b +b +b +a +b +b +b +b +b +b +b +b +b +a +a +a +a +a +a +a +a +a +a +"} +(23,1,1) = {" +a +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +c +b +b +a +a +a +a +a +a +a +a +a +a +a +"} +(24,1,1) = {" +a +a +a +a +a +a +c +b +b +b +b +b +b +b +c +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +"} +(25,1,1) = {" +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(26,1,1) = {" +b +b +b +b +b +b +b +b +b +b +c +b +b +b +b +b +a +a +a +a +a +b +a +a +a +a +a +a +a +a +"} +(27,1,1) = {" +b +b +b +a +a +a +a +a +a +a +a +b +c +b +b +a +b +b +b +b +b +b +a +a +a +a +a +a +a +a +"} +(28,1,1) = {" +b +b +b +a +a +a +a +a +a +a +a +b +b +b +b +b +b +b +b +b +b +b +c +b +b +b +b +b +b +b +"} +(29,1,1) = {" +b +a +a +a +a +a +a +a +a +a +a +b +b +b +b +b +b +b +b +b +a +a +a +a +b +a +b +b +b +b +"} +(30,1,1) = {" +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm new file mode 100644 index 00000000000..d9d2feef160 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm @@ -0,0 +1,367 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/simulated/floor/engine/cult{ + oxygen = 24; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"c" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/ruin/unpowered) +"d" = ( +/turf/simulated/wall/cult, +/area/ruin/unpowered) +"e" = ( +/obj/effect/decal/remains/human, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"f" = ( +/obj/structure/cult/pylon, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) +"g" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/simulated/floor/engine/cult{ + oxygen = 24; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"h" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/wall/cult, +/area/ruin/unpowered) +"i" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/turf/simulated/floor/engine/cult{ + oxygen = 24; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"k" = ( +/obj/effect/decal/remains/human, +/obj/item/melee/cultblade, +/turf/simulated/floor/engine/cult{ + oxygen = 24; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"l" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/shoes/cult, +/obj/item/clothing/suit/hooded/cultrobes, +/turf/simulated/floor/engine/cult{ + oxygen = 24; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"m" = ( +/obj/effect/decal/remains/human, +/turf/simulated/floor/engine/cult{ + oxygen = 24; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"o" = ( +/obj/effect/rune/narsie{ + color = "#ff0000"; + used = 1 + }, +/obj/item/cult_shift, +/obj/effect/decal/remains/human, +/obj/item/melee/cultblade/dagger, +/obj/effect/step_trigger/sound_effect{ + happens_once = 1; + name = "a grave mistake"; + sound = 'sound/hallucinations/i_see_you1.ogg'; + triggerer_only = 1 + }, +/obj/effect/step_trigger/message{ + message = "You've made a grave mistake, haven't you?"; + name = "ohfuck" + }, +/turf/simulated/floor/engine/cult{ + oxygen = 24; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"q" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/shoes/cult, +/obj/item/clothing/suit/hooded/cultrobes, +/obj/effect/decal/cleanable/blood/old, +/turf/simulated/floor/engine/cult{ + oxygen = 24; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"s" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +a +a +b +c +b +a +a +a +a +a +a +"} +(2,1,1) = {" +a +d +e +c +s +c +b +b +b +c +s +c +s +d +a +"} +(3,1,1) = {" +a +e +f +s +d +c +c +g +c +c +d +e +f +s +a +"} +(4,1,1) = {" +a +c +s +c +c +c +c +b +c +c +c +c +e +c +a +"} +(5,1,1) = {" +a +s +d +c +c +b +b +b +b +b +c +c +d +s +a +"} +(6,1,1) = {" +a +c +c +c +b +b +l +d +k +b +b +c +c +c +a +"} +(7,1,1) = {" +b +b +c +c +g +i +b +b +b +l +b +c +c +b +b +"} +(8,1,1) = {" +c +b +g +b +b +d +b +o +b +d +b +b +g +b +c +"} +(9,1,1) = {" +b +b +c +c +b +k +b +b +b +m +b +c +c +b +b +"} +(10,1,1) = {" +a +c +c +c +g +b +m +h +q +b +b +c +c +c +a +"} +(11,1,1) = {" +a +s +d +c +c +b +b +b +b +b +c +c +d +s +a +"} +(12,1,1) = {" +a +c +s +c +c +c +c +b +c +c +c +c +e +c +a +"} +(13,1,1) = {" +a +e +f +s +d +c +c +g +c +c +d +e +f +s +a +"} +(14,1,1) = {" +a +d +e +c +s +c +b +b +b +c +s +c +s +d +a +"} +(15,1,1) = {" +a +a +a +a +a +a +b +c +b +a +a +a +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm new file mode 100644 index 00000000000..03959657af8 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm @@ -0,0 +1,1018 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"c" = ( +/obj/item/clockwork/alloy_shards/small, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"d" = ( +/obj/structure/clockwork/wall_gear, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"e" = ( +/obj/item/stack/tile/brass, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"f" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"g" = ( +/obj/item/clockwork/alloy_shards/medium/gear_bit, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"h" = ( +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"i" = ( +/obj/structure/grille/ratvar/broken, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"j" = ( +/turf/simulated/wall/clockwork, +/area/lavaland/surface/outdoors/unexplored) +"k" = ( +/obj/item/clockwork/alloy_shards/small, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"l" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"m" = ( +/obj/item/clockwork/alloy_shards/medium, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"n" = ( +/obj/item/clockwork/component/belligerent_eye/blind_eye, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"o" = ( +/obj/item/clockwork/alloy_shards/large, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"p" = ( +/obj/item/clockwork/alloy_shards/medium, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"q" = ( +/obj/structure/lattice/catwalk/clockwork, +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"r" = ( +/obj/structure/lattice/clockwork, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"s" = ( +/obj/item/clockwork/alloy_shards/large, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"t" = ( +/obj/item/stack/tile/brass, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"u" = ( +/obj/structure/grille/ratvar, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"v" = ( +/obj/item/clockwork/alloy_shards/medium, +/obj/structure/lattice/clockwork, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"w" = ( +/obj/structure/grille/ratvar/broken, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"x" = ( +/obj/structure/clockwork/wall_gear, +/obj/item/stack/tile/brass, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"y" = ( +/obj/item/clockwork/component/geis_capacitor/fallen_armor, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"z" = ( +/obj/structure/clockwork/wall_gear, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"A" = ( +/obj/item/clockwork/alloy_shards/clockgolem_remains, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"B" = ( +/obj/item/clockwork/weapon/ratvarian_spear, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"C" = ( +/obj/item/clockwork/alloy_shards/medium/gear_bit, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"D" = ( +/obj/structure/grille/ratvar, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"E" = ( +/obj/item/clockwork/alloy_shards/clockgolem_remains, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) +"F" = ( +/obj/structure/dead_ratvar, +/turf/simulated/floor/clockwork{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/lavaland/surface/outdoors/unexplored) +"G" = ( +/obj/item/stack/tile/brass/fifty, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/unexplored) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +b +s +h +b +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +o +b +a +h +b +r +c +j +x +b +b +g +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +f +b +l +b +v +b +p +w +j +j +c +l +b +b +a +a +a +a +"} +(4,1,1) = {" +a +a +a +a +a +a +f +l +l +r +b +b +l +j +j +j +p +l +b +h +c +r +a +a +"} +(5,1,1) = {" +a +a +a +a +a +b +l +l +p +h +c +l +l +l +j +l +b +l +l +D +h +r +a +a +"} +(6,1,1) = {" +a +a +a +h +c +h +m +l +l +c +l +l +l +l +w +l +l +l +m +c +h +f +a +a +"} +(7,1,1) = {" +a +a +b +b +b +l +l +l +l +h +b +l +l +l +l +l +l +l +l +c +f +f +b +a +"} +(8,1,1) = {" +a +h +h +g +c +b +l +l +l +l +n +h +r +l +l +b +l +l +l +l +f +b +a +a +"} +(9,1,1) = {" +a +b +c +b +b +l +l +l +l +t +h +b +h +w +p +b +g +l +l +b +b +b +b +a +"} +(10,1,1) = {" +b +h +l +l +l +l +l +l +b +b +p +r +F +b +h +A +b +l +l +l +m +l +l +a +"} +(11,1,1) = {" +c +i +j +j +l +l +l +l +l +b +h +k +h +h +h +r +l +l +l +l +l +l +b +a +"} +(12,1,1) = {" +d +j +j +j +h +l +l +b +l +q +r +h +h +h +c +q +l +b +l +l +b +h +o +a +"} +(13,1,1) = {" +e +k +b +l +l +l +b +p +s +r +h +h +h +h +h +h +h +l +l +l +l +b +b +a +"} +(14,1,1) = {" +b +b +b +m +l +l +l +b +h +h +k +h +h +h +h +h +c +b +l +l +b +b +h +b +"} +(15,1,1) = {" +b +b +b +l +l +l +l +h +h +h +h +h +h +h +k +B +h +l +l +l +l +b +b +a +"} +(16,1,1) = {" +f +l +l +l +l +l +l +q +b +h +h +h +h +h +h +s +b +l +l +l +l +f +f +a +"} +(17,1,1) = {" +b +b +b +l +l +l +b +l +q +r +h +h +h +h +h +b +s +r +l +r +l +l +b +a +"} +(18,1,1) = {" +b +h +l +l +l +b +b +h +b +h +h +h +h +h +r +k +b +C +r +h +b +b +m +b +"} +(19,1,1) = {" +b +b +l +l +l +l +h +b +h +h +h +h +h +h +h +r +j +h +c +h +r +h +b +b +"} +(20,1,1) = {" +b +l +l +l +l +b +b +p +h +c +h +k +h +h +o +b +l +l +l +b +E +r +G +o +"} +(21,1,1) = {" +g +b +l +l +l +l +l +r +h +r +h +h +h +h +y +l +l +l +l +l +l +j +j +r +"} +(22,1,1) = {" +c +c +b +l +l +b +h +h +t +b +h +h +h +h +h +m +b +l +l +l +h +j +j +j +"} +(23,1,1) = {" +b +h +m +n +b +h +l +o +j +u +r +p +h +r +h +b +l +l +l +b +b +w +r +b +"} +(24,1,1) = {" +a +a +b +b +l +l +l +j +j +q +p +h +m +e +z +j +j +l +l +c +l +l +b +a +"} +(25,1,1) = {" +a +a +a +l +l +l +l +j +l +l +b +h +r +x +h +l +l +l +l +l +l +a +a +a +"} +(26,1,1) = {" +a +a +a +c +b +l +l +l +l +l +l +g +q +b +h +l +l +l +c +m +b +a +a +a +"} +(27,1,1) = {" +a +a +a +b +h +b +l +l +l +l +l +l +l +l +l +l +l +l +l +b +a +a +a +a +"} +(28,1,1) = {" +a +a +a +a +c +b +l +b +l +l +l +l +l +l +l +l +b +l +f +a +a +a +a +a +"} +(29,1,1) = {" +a +a +a +a +b +b +f +c +b +l +c +l +l +l +l +c +o +l +b +a +a +a +a +a +"} +(30,1,1) = {" +a +a +a +a +a +g +c +b +l +l +b +m +l +b +l +f +b +a +a +a +a +a +a +a +"} +(31,1,1) = {" +a +a +a +a +a +a +a +b +l +b +a +b +l +c +f +f +a +a +a +a +a +a +a +a +"} +(32,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +c +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_envy.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_envy.dmm new file mode 100644 index 00000000000..2be9246bcfc --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_envy.dmm @@ -0,0 +1,328 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"b" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/turf/simulated/wall/rust, +/area/ruin/unpowered) +"e" = ( +/obj/structure/mirror{ + desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!"; + icon_state = "mirror_broke"; + pixel_x = -28; + broken = 1 + }, +/obj/item/clothing/suit/bloated_human, +/obj/effect/decal/cleanable/blood, +/obj/item/clothing/head/human_head, +/turf/simulated/floor/plating, +/area/ruin/unpowered) +"f" = ( +/obj/structure/mirror{ + desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!"; + icon_state = "mirror_broke"; + pixel_x = 28; + broken = 1 + }, +/turf/simulated/floor/plating/burnt, +/area/ruin/unpowered) +"g" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/mirror{ + desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!"; + icon_state = "mirror_broke"; + pixel_x = -28; + broken = 1 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered) +"h" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating, +/area/ruin/unpowered) +"i" = ( +/turf/simulated/floor/plating, +/area/ruin/unpowered) +"j" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/simulated/floor/plating, +/area/ruin/unpowered) +"k" = ( +/obj/structure/mirror{ + desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!"; + icon_state = "mirror_broke"; + pixel_y = 28; + broken = 1 + }, +/obj/item/kitchen/knife/envy, +/turf/simulated/floor/plating, +/area/ruin/unpowered) +"l" = ( +/obj/structure/mirror{ + desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!"; + icon_state = "mirror_broke"; + pixel_x = 28; + broken = 1 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered) +"m" = ( +/obj/structure/mirror{ + desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!"; + icon_state = "mirror_broke"; + pixel_x = -28; + broken = 1 + }, +/turf/simulated/floor/plating, +/area/ruin/unpowered) +"n" = ( +/turf/simulated/floor/plating/damaged, +/area/ruin/unpowered) +"o" = ( +/obj/structure/mirror{ + desc = "This mirror has been shattered. It looks like the bad luck energies spilling from it are taking immediate effect on your surroundings!"; + icon_state = "mirror_broke"; + pixel_x = -28; + broken = 1 + }, +/turf/simulated/floor/plating/damaged, +/area/ruin/unpowered) +"p" = ( +/obj/machinery/door/airlock/hatch, +/turf/simulated/floor/plating, +/area/ruin/unpowered) +"q" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plating, +/area/ruin/unpowered) +"A" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +a +"} +(3,1,1) = {" +b +c +c +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +c +a +"} +(4,1,1) = {" +c +c +d +d +d +e +g +g +g +m +m +m +m +m +o +m +j +d +c +a +"} +(5,1,1) = {" +c +d +d +d +d +d +h +h +i +i +i +i +i +h +i +i +i +d +A +a +"} +(6,1,1) = {" +c +d +d +d +d +d +d +k +i +i +i +q +i +i +i +i +i +p +A +a +"} +(7,1,1) = {" +c +d +d +d +d +d +i +i +i +j +i +n +i +i +i +i +i +d +c +a +"} +(8,1,1) = {" +c +c +d +d +d +f +j +l +l +l +l +l +l +l +l +l +j +d +c +a +"} +(9,1,1) = {" +b +c +c +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +c +a +"} +(10,1,1) = {" +b +b +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm new file mode 100644 index 00000000000..4c793cc1ffa --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm @@ -0,0 +1,161 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/simulated/wall/cult, +/area/ruin/unpowered) +"c" = ( +/obj/structure/healingfountain, +/turf/simulated/floor/engine/cult, +/area/ruin/unpowered) +"d" = ( +/obj/structure/fluff/divine/conduit, +/turf/simulated/floor/engine/cult, +/area/ruin/unpowered) +"e" = ( +/obj/structure/sacrificealtar, +/turf/simulated/floor/engine/cult, +/area/ruin/unpowered) +"f" = ( +/turf/simulated/floor/engine/cult, +/area/ruin/unpowered) +"g" = ( +/mob/living/simple_animal/butterfly, +/turf/simulated/floor/engine/cult, +/area/ruin/unpowered) +"h" = ( +/obj/structure/fans/tiny/invisible, +/turf/simulated/floor/engine/cult, +/area/ruin/unpowered) +"i" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/engine/cult, +/area/ruin/unpowered) + +(1,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(2,1,1) = {" +a +b +d +f +f +d +f +f +d +f +f +d +f +f +d +b +"} +(3,1,1) = {" +b +b +e +g +f +f +g +f +f +f +f +g +f +g +f +b +"} +(4,1,1) = {" +b +c +f +f +f +f +f +f +i +f +f +f +f +f +f +h +"} +(5,1,1) = {" +b +b +e +f +f +f +f +g +f +f +f +f +f +f +f +b +"} +(6,1,1) = {" +a +b +d +g +f +d +f +f +d +f +f +d +f +g +d +b +"} +(7,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm new file mode 100644 index 00000000000..e449be961cd --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm @@ -0,0 +1,539 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"b" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"e" = ( +/turf/simulated/floor/plating/lava/smooth, +/area/ruin/powered/gluttony) +"f" = ( +/obj/item/reagent_containers/syringe/gluttony, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"g" = ( +/obj/effect/gluttony, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"h" = ( +/obj/item/veilrender/vealrender, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"i" = ( +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"j" = ( +/obj/item/trash/plate, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"l" = ( +/obj/item/trash/candy, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"m" = ( +/obj/item/trash/raisins, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"n" = ( +/obj/item/trash/pistachios, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"o" = ( +/obj/item/trash/popcorn, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"p" = ( +/obj/item/trash/semki, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"q" = ( +/obj/item/trash/syndi_cakes, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"r" = ( +/obj/effect/gluttony, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"t" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"v" = ( +/obj/machinery/light/small, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"z" = ( +/obj/item/trash/plate, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"A" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) +"R" = ( +/turf/simulated/wall/indestructible/uranium, +/area/ruin/powered/gluttony) +"S" = ( +/obj/machinery/door/airlock/uranium, +/obj/structure/fans/tiny/invisible, +/turf/simulated/floor/plasteel/freezer, +/area/ruin/powered/gluttony) + +(1,1,1) = {" +a +a +a +b +b +a +a +b +a +b +b +b +b +b +b +b +a +a +a +a +"} +(2,1,1) = {" +a +a +a +b +b +b +b +b +b +b +b +b +b +b +b +b +a +a +a +a +"} +(3,1,1) = {" +b +a +a +a +b +b +b +c +c +c +b +c +c +c +b +b +a +a +a +a +"} +(4,1,1) = {" +b +a +a +a +b +b +b +c +R +R +S +R +R +c +b +a +a +a +a +a +"} +(5,1,1) = {" +b +b +a +a +a +b +b +c +R +h +i +o +R +c +b +a +a +a +a +a +"} +(6,1,1) = {" +a +a +a +a +a +b +b +c +R +i +i +v +R +c +b +b +b +b +b +a +"} +(7,1,1) = {" +a +b +b +b +b +b +b +c +R +i +l +i +R +c +b +b +b +b +b +a +"} +(8,1,1) = {" +a +b +c +c +c +c +c +c +R +t +i +m +R +c +c +c +c +c +c +b +"} +(9,1,1) = {" +b +b +c +R +R +R +R +R +R +g +m +v +R +R +R +R +R +R +c +b +"} +(10,1,1) = {" +a +b +c +R +e +R +r +g +g +g +g +i +p +i +z +l +i +R +c +b +"} +(11,1,1) = {" +a +b +c +R +f +g +g +g +g +g +n +d +i +i +i +i +i +S +b +b +"} +(12,1,1) = {" +a +b +c +R +e +R +r +g +g +g +i +g +i +l +A +i +q +R +c +b +"} +(13,1,1) = {" +a +b +c +R +R +R +R +R +R +g +i +v +R +R +R +R +R +R +c +b +"} +(14,1,1) = {" +a +b +c +c +c +c +c +c +R +r +i +i +R +c +c +c +c +c +c +b +"} +(15,1,1) = {" +a +b +b +b +b +b +b +c +R +i +g +i +R +c +b +b +b +b +b +b +"} +(16,1,1) = {" +b +b +b +a +b +b +b +c +R +j +i +v +R +c +b +b +b +a +a +a +"} +(17,1,1) = {" +b +b +b +a +b +b +b +c +R +i +n +i +R +c +b +b +b +a +a +a +"} +(18,1,1) = {" +a +a +a +a +b +b +b +c +R +R +S +R +R +c +b +b +b +a +a +a +"} +(19,1,1) = {" +a +a +a +a +a +a +a +c +c +c +b +c +c +c +b +b +a +a +a +a +"} +(20,1,1) = {" +a +a +a +a +a +a +a +b +b +b +b +b +b +b +a +a +b +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_greed.dmm new file mode 100644 index 00000000000..e1082c88664 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_greed.dmm @@ -0,0 +1,577 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"b" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"e" = ( +/obj/structure/table/wood/poker, +/obj/item/gun/projectile/revolver/russian/soul, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/ruin/powered/greed) +"f" = ( +/obj/structure/cursed_slot_machine, +/turf/simulated/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/ruin/powered/greed) +"g" = ( +/obj/structure/table/wood/poker, +/obj/item/coin/mythril, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/ruin/powered/greed) +"h" = ( +/obj/structure/table/wood/poker, +/obj/item/coin/diamond, +/turf/simulated/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/ruin/powered/greed) +"i" = ( +/turf/simulated/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/ruin/powered/greed) +"j" = ( +/obj/structure/table/wood/poker, +/obj/item/coin/adamantine, +/turf/simulated/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/ruin/powered/greed) +"k" = ( +/obj/machinery/computer/arcade/battle{ + emagged = 1 + }, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"l" = ( +/obj/item/coin/gold, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"m" = ( +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"n" = ( +/obj/structure/table/wood/poker, +/obj/item/stack/spacecash/c1000, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"o" = ( +/obj/item/storage/bag/money, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"p" = ( +/obj/structure/table/wood/poker, +/obj/item/stack/ore/gold, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"q" = ( +/obj/structure/table/wood/poker, +/obj/item/stack/spacecash/c20, +/obj/item/stack/spacecash/c50, +/obj/machinery/light/small{ + brightness_range = 3; + dir = 8 + }, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"r" = ( +/obj/structure/table/wood/poker, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c100, +/obj/item/stack/spacecash/c1000, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"s" = ( +/obj/structure/table/wood/poker, +/obj/item/stack/spacecash/c200, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"u" = ( +/obj/structure/table/wood/poker, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c100, +/obj/item/stack/spacecash/c1000, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"v" = ( +/obj/item/coin/gold, +/obj/machinery/light/small, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"w" = ( +/obj/item/storage/bag/money, +/obj/machinery/light/small, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"J" = ( +/obj/machinery/door/airlock/gold, +/obj/structure/fans/tiny/invisible, +/turf/simulated/floor/engine/cult, +/area/ruin/powered/greed) +"W" = ( +/turf/simulated/wall/cult, +/area/ruin/powered/greed) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +b +b +a +a +a +a +a +a +a +a +b +"} +(2,1,1) = {" +a +b +b +a +a +a +a +a +a +b +b +b +a +a +a +a +a +b +b +b +"} +(3,1,1) = {" +a +b +b +b +b +b +a +a +a +b +a +a +a +a +a +a +b +b +b +b +"} +(4,1,1) = {" +a +a +b +b +b +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +"} +(5,1,1) = {" +a +a +a +b +b +a +a +c +c +c +c +c +c +c +a +a +a +a +b +a +"} +(6,1,1) = {" +b +a +a +a +a +a +c +c +W +W +W +W +W +c +a +a +a +a +b +a +"} +(7,1,1) = {" +b +a +a +a +c +c +c +W +W +n +q +s +W +c +c +c +c +a +a +a +"} +(8,1,1) = {" +a +a +a +a +c +W +W +W +k +o +l +m +W +W +W +W +c +a +a +a +"} +(9,1,1) = {" +a +a +b +a +c +W +e +h +l +m +m +m +l +m +v +W +W +a +a +a +"} +(10,1,1) = {" +b +b +b +a +c +W +f +i +m +l +d +o +m +m +m +m +J +a +a +a +"} +(11,1,1) = {" +a +a +b +a +c +W +g +j +l +m +m +l +m +l +w +W +W +a +a +a +"} +(12,1,1) = {" +a +a +a +a +c +W +W +W +k +o +m +l +W +W +W +W +c +a +a +a +"} +(13,1,1) = {" +a +a +a +a +c +c +c +W +W +p +u +r +W +c +c +c +c +a +a +a +"} +(14,1,1) = {" +b +b +a +a +a +a +c +c +W +W +W +W +W +c +a +a +a +a +a +a +"} +(15,1,1) = {" +b +b +a +a +a +a +a +c +c +c +c +c +c +c +a +a +a +a +a +a +"} +(16,1,1) = {" +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +"} +(17,1,1) = {" +a +a +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +"} +(18,1,1) = {" +a +a +a +b +b +b +b +b +b +b +b +b +b +a +a +b +b +b +b +b +"} +(19,1,1) = {" +a +a +a +b +b +b +b +a +a +a +b +b +b +b +a +b +b +b +b +b +"} +(20,1,1) = {" +a +a +a +a +b +b +a +a +a +a +a +a +b +b +b +b +b +b +b +b +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm index 74aa1875f96..b6785a746f3 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm @@ -162,7 +162,7 @@ /turf/simulated/floor/mineral/titanium/blue, /area/ruin/powered) "I" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/mineral/titanium/blue, diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm new file mode 100644 index 00000000000..f29cac64240 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -0,0 +1,728 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/obj/structure/lattice, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/turf/simulated/wall, +/area/ruin/unpowered) +"e" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"f" = ( +/obj/structure/table/wood, +/obj/item/storage/box/cups, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"g" = ( +/obj/structure/reagent_dispensers/water_cooler/pizzaparty, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"h" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"i" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"j" = ( +/obj/item/reagent_containers/food/snacks/mushroompizzaslice, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"k" = ( +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/pizzaparty, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"l" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/pizzaparty, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb2, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"m" = ( +/obj/item/chair/wood/wings, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"n" = ( +/obj/structure/glowshroom/single, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"o" = ( +/obj/item/trash/plate, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"p" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"q" = ( +/obj/item/chair/wood/wings, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"r" = ( +/obj/structure/chair/wood/wings, +/obj/effect/decal/remains/human, +/obj/item/clothing/head/festive{ + desc = "A festive party hat with the name 'timmy' scribbled on the front."; + name = "party hat" + }, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"s" = ( +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"t" = ( +/obj/structure/chair/wood/wings, +/obj/effect/decal/remains/human, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"u" = ( +/obj/structure/glowshroom/single, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"v" = ( +/obj/structure/lattice, +/obj/item/chair/wood/wings, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"w" = ( +/obj/item/kitchen/utensil/fork, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"x" = ( +/obj/structure/table/wood, +/obj/effect/spawner/lootdrop/pizzaparty, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"y" = ( +/obj/structure/table/wood, +/obj/item/trash/plate, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"z" = ( +/obj/structure/table/wood, +/obj/structure/glowshroom/single, +/obj/item/a_gift, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"A" = ( +/obj/structure/table/wood, +/obj/item/trash/plate, +/obj/item/kitchen/utensil/fork, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"B" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"C" = ( +/obj/structure/chair/wood/wings{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"D" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/margheritaslice, +/obj/item/trash/plate, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"E" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/meatpizzaslice, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"F" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/sliceable/birthdaycake, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"G" = ( +/obj/structure/table/wood, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"H" = ( +/obj/item/chair/wood/wings, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"I" = ( +/obj/item/kitchen/utensil/fork, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"J" = ( +/obj/structure/glowshroom/single, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"K" = ( +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"L" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"M" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/a_gift, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"N" = ( +/obj/structure/lattice, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"O" = ( +/obj/item/kitchen/knife, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"P" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) +"Q" = ( +/turf/simulated/floor/plating{ + oxygen = 14; + nitrogen = 23; + temperature = 300 + }, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +b +b +a +a +b +b +b +b +b +b +b +b +a +a +a +a +"} +(2,1,1) = {" +b +b +b +b +b +b +b +b +b +b +c +c +b +b +b +b +a +a +"} +(3,1,1) = {" +b +b +b +b +b +b +b +b +c +c +e +e +c +c +b +b +b +a +"} +(4,1,1) = {" +b +b +b +b +d +b +c +c +e +h +h +e +Q +e +d +b +b +a +"} +(5,1,1) = {" +a +b +b +b +d +b +m +e +w +h +w +h +h +e +d +b +b +b +"} +(6,1,1) = {" +a +b +b +b +d +f +n +h +h +c +e +M +e +c +b +b +b +b +"} +(7,1,1) = {" +b +b +b +b +d +g +o +h +h +C +J +h +d +b +b +b +b +b +"} +(8,1,1) = {" +b +b +b +b +e +h +p +q +x +D +K +M +d +b +b +b +b +b +"} +(9,1,1) = {" +b +b +b +c +e +i +h +r +y +E +h +h +c +b +b +b +b +b +"} +(10,1,1) = {" +b +b +b +c +e +j +h +s +z +F +q +N +c +b +b +b +b +b +"} +(11,1,1) = {" +b +b +b +b +e +e +h +t +A +G +q +h +c +b +b +b +b +b +"} +(12,1,1) = {" +b +b +b +b +d +k +h +s +B +H +h +O +d +b +b +b +b +b +"} +(13,1,1) = {" +b +b +b +b +d +k +h +u +s +s +o +n +d +b +b +b +b +a +"} +(14,1,1) = {" +b +b +b +b +d +l +i +h +e +I +L +P +d +b +b +b +b +a +"} +(15,1,1) = {" +b +b +b +b +d +d +e +e +N +e +e +d +d +b +b +b +b +a +"} +(16,1,1) = {" +a +b +b +b +b +b +c +v +b +c +b +b +b +b +b +b +b +a +"} +(17,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +a +a +"} +(18,1,1) = {" +a +a +a +a +b +b +b +b +b +b +b +b +a +a +a +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pride.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pride.dmm new file mode 100644 index 00000000000..ff9a27ee711 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pride.dmm @@ -0,0 +1,304 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"b" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/mineral/silver, +/area/ruin/powered/pride) +"e" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/turf/simulated/floor/mineral/silver, +/area/ruin/powered/pride) +"f" = ( +/obj/structure/mirror{ + pixel_x = 32 + }, +/turf/simulated/floor/mineral/silver, +/area/ruin/powered/pride) +"g" = ( +/turf/simulated/floor/mineral/silver, +/area/ruin/powered/pride) +"j" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/mineral/silver, +/area/ruin/powered/pride) +"k" = ( +/obj/structure/mirror{ + pixel_x = 32 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/mineral/silver, +/area/ruin/powered/pride) +"l" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/machinery/light/small{ + brightness_range = 3; + dir = 8 + }, +/turf/simulated/floor/mineral/silver, +/area/ruin/powered/pride) +"m" = ( +/obj/structure/mirror{ + pixel_x = 32 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/mineral/silver, +/area/ruin/powered/pride) +"r" = ( +/obj/machinery/light/small, +/turf/simulated/floor/mineral/silver, +/area/ruin/powered/pride) +"G" = ( +/turf/simulated/wall/mineral/diamond, +/area/ruin/powered/pride) +"O" = ( +/obj/structure/mirror/magic/pride, +/turf/simulated/wall/mineral/diamond, +/area/ruin/powered/pride) +"Y" = ( +/obj/machinery/door/airlock/diamond, +/turf/simulated/floor/mineral/silver{ + blocks_air = 1 + }, +/area/ruin/powered/pride) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +a +"} +(3,1,1) = {" +b +c +c +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +c +a +"} +(4,1,1) = {" +c +c +G +G +G +j +e +e +l +e +e +l +e +e +l +e +e +G +c +a +"} +(5,1,1) = {" +c +G +G +G +G +G +g +g +g +g +g +g +g +g +g +g +r +G +a +a +"} +(6,1,1) = {" +c +G +G +G +G +G +O +g +g +g +d +g +g +g +g +g +g +Y +a +a +"} +(7,1,1) = {" +c +G +G +G +G +G +g +g +g +g +g +g +g +g +g +g +r +G +c +a +"} +(8,1,1) = {" +c +c +G +G +G +k +f +f +m +f +f +m +f +f +m +f +f +G +c +a +"} +(9,1,1) = {" +b +c +c +G +G +G +G +G +G +G +G +G +G +G +G +G +G +G +c +a +"} +(10,1,1) = {" +b +b +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm new file mode 100644 index 00000000000..75b4c619445 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm @@ -0,0 +1,47 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/lavaland/surface/outdoors) +"b" = ( +/obj/effect/sliding_puzzle/lavaland, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +a +a +a +a +"} +(2,1,1) = {" +a +c +c +c +a +"} +(3,1,1) = {" +a +c +b +c +a +"} +(4,1,1) = {" +a +c +c +c +a +"} +(5,1,1) = {" +a +a +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm new file mode 100644 index 00000000000..1b7783388de --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm @@ -0,0 +1,58 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/lavaland/surface/outdoors) +"b" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/obj/mecha/working/ripley/mining{ + ruin_mecha = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"e" = ( +/obj/item/clothing/shoes/workboots/mining, +/obj/item/clothing/under/rank/miner/lavaland, +/obj/effect/decal/remains/human, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +b +b +b +a +"} +(2,1,1) = {" +b +c +b +c +b +"} +(3,1,1) = {" +b +c +d +e +b +"} +(4,1,1) = {" +b +c +c +b +b +"} +(5,1,1) = {" +b +b +b +b +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm new file mode 100644 index 00000000000..bac638bd3c0 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm @@ -0,0 +1,651 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/unsimulated/wall, +/area/ruin/unpowered) +"b" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/ruin/unpowered) +"c" = ( +/obj/item/paper/fluff/stations/lavaland/sloth/note, +/turf/simulated/floor/sepia{ + blocks_air = 0; + slowdown = 10 + }, +/area/ruin/unpowered) +"d" = ( +/turf/simulated/floor/sepia{ + blocks_air = 0; + slowdown = 10 + }, +/area/ruin/unpowered) +"e" = ( +/obj/machinery/door/airlock/wood, +/turf/simulated/floor/sepia{ + blocks_air = 0; + slowdown = 10 + }, +/area/ruin/unpowered) +"f" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/citrus/orange, +/turf/simulated/floor/sepia{ + blocks_air = 0; + slowdown = 10 + }, +/area/ruin/unpowered) +"g" = ( +/obj/structure/bed, +/obj/item/bedsheet/brown, +/turf/simulated/floor/sepia{ + blocks_air = 0; + slowdown = 10 + }, +/area/ruin/unpowered) +"h" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/sepia{ + blocks_air = 0; + slowdown = 10 + }, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +a +a +a +a +a +a +b +a +"} +(4,1,1) = {" +a +b +a +c +d +d +f +a +b +a +"} +(5,1,1) = {" +a +b +a +d +d +d +g +a +b +a +"} +(6,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(7,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(8,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(9,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(10,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(11,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(12,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(13,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(14,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(15,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(16,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(17,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(18,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(19,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(20,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(21,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(22,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(23,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(24,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(25,1,1) = {" +a +b +a +d +h +d +d +a +b +a +"} +(26,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(27,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(28,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(29,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(30,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(31,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(32,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(33,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(34,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(35,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(36,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(37,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(38,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(39,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(40,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(41,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(42,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(43,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(44,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(45,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(46,1,1) = {" +a +b +a +d +a +a +a +a +b +a +"} +(47,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(48,1,1) = {" +a +b +a +a +a +a +d +a +b +a +"} +(49,1,1) = {" +a +b +a +d +d +d +d +a +b +a +"} +(50,1,1) = {" +a +a +a +a +e +e +a +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm new file mode 100644 index 00000000000..3b2dd805189 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm @@ -0,0 +1,261 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/obj/structure/sign/mining/survival{ + pixel_y = -32 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"d" = ( +/turf/simulated/wall/mineral/titanium/survival/pod, +/area/ruin/powered) +"e" = ( +/obj/structure/sign/mining/survival{ + dir = 4; + pixel_x = 32 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"f" = ( +/obj/structure/fans, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"g" = ( +/obj/machinery/smartfridge/survival_pod/empty, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"h" = ( +/obj/item/gps/computer, +/obj/structure/tubes, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"i" = ( +/obj/structure/sign/mining/survival{ + dir = 8; + pixel_x = -32 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"j" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"k" = ( +/obj/machinery/sleeper/survival_pod, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"l" = ( +/obj/item/pickaxe, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"m" = ( +/obj/structure/bed/pod, +/obj/item/bedsheet/black, +/obj/structure/tubes, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"n" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"o" = ( +/obj/effect/decal/cleanable/blood, +/mob/living/simple_animal/hostile/asteroid/goliath/beast{ + health = 0 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"p" = ( +/obj/structure/table/survival_pod, +/obj/item/kitchen/knife/combat/survival, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"q" = ( +/obj/effect/mob_spawn/human/miner/explorer{ + brute_damage = 150; + oxy_damage = 50 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/tracks, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"r" = ( +/obj/structure/tubes, +/obj/item/crowbar, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"s" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"t" = ( +/obj/machinery/door/airlock/survival_pod/glass, +/obj/effect/decal/cleanable/blood/tracks, +/turf/simulated/floor/pod/dark, +/area/ruin/powered) +"v" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"w" = ( +/obj/structure/sign/mining/survival{ + pixel_y = 32 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"x" = ( +/obj/structure/sign/mining{ + pixel_y = 32 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"y" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +a +a +b +b +b +b +b +a +a +a +"} +(2,1,1) = {" +a +a +b +b +e +b +e +b +b +a +a +"} +(3,1,1) = {" +a +a +b +d +d +d +d +d +b +a +a +"} +(4,1,1) = {" +a +b +c +d +f +k +p +d +w +b +b +"} +(5,1,1) = {" +a +b +b +d +g +l +q +t +v +b +b +"} +(6,1,1) = {" +b +b +c +d +h +m +r +d +x +b +b +"} +(7,1,1) = {" +a +b +b +d +d +d +d +d +y +j +j +"} +(8,1,1) = {" +a +a +b +b +i +b +i +j +j +b +b +"} +(9,1,1) = {" +a +a +b +b +j +n +s +b +a +a +a +"} +(10,1,1) = {" +a +a +a +a +a +o +j +b +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 13850af5db7..421f2e62b53 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -5365,6 +5365,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/item/defibrillator, /turf/simulated/floor/plasteel/white/side{ dir = 9 }, @@ -5513,6 +5514,9 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/item/gun/syringe/syndicate, +/obj/machinery/defibrillator_mount/loaded{ + pixel_x = -30 + }, /turf/simulated/floor/plasteel/white/side{ dir = 9 }, diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm new file mode 100644 index 00000000000..0f756d15090 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -0,0 +1,431 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/simulated/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"b" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/obj/machinery/abductor/experiment, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"d" = ( +/turf/simulated/wall/mineral/abductor, +/area/ruin/unpowered) +"e" = ( +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"g" = ( +/obj/machinery/abductor/pad, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"h" = ( +/obj/item/hemostat/alien, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"i" = ( +/obj/effect/mob_spawn/human/abductor, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"j" = ( +/obj/structure/closet/abductor, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"k" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"l" = ( +/obj/machinery/optable/abductor, +/obj/item/cautery/alien, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"m" = ( +/obj/structure/table/abductor, +/obj/item/storage/box/alienhandcuffs, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"n" = ( +/obj/item/scalpel/alien, +/obj/item/surgical_drapes, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"o" = ( +/obj/item/retractor/alien, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"p" = ( +/obj/machinery/abductor/gland_dispenser, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"q" = ( +/obj/structure/table/abductor, +/obj/item/surgicaldrill/alien, +/obj/item/circular_saw/alien, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) +"r" = ( +/obj/structure/bed/abductor, +/turf/unsimulated/floor/abductor, +/area/ruin/unpowered) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +d +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +d +d +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +d +c +e +k +a +p +d +a +"} +(6,1,1) = {" +a +a +d +e +h +l +n +q +d +a +"} +(7,1,1) = {" +a +a +d +g +i +e +o +r +d +a +"} +(8,1,1) = {" +a +a +d +d +j +m +j +d +d +a +"} +(9,1,1) = {" +a +a +b +d +d +d +d +d +b +a +"} +(10,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(11,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(12,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(13,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(14,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(15,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(16,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(17,1,1) = {" +a +b +b +b +b +b +b +b +a +a +"} +(18,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(19,1,1) = {" +a +a +b +b +b +b +b +b +b +a +"} +(20,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(21,1,1) = {" +a +b +b +b +b +b +b +b +a +a +"} +(22,1,1) = {" +a +b +b +b +b +b +b +b +a +a +"} +(23,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(24,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(25,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(26,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(27,1,1) = {" +a +a +b +b +b +b +b +b +a +a +"} +(28,1,1) = {" +a +b +b +b +b +b +b +b +a +a +"} +(29,1,1) = {" +a +b +b +b +b +b +b +b +a +a +"} +(30,1,1) = {" +a +b +b +b +b +b +b +b +b +a +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm new file mode 100644 index 00000000000..63ffac70fd8 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm @@ -0,0 +1,1557 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"c" = ( +/obj/structure/alien/weeds, +/obj/effect/baseturf_helper/lava_land/surface, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"d" = ( +/obj/structure/alien/resin/wall, +/obj/structure/alien/weeds, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"e" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"f" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/weeds, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"g" = ( +/obj/structure/alien/weeds, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"i" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"j" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"l" = ( +/obj/structure/alien/weeds/node, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"o" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/decal/cleanable/blood/gibs, +/obj/item/gun/projectile/automatic/pistol, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"r" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/resin/wall, +/obj/structure/alien/resin/wall, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"t" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/sentinel, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"u" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood/gibs, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"v" = ( +/obj/structure/alien/weeds/node, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"w" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/structure/alien/resin/wall, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"y" = ( +/obj/structure/alien/weeds/node, +/obj/structure/alien/resin/wall, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"z" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/decal/cleanable/blood/gibs, +/obj/item/clothing/under/rank/security, +/obj/item/clothing/suit/armor/vest, +/obj/item/melee/baton/loaded, +/obj/item/clothing/head/helmet, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"B" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/obj/effect/decal/cleanable/blood/gibs, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"C" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/egg/burst, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"E" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"F" = ( +/obj/structure/alien/weeds, +/mob/living/simple_animal/hostile/alien/queen/large{ + desc = "A gigantic alien who is in charge of the hive and all of its loyal servants."; + name = "alien queen"; + pixel_x = -16; + plants_off = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"G" = ( +/turf/simulated/floor/plating/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"H" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"I" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/decal/cleanable/blood/gibs, +/obj/effect/decal/cleanable/blood, +/obj/item/clothing/under/syndicate, +/obj/item/clothing/glasses/night, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"K" = ( +/obj/structure/alien/weeds/node, +/mob/living/simple_animal/hostile/alien, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"L" = ( +/obj/structure/alien/weeds/node, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"M" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/obj/effect/decal/cleanable/blood/gibs, +/obj/item/tank/emergency_oxygen, +/obj/item/clothing/suit/space/syndicate/orange, +/obj/item/clothing/mask/gas, +/obj/item/clothing/head/helmet/space/syndicate/orange, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"O" = ( +/obj/structure/alien/weeds/node, +/turf/template_noop, +/area/ruin/unpowered/xenonest) +"Q" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/mob/living/simple_animal/hostile/alien/drone{ + plants_off = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/xenonest) +"R" = ( +/obj/structure/alien/weeds, +/turf/template_noop, +/area/ruin/unpowered/xenonest) + +(1,1,1) = {" +a +a +a +G +G +G +G +G +G +G +G +G +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +G +b +b +b +b +b +b +b +b +G +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +G +G +b +g +e +e +b +g +g +b +b +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +G +b +b +g +g +g +g +E +g +e +b +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +G +b +g +g +y +b +b +b +y +b +b +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +G +b +g +g +w +g +F +u +I +b +b +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +a +a +G +b +e +t +g +g +g +H +u +g +b +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +G +b +i +u +b +g +l +g +t +e +b +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +a +a +G +b +o +v +g +b +g +g +e +b +b +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(10,1,1) = {" +a +a +G +b +g +u +b +g +g +g +y +e +b +G +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(11,1,1) = {" +a +a +G +b +b +g +t +g +g +t +g +g +b +G +a +a +a +a +a +a +a +a +a +a +a +b +b +b +b +a +"} +(12,1,1) = {" +a +a +G +G +b +e +g +g +g +g +g +g +b +G +a +a +a +a +a +a +a +a +a +a +b +b +M +i +b +b +"} +(13,1,1) = {" +a +a +a +G +b +b +g +g +l +g +g +b +b +G +a +a +a +a +a +a +a +a +a +b +b +e +u +Q +g +b +"} +(14,1,1) = {" +a +a +a +G +G +b +b +g +g +g +b +b +G +G +a +a +a +a +a +a +a +a +a +b +i +g +l +g +e +b +"} +(15,1,1) = {" +a +a +a +a +G +G +b +b +b +b +b +G +G +a +a +a +a +a +a +a +a +b +b +b +g +g +g +i +b +b +"} +(16,1,1) = {" +a +a +a +a +a +G +b +l +l +b +G +G +a +a +a +a +a +a +a +a +b +b +g +j +g +e +b +b +b +a +"} +(17,1,1) = {" +a +a +a +a +a +a +b +E +g +b +b +G +b +b +b +b +b +b +b +b +b +g +g +b +b +b +b +a +a +a +"} +(18,1,1) = {" +a +a +a +a +a +a +b +g +g +E +b +b +b +g +g +g +g +g +g +b +b +g +b +b +a +a +a +a +a +a +"} +(19,1,1) = {" +a +a +a +a +a +a +b +b +g +g +g +b +g +g +c +g +g +g +l +g +g +g +b +a +a +a +a +a +a +a +"} +(20,1,1) = {" +b +b +b +b +a +a +a +b +b +g +l +g +g +g +b +b +b +b +g +g +g +b +b +a +a +a +a +a +a +a +"} +(21,1,1) = {" +b +e +i +b +b +b +b +b +b +g +g +g +g +b +b +a +a +b +b +g +g +b +a +a +a +a +a +a +a +a +"} +(22,1,1) = {" +d +f +j +g +b +b +g +g +g +g +g +g +b +b +a +a +a +b +g +g +g +b +a +a +a +a +a +a +a +a +"} +(23,1,1) = {" +d +g +e +l +g +g +g +b +b +g +b +b +b +a +a +a +a +b +g +g +b +b +a +a +a +a +a +a +a +a +"} +(24,1,1) = {" +b +b +i +i +b +b +b +b +b +g +b +a +a +a +a +a +a +b +g +g +b +a +a +a +a +a +a +a +a +a +"} +(25,1,1) = {" +a +b +b +b +b +a +a +a +b +E +b +b +a +a +a +a +a +b +g +L +b +b +b +a +a +a +a +a +a +b +"} +(26,1,1) = {" +a +a +a +a +a +a +a +a +b +g +g +b +a +a +a +a +a +b +g +g +g +g +b +b +b +a +a +a +b +b +"} +(27,1,1) = {" +a +a +a +a +a +a +b +b +b +g +g +b +b +a +a +a +a +b +b +g +g +g +g +g +b +b +b +b +y +g +"} +(28,1,1) = {" +a +a +a +a +a +b +b +B +g +g +l +e +b +a +a +a +b +b +g +g +b +b +g +g +g +b +O +R +g +g +"} +(29,1,1) = {" +a +a +a +a +a +b +z +C +j +g +e +i +b +a +a +a +b +g +g +b +b +b +b +g +l +b +O +R +g +g +"} +(30,1,1) = {" +a +a +a +a +a +b +i +u +g +i +i +b +b +a +a +a +b +g +b +b +a +a +b +b +b +b +b +y +g +g +"} +(31,1,1) = {" +a +a +a +a +a +b +b +b +g +b +b +b +a +a +a +a +b +g +b +b +a +a +a +a +a +a +a +b +g +g +"} +(32,1,1) = {" +a +a +a +a +a +a +a +b +g +b +a +a +a +a +a +a +b +g +g +b +a +a +a +a +a +a +a +b +g +g +"} +(33,1,1) = {" +a +a +a +a +a +a +a +b +g +b +a +a +a +a +a +a +b +b +l +b +a +a +a +a +a +a +b +b +g +a +"} +(34,1,1) = {" +a +a +a +a +a +a +a +b +l +b +a +a +a +a +a +a +a +b +g +b +a +a +a +a +a +a +b +a +a +a +"} +(35,1,1) = {" +a +a +a +a +a +a +a +b +g +b +a +a +a +a +a +a +a +b +g +b +a +a +a +a +a +a +a +a +a +a +"} +(36,1,1) = {" +a +a +a +a +a +a +a +b +g +b +a +a +a +a +a +a +b +b +g +b +a +a +a +a +a +a +a +a +a +a +"} +(37,1,1) = {" +a +a +a +a +a +a +a +b +g +b +a +a +a +a +a +b +b +g +g +b +a +a +a +a +a +a +a +a +a +a +"} +(38,1,1) = {" +a +a +a +a +a +a +b +b +g +b +b +b +b +b +b +b +g +g +b +b +a +a +a +a +a +a +a +a +a +a +"} +(39,1,1) = {" +a +a +a +a +a +b +b +g +g +e +b +b +g +g +K +g +g +b +b +a +a +a +a +a +a +a +a +a +a +a +"} +(40,1,1) = {" +a +a +a +a +a +b +i +E +g +g +g +g +g +b +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +"} +(41,1,1) = {" +a +a +a +a +b +b +e +g +l +g +e +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(42,1,1) = {" +a +a +a +a +b +e +g +g +i +i +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(43,1,1) = {" +a +a +a +a +r +b +b +b +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm index 9c29f154adb..1c7d14bd6fa 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm @@ -25,16 +25,16 @@ /turf/simulated/floor/mineral/titanium/blue, /area/ruin/unpowered) "i" = ( -/obj/structure/chair, /obj/structure/window/reinforced{ tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/mineral/titanium/blue, /area/ruin/unpowered) "j" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/mineral/titanium/blue, /area/ruin/unpowered) "k" = ( @@ -54,9 +54,7 @@ /turf/simulated/floor/plating/airless, /area/ruin/unpowered) "n" = ( -/obj/structure/chair{ - tag = "icon-chair (WEST)"; - icon_state = "chair"; +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plating/airless, @@ -71,26 +69,24 @@ /area/ruin/unpowered) "q" = ( /obj/item/shard, -/obj/structure/chair{ - tag = "icon-chair (WEST)"; - icon_state = "chair"; +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/mineral/titanium/blue, /area/ruin/unpowered) "r" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/structure/window/reinforced{ tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/floor/mineral/titanium/blue, /area/ruin/unpowered) "s" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/floor/plating/airless, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm index fd6bd8d85fe..a993ab96190 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -155,7 +155,7 @@ }, /area/ruin/powered) "v" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -205,7 +205,7 @@ }, /area/ruin/powered) "B" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ tag = "icon-floor5"; icon_state = "floor5" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm index 02ee81bf42d..ae055f8bc63 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm @@ -56,9 +56,7 @@ /turf/simulated/shuttle/floor, /area/ruin/powered) "m" = ( -/obj/structure/chair/office/dark{ - tag = "icon-officechair_dark (NORTH)"; - icon_state = "officechair_dark"; +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm index a59e8dad0a9..3ba27975660 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm @@ -781,8 +781,8 @@ /turf/simulated/floor/plating, /area/ruin/space/ancientstation/deltacorridor) "ck" = ( -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/template_noop) "cl" = ( /obj/structure/transit_tube/station/reverse, @@ -1819,8 +1819,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/template_noop) "eL" = ( /obj/machinery/light{ @@ -3002,8 +3002,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/template_noop) "hg" = ( /obj/effect/decal/cleanable/dirt, @@ -3130,8 +3130,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/template_noop) "ht" = ( /obj/structure/cable{ @@ -3310,8 +3310,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/template_noop) "hK" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -3722,8 +3722,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/template_noop) "iC" = ( /obj/structure/cable{ @@ -3831,8 +3831,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/simulated/floor/plating, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating, /area/template_noop) "iP" = ( /obj/structure/cable/yellow{ @@ -3840,8 +3840,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/simulated/floor/plating, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating, /area/template_noop) "iQ" = ( /obj/machinery/light/small, @@ -4135,8 +4135,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/template_noop) "jx" = ( /obj/effect/decal/cleanable/cobweb, @@ -4488,8 +4488,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/template_noop) "km" = ( /obj/structure/cable{ @@ -4584,8 +4584,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/simulated/floor/plating, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating, /area/template_noop) "kw" = ( /obj/machinery/atmospherics/unary/vent_pump{ @@ -4816,8 +4816,8 @@ /turf/simulated/floor/plating, /area/ruin/space/ancientstation/deltacorridor) "kZ" = ( -/turf/simulated/floor/plating, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating, /area/template_noop) "la" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ diff --git a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm index 846ac5068d9..108c8103975 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm @@ -64,7 +64,7 @@ }, /area/ruin/powered) "ao" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm index e3d578503f8..67adb3e7467 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm @@ -55,7 +55,7 @@ }, /area/ruin/unpowered) "aj" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/floor/wood, @@ -314,7 +314,7 @@ }, /area/ruin/unpowered) "bb" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "chapel" diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index 24f93b0a6ce..5d22afc5fcd 100644 --- a/_maps/map_files/RandomZLevels/academy.dmm +++ b/_maps/map_files/RandomZLevels/academy.dmm @@ -36,7 +36,7 @@ /turf/simulated/floor/carpet, /area/awaymission/academy/headmaster) "ai" = ( -/obj/structure/chair/office/light{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/floor/carpet, @@ -152,7 +152,9 @@ /turf/simulated/floor/carpet, /area/awaymission/academy/headmaster) "ax" = ( -/obj/structure/chair/stool, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/floor/carpet, /area/awaymission/academy/headmaster) "ay" = ( @@ -4558,6 +4560,12 @@ }, /turf/simulated/floor/plating, /area/awaymission/academy/academygate) +"vq" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/awaymission/academy/headmaster) (1,1,1) = {" aa @@ -13944,9 +13952,9 @@ ab aj ao au -ax +vq ah -ax +vq ah ah ah diff --git a/_maps/map_files/RandomZLevels/beach.dmm b/_maps/map_files/RandomZLevels/beach.dmm index 4544e3830d8..2931d7175b7 100644 --- a/_maps/map_files/RandomZLevels/beach.dmm +++ b/_maps/map_files/RandomZLevels/beach.dmm @@ -1265,7 +1265,7 @@ icon_state = "tube1"; dir = 8 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -1275,7 +1275,7 @@ dir = 4; icon_state = "tube1" }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -1323,7 +1323,7 @@ }, /area/awaymission/beach) "dZ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -1336,7 +1336,7 @@ }, /area/awaymission/beach) "eb" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -1371,7 +1371,7 @@ /turf/simulated/shuttle/floor, /area/awaymission/beach) "ei" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm index 4938088d57f..77e09164224 100644 --- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm +++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm @@ -1934,7 +1934,7 @@ /turf/simulated/floor/plating, /area/awaymission/BMPship/Aft) "eV" = ( -/obj/structure/chair/office{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plasteel{ diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm index 98288fe54da..e64c25da157 100644 --- a/_maps/map_files/RandomZLevels/centcomAway.dmm +++ b/_maps/map_files/RandomZLevels/centcomAway.dmm @@ -1059,8 +1059,8 @@ pixel_x = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/awaymission/centcomAway/maint) "cO" = ( /obj/structure/cable{ @@ -1082,8 +1082,8 @@ pixel_x = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/awaymission/centcomAway/maint) "cP" = ( /obj/structure/table/reinforced, @@ -1105,7 +1105,7 @@ }, /area/awaymission/centcomAway/hangar) "cS" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -1166,7 +1166,7 @@ }, /area/awaymission/centcomAway/cafe) "da" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -1215,7 +1215,7 @@ }, /area/awaymission/centcomAway/hangar) "dg" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -1310,13 +1310,13 @@ }, /area/awaymission/centcomAway/hangar) "dr" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/light{ icon_state = "tube1"; dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/awaymission/centcomAway/hangar) "ds" = ( @@ -1551,8 +1551,8 @@ pixel_x = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/awaymission/centcomAway/maint) "dV" = ( /obj/structure/closet/crate, @@ -1646,8 +1646,8 @@ pixel_y = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/awaymission/centcomAway/maint) "ei" = ( /obj/structure/table, @@ -1694,8 +1694,8 @@ "eo" = ( /obj/structure/cable, /obj/machinery/power/tracker, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/awaymission/centcomAway/maint) "ep" = ( /obj/structure/table, @@ -1972,7 +1972,7 @@ /turf/simulated/shuttle/floor, /area/awaymission/centcomAway/hangar) "fc" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/awaymission/centcomAway/hangar) "fd" = ( @@ -2368,13 +2368,6 @@ dir = 5 }, /area/awaymission/centcomAway/general) -"gb" = ( -/obj/structure/chair{ - dir = 4; - name = "Prosecution" - }, -/turf/simulated/shuttle/floor, -/area/awaymission/centcomAway/hangar) "gc" = ( /turf/simulated/floor/plasteel{ dir = 9; @@ -2967,6 +2960,9 @@ /obj/item/radio/intercom{ pixel_y = 25 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/awaymission/centcomAway/hangar) "hF" = ( @@ -4076,7 +4072,7 @@ /turf/simulated/floor/plating, /area/awaymission/centcomAway/hangar) "kb" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /mob/living/simple_animal/hostile/russian/ranged{ @@ -6814,6 +6810,15 @@ icon_state = "dark" }, /area/awaymission/centcomAway/thunderdome) +"Di" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor, +/area/awaymission/centcomAway/hangar) (1,1,1) = {" aa @@ -11426,7 +11431,7 @@ gX gX gX bP -dg +Di bP oc aW @@ -12205,7 +12210,7 @@ jz gX gX bP -dg +Di bP gX gX @@ -12324,7 +12329,7 @@ bY cq ei bO -gb +dg cq hH fA diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 3d8d1868c2c..fe5445dc8c3 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -5927,7 +5927,7 @@ desc = "Oh no, seven years of bad luck!"; icon_state = "mirror_broke"; pixel_x = 28; - shattered = 1 + broken = 1 }, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" @@ -8413,12 +8413,12 @@ name = "MO19 Arrivals" }) "mb" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/light/small{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/awaycontent/a1{ has_gravity = 1; @@ -8431,7 +8431,7 @@ name = "MO19 Arrivals" }) "md" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -8592,12 +8592,12 @@ name = "MO19 Arrivals" }) "mr" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/light/small{ dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor{ icon_state = "floor2" }, @@ -8623,12 +8623,12 @@ name = "MO19 Arrivals" }) "mu" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/landmark{ name = "awaystart" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/awaycontent/a1{ has_gravity = 1; @@ -8965,10 +8965,10 @@ name = "MO19 Arrivals" }) "mX" = ( -/obj/structure/chair, /obj/machinery/light/small{ dir = 4 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor2" }, @@ -9070,10 +9070,10 @@ name = "MO19 Arrivals" }) "nh" = ( -/obj/structure/chair{ +/obj/machinery/light/small, +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/machinery/light/small, /turf/simulated/shuttle/floor, /area/awaycontent/a1{ has_gravity = 1; diff --git a/_maps/map_files/RandomZLevels/spacebattle.dmm b/_maps/map_files/RandomZLevels/spacebattle.dmm index 16acaaacc34..17341581c9a 100644 --- a/_maps/map_files/RandomZLevels/spacebattle.dmm +++ b/_maps/map_files/RandomZLevels/spacebattle.dmm @@ -219,7 +219,7 @@ }, /area/awaymission/spacebattle/syndicate2) "aH" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /mob/living/simple_animal/hostile/syndicate, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -361,7 +361,7 @@ }, /area/awaymission/spacebattle/syndicate1) "ba" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -369,7 +369,7 @@ }, /area/awaymission/spacebattle/syndicate2) "bb" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -475,7 +475,7 @@ }, /area/awaymission/spacebattle/syndicate3) "bq" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /mob/living/simple_animal/hostile/syndicate, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -534,7 +534,7 @@ }, /area/awaymission/spacebattle/syndicate1) "by" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /mob/living/simple_animal/hostile/syndicate, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -648,7 +648,7 @@ /turf/simulated/floor/plating/airless, /area/awaymission/spacebattle/cruiser) "bN" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -656,7 +656,7 @@ }, /area/awaymission/spacebattle/cruiser) "bO" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -1270,7 +1270,9 @@ /turf/simulated/floor/plating, /area/awaymission/spacebattle/cruiser) "dJ" = ( -/obj/mecha/working/ripley/firefighter, +/obj/mecha/working/ripley/firefighter{ + ruin_mecha = 1 + }, /turf/simulated/floor/plating, /area/awaymission/spacebattle/cruiser) "dK" = ( @@ -1638,7 +1640,7 @@ }, /area/awaymission/spacebattle/syndicate4) "eQ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /mob/living/simple_animal/hostile/syndicate, @@ -2419,7 +2421,7 @@ }, /area/awaymission/spacebattle/syndicate7) "hM" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /mob/living/simple_animal/hostile/syndicate, @@ -2727,7 +2729,7 @@ }, /area/awaymission/spacebattle/syndicate5) "iI" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /mob/living/simple_animal/hostile/syndicate, @@ -2813,7 +2815,7 @@ }, /area/awaymission/spacebattle/syndicate6) "iW" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /mob/living/simple_animal/hostile/syndicate, diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index 541156ddc57..8394ca1b635 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -4652,16 +4652,16 @@ /turf/simulated/shuttle/floor, /area/awaymission) "kQ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, /area/awaymission) "kR" = ( -/obj/structure/chair{ +/obj/item/paper/hotel_scrap_4, +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/item/paper/hotel_scrap_4, /turf/simulated/shuttle/floor, /area/awaymission) "kS" = ( @@ -4709,11 +4709,11 @@ /turf/simulated/shuttle/plating, /area/space/nearstation) "la" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood/old, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/awaymission) "lb" = ( @@ -4741,17 +4741,17 @@ }, /area/awaymission) "lf" = ( -/obj/structure/chair{ +/obj/effect/decal/remains/human, +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/effect/decal/remains/human, /turf/simulated/shuttle/floor, /area/awaymission) "lg" = ( -/obj/structure/chair{ +/obj/effect/decal/cleanable/blood/old, +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/effect/decal/cleanable/blood/old, /turf/simulated/shuttle/floor, /area/awaymission) "lh" = ( diff --git a/_maps/map_files/RandomZLevels/stationCollision.dmm b/_maps/map_files/RandomZLevels/stationCollision.dmm index 2f225fea612..8910fa36aaa 100644 --- a/_maps/map_files/RandomZLevels/stationCollision.dmm +++ b/_maps/map_files/RandomZLevels/stationCollision.dmm @@ -1941,7 +1941,7 @@ }, /area/awaymission/research) "ff" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -1952,7 +1952,7 @@ }, /area/awaymission/syndishuttle) "fg" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -2381,7 +2381,7 @@ }, /area/awaymission/arrivalblock) "gc" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -4196,7 +4196,7 @@ /turf/simulated/floor/plasteel, /area/awaymission/southblock) "kO" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -4204,13 +4204,13 @@ }, /area/awaymission/arrivalblock) "kP" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/awaymission/arrivalblock) "kQ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ diff --git a/_maps/map_files/RandomZLevels/wildwest.dmm b/_maps/map_files/RandomZLevels/wildwest.dmm index f5f7d96e4ea..ca6d20a6eba 100644 --- a/_maps/map_files/RandomZLevels/wildwest.dmm +++ b/_maps/map_files/RandomZLevels/wildwest.dmm @@ -2612,7 +2612,7 @@ }, /area/awaymission/wwrefine) "ho" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle{ tag = "icon-floor2"; icon_state = "floor2" diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 2107bdd7500..bd37f2193e5 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -225,7 +225,7 @@ /turf/simulated/shuttle/plating, /area/shuttle/abandoned) "aaF" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -413,10 +413,10 @@ }, /area/shuttle/abandoned) "abe" = ( -/obj/structure/chair{ +/obj/effect/decal/remains/human, +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/effect/decal/remains/human, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -512,13 +512,13 @@ /area/shuttle/abandoned) "abr" = ( /obj/item/shard, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/abandoned) "abs" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -811,7 +811,7 @@ }, /area/shuttle/syndicate) "ace" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -1060,7 +1060,7 @@ }, /area/security/armoury) "acI" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -1068,7 +1068,7 @@ }, /area/shuttle/syndicate) "acJ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -3880,11 +3880,13 @@ /turf/simulated/shuttle/plating/vox, /area/shuttle/vox) "ahp" = ( -/obj/structure/chair/stool, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) "ahq" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor4/vox, @@ -6588,8 +6590,8 @@ d2 = 2 }, /obj/machinery/power/tracker, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "alE" = ( /obj/structure/closet/secure_closet/brig, @@ -6976,7 +6978,7 @@ /area/shuttle/vox) "aml" = ( /obj/item/stack/spacecash/c50, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor4/vox, @@ -7012,8 +7014,8 @@ pixel_y = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "amp" = ( /obj/structure/chair{ @@ -7391,8 +7393,8 @@ d2 = 2 }, /obj/machinery/power/tracker, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "amV" = ( /obj/structure/sign/nosmoking_2, @@ -7419,12 +7421,9 @@ /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) "amZ" = ( -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c50, -/obj/structure/chair{ - dir = 1 +/obj/structure/chair/comfy/shuttle{ + dir = 8 }, -/obj/machinery/light/spot, /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) "ana" = ( @@ -7544,8 +7543,8 @@ /area/security/permabrig) "ann" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "ano" = ( /obj/structure/cable{ @@ -7791,8 +7790,8 @@ pixel_y = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "anH" = ( /turf/simulated/wall/r_wall, @@ -8469,8 +8468,8 @@ icon_state = "2-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "aoL" = ( /obj/structure/cable{ @@ -8845,8 +8844,8 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "apo" = ( /obj/structure/grille/broken, @@ -9768,8 +9767,8 @@ }, /area/lawoffice) "aqZ" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "ara" = ( /obj/structure/table/reinforced, @@ -9796,8 +9795,8 @@ /area/lawoffice) "arb" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "arc" = ( /obj/effect/spawner/window/reinforced, @@ -10307,8 +10306,8 @@ icon_state = "2-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "arM" = ( /obj/structure/cable{ @@ -10330,16 +10329,16 @@ icon_state = "2-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "arN" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "arO" = ( /obj/structure/cable{ @@ -10411,8 +10410,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "arV" = ( /obj/structure/shuttle/engine/propulsion{ @@ -10422,11 +10421,13 @@ /turf/simulated/shuttle/plating, /area/shuttle/trade/sol) "arW" = ( -/obj/structure/chair{ - dir = 4 +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, -/turf/simulated/shuttle/floor, -/area/shuttle/trade/sol) +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/siberia) "arX" = ( /obj/structure/cable{ icon_state = "0-2"; @@ -10445,15 +10446,14 @@ /turf/simulated/shuttle/floor, /area/shuttle/trade/sol) "arZ" = ( -/obj/machinery/atm{ - pixel_x = 0; - pixel_y = 32 +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c50, +/obj/machinery/light/spot, +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, -/obj/structure/chair{ - dir = 8 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/trade/sol) +/turf/simulated/shuttle/floor4/vox, +/area/shuttle/vox) "asa" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/poddoor/shutters{ @@ -10467,8 +10467,8 @@ /turf/simulated/shuttle/floor, /area/shuttle/trade/sol) "asb" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "asc" = ( /obj/effect/spawner/random_barrier/obstruction, @@ -11025,8 +11025,8 @@ icon_state = "1-8"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "asM" = ( /obj/structure/cable{ @@ -11041,8 +11041,8 @@ icon_state = "1-8"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "asN" = ( /turf/simulated/floor/carpet, @@ -11637,12 +11637,10 @@ }, /area/shuttle/siberia) "atL" = ( -/obj/structure/chair/office/dark{ - dir = 1 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, +/turf/simulated/shuttle/floor, /area/shuttle/siberia) "atM" = ( /obj/effect/spawner/window/reinforced, @@ -12787,17 +12785,19 @@ /turf/simulated/floor/plasteel, /area/security/permabrig) "avp" = ( -/obj/structure/chair{ - dir = 4 +/obj/machinery/flasher{ + id = "gulagshuttleflasher"; + pixel_x = 25 }, -/obj/item/radio/intercom{ - broadcasting = 0; - listening = 1; - name = "station intercom (General)"; - pixel_y = 25 +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 }, /turf/simulated/shuttle/floor, -/area/shuttle/pod_3) +/area/shuttle/siberia) "avq" = ( /turf/simulated/floor/plating, /area/maintenance/fsmaint) @@ -12840,18 +12840,19 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_3) "avu" = ( -/obj/structure/chair{ +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/machinery/status_display{ - density = 0; - layer = 4; - pixel_x = 0; - pixel_y = 32 +/turf/simulated/shuttle/floor{ + icon_state = "floor4" }, -/obj/machinery/light, -/turf/simulated/shuttle/floor, -/area/shuttle/pod_3) +/area/shuttle/syndicate_sit) "avv" = ( /obj/machinery/door/airlock/external{ name = "Labor Shuttle Airlock"; @@ -13086,8 +13087,8 @@ pixel_y = -25; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "avN" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -13434,8 +13435,8 @@ pixel_y = 1; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "awl" = ( /turf/simulated/wall, @@ -13713,32 +13714,29 @@ }, /area/security/permabrig) "awP" = ( -/obj/structure/shuttle/engine/propulsion/burst{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f6"; - icon_state = "swall_f6"; - dir = 2 +/turf/simulated/shuttle/floor{ + icon_state = "floor4" }, -/area/shuttle/pod_3) +/area/shuttle/syndicate_sit) "awQ" = ( /obj/structure/cable{ d1 = 2; d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "awR" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "awS" = ( /obj/item/twohanded/required/kirbyplants, @@ -13956,30 +13954,31 @@ /turf/simulated/shuttle/plating, /area/shuttle/syndicate_sit) "axm" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, -/obj/machinery/flasher{ - id = "gulagshuttleflasher"; - pixel_x = 25 +/turf/simulated/shuttle/floor{ + icon_state = "floor4" }, -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" - }, -/turf/simulated/shuttle/floor, -/area/shuttle/siberia) +/area/shuttle/syndicate_sit) "axn" = ( /obj/structure/lattice, /obj/item/stack/cable_coil, /turf/space, /area/space/nearstation) "axo" = ( -/obj/structure/chair{ +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/turf/simulated/shuttle/floor, -/area/shuttle/siberia) +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/syndicate_elite) "axp" = ( /obj/structure/bookcase, /obj/item/book/manual/sop_engineering, @@ -14016,8 +14015,8 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "axr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -14332,16 +14331,13 @@ }, /area/security/prison/cell_block/A) "axN" = ( -/obj/structure/shuttle/engine/propulsion/burst{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f5"; - icon_state = "swall_f5"; - dir = 2 +/turf/simulated/shuttle/floor{ + icon_state = "floor4" }, -/area/shuttle/pod_3) +/area/shuttle/syndicate_elite) "axO" = ( /obj/structure/cable{ d1 = 1; @@ -14826,8 +14822,8 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "ayF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -15170,8 +15166,8 @@ pixel_y = -25; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "azc" = ( /obj/effect/spawner/window/reinforced, @@ -15206,9 +15202,6 @@ }, /area/security/interrogation) "aze" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; icon_state = "tube1"; @@ -15217,34 +15210,26 @@ /turf/simulated/shuttle/floor{ icon_state = "floor4" }, +/area/shuttle/syndicate_sit) +"azf" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, /area/shuttle/syndicate_elite) -"azf" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/light/spot{ - tag = "icon-tube1 (WEST)"; - icon_state = "tube1"; - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/syndicate_sit) "azg" = ( /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/syndicate_elite) "azh" = ( -/obj/structure/chair{ - dir = 8 - }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, -/area/shuttle/syndicate_elite) +/area/shuttle/syndicate_sit) "azi" = ( /obj/machinery/door/window/brigdoor{ dir = 2; @@ -15824,13 +15809,16 @@ /turf/simulated/floor/plating, /area/maintenance/abandonedbar) "aAh" = ( -/obj/structure/chair{ - dir = 4 +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f6"; + icon_state = "swall_f6"; + dir = 2 }, -/area/shuttle/syndicate_elite) +/area/shuttle/pod_3) "aAi" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/ert, /turf/simulated/shuttle/floor{ @@ -16433,21 +16421,30 @@ /turf/simulated/floor/plating, /area/maintenance/abandonedbar) "aBk" = ( -/obj/structure/chair{ +/obj/item/radio/intercom{ + broadcasting = 0; + listening = 1; + name = "station intercom (General)"; + pixel_y = 25 + }, +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/syndicate_sit) +/turf/simulated/shuttle/floor, +/area/shuttle/pod_3) "aBl" = ( -/obj/structure/chair{ - dir = 8 +/obj/machinery/status_display{ + density = 0; + layer = 4; + pixel_x = 0; + pixel_y = 32 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, -/area/shuttle/syndicate_sit) +/turf/simulated/shuttle/floor, +/area/shuttle/pod_3) "aBm" = ( /obj/item/stack/rods, /turf/space, @@ -16536,8 +16533,8 @@ pixel_y = 0; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aBy" = ( /obj/effect/landmark/damageturf, @@ -17326,24 +17323,22 @@ /turf/simulated/floor/plating, /area/maintenance/abandonedbar) "aCX" = ( -/obj/structure/chair, +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 + }, +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f5"; + icon_state = "swall_f5"; + dir = 2 + }, +/area/shuttle/pod_3) +"aCY" = ( +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/syndicate_elite) -"aCY" = ( -/obj/machinery/light/spot{ - tag = "icon-tube1 (WEST)"; - icon_state = "tube1"; - dir = 8 - }, -/obj/structure/chair{ - dir = 4 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/syndicate_sit) "aCZ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ @@ -18254,8 +18249,8 @@ pixel_y = -25; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aEN" = ( /obj/structure/closet/emcloset, @@ -21081,9 +21076,6 @@ }, /area/shuttle/pod_1) "aLb" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -21094,6 +21086,9 @@ dir = 4; icon_state = "tube1" }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_1) "aLc" = ( @@ -21111,9 +21106,6 @@ }, /area/shuttle/pod_2) "aLf" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/status_display{ density = 0; layer = 4; @@ -21124,6 +21116,9 @@ dir = 4; icon_state = "tube1" }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_2) "aLg" = ( @@ -21759,14 +21754,14 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aMp" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/item/radio/intercom{ dir = 4; name = "station intercom (General)"; pixel_x = 28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_1) "aMq" = ( @@ -21779,14 +21774,14 @@ /turf/simulated/wall, /area/hallway/secondary/entry) "aMt" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/item/radio/intercom{ dir = 4; name = "station intercom (General)"; pixel_x = 28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/pod_2) "aMu" = ( @@ -23414,8 +23409,8 @@ }, /area/shuttle/pod_2) "aPV" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, /turf/simulated/shuttle/floor, /area/shuttle/trade/sol) @@ -28110,13 +28105,13 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aYL" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/light{ dir = 1; on = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "aYM" = ( @@ -28228,12 +28223,12 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aYZ" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/landmark{ name = "JoinLate" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "aZa" = ( @@ -30143,11 +30138,15 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "bcK" = ( -/obj/structure/chair/comfy/black{ - dir = 1 +/obj/machinery/atm{ + pixel_x = 0; + pixel_y = 32 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 }, /turf/simulated/shuttle/floor, -/area/shuttle/escape) +/area/shuttle/trade/sol) "bcL" = ( /obj/machinery/computer/communications, /turf/simulated/shuttle/floor, @@ -30160,10 +30159,10 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "bcN" = ( -/obj/structure/chair{ +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/machinery/light, /turf/simulated/shuttle/floor, /area/shuttle/arrival/station) "bcO" = ( @@ -31176,11 +31175,11 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "beB" = ( -/obj/structure/chair{ - dir = 1 +/obj/structure/chair/comfy/shuttle{ + dir = 8 }, /turf/simulated/shuttle/floor, -/area/shuttle/escape) +/area/shuttle/trade/sol) "beC" = ( /turf/simulated/shuttle/floor, /area/shuttle/escape) @@ -32203,23 +32202,39 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "bgo" = ( -/obj/structure/chair{ - dir = 1 +/obj/machinery/flasher{ + id = "soltraderflash"; + pixel_y = -28 }, -/obj/structure/closet/walllocker/emerglocker{ - pixel_x = -28 +/obj/structure/chair/comfy/shuttle{ + dir = 8 }, /turf/simulated/shuttle/floor, -/area/shuttle/escape) +/area/shuttle/trade/sol) "bgp" = ( -/obj/structure/chair{ +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "asteroid"; + tag = "icon-asteroid (NORTH)" + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding2 (NORTH)"; + icon_state = "siding2"; dir = 1 }, -/obj/structure/closet/walllocker/emerglocker{ - pixel_x = 28 +/turf/simulated/floor/plasteel{ + tag = "icon-siding1 (NORTH)"; + icon_state = "siding1"; + dir = 1 }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) +/area/hydroponics) "bgq" = ( /obj/machinery/power/apc{ dir = 1; @@ -33193,21 +33208,56 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "bil" = ( -/obj/structure/chair{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/mob/living/simple_animal/pig, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "asteroid"; + tag = "icon-asteroid (NORTH)" + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding1 (NORTH)"; + icon_state = "siding1"; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding2 (NORTH)"; + icon_state = "siding2"; + dir = 1 + }, +/area/hydroponics) "bim" = ( /obj/machinery/light/spot, /turf/simulated/shuttle/floor, /area/shuttle/escape) "bin" = ( -/obj/structure/chair{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "asteroid"; + tag = "icon-asteroid (NORTH)" + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding1 (NORTH)"; + icon_state = "siding1"; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding2 (NORTH)"; + icon_state = "siding2"; + dir = 1 + }, +/area/hydroponics) "bio" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/structure/cable{ @@ -33755,80 +33805,33 @@ }, /area/hydroponics) "bje" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "asteroid"; - tag = "icon-asteroid (NORTH)" - }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding2 (NORTH)"; - icon_state = "siding2"; +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding1 (NORTH)"; - icon_state = "siding1"; - dir = 1 - }, -/area/hydroponics) +/turf/simulated/shuttle/floor, +/area/shuttle/escape) "bjf" = ( /obj/structure/reagent_dispensers/beerkeg, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bjg" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/closet/walllocker/emerglocker{ + pixel_x = -28 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/mob/living/simple_animal/pig, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "asteroid"; - tag = "icon-asteroid (NORTH)" - }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding1 (NORTH)"; - icon_state = "siding1"; +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding2 (NORTH)"; - icon_state = "siding2"; - dir = 1 - }, -/area/hydroponics) +/turf/simulated/shuttle/floor, +/area/shuttle/escape) "bjh" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/closet/walllocker/emerglocker{ + pixel_x = 28 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "asteroid"; - tag = "icon-asteroid (NORTH)" - }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding1 (NORTH)"; - icon_state = "siding1"; +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding2 (NORTH)"; - icon_state = "siding2"; - dir = 1 - }, -/area/hydroponics) +/turf/simulated/shuttle/floor, +/area/shuttle/escape) "bji" = ( /obj/item/radio/beacon, /turf/simulated/floor/plasteel, @@ -34947,16 +34950,10 @@ /turf/simulated/floor/carpet, /area/crew_quarters/bar) "blu" = ( -/obj/machinery/status_display{ - pixel_y = 30 +/obj/structure/chair/comfy/shuttle{ + dir = 8 }, -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; - dir = 1 - }, -/obj/structure/chair, -/turf/simulated/shuttle/floor4, +/turf/simulated/shuttle/floor, /area/shuttle/escape) "blv" = ( /obj/machinery/status_display{ @@ -35005,12 +35002,10 @@ /turf/simulated/floor/carpet, /area/chapel/main) "blA" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor3" - }, +/turf/simulated/shuttle/floor, /area/shuttle/escape) "blB" = ( /obj/structure/sign/securearea{ @@ -35025,12 +35020,10 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "blC" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor3" +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, +/turf/simulated/shuttle/floor4, /area/shuttle/escape) "blD" = ( /obj/structure/grille, @@ -35780,13 +35773,19 @@ /turf/simulated/floor/plasteel, /area/hallway/primary/central/nw) "bmX" = ( -/obj/structure/chair{ - dir = 4 +/obj/machinery/status_display{ + pixel_y = 30 }, +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "bmY" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "bmZ" = ( @@ -35815,12 +35814,9 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "bnc" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/structure/closet/walllocker/emerglocker{ - pixel_x = 28 - }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -38803,39 +38799,25 @@ }, /area/maintenance/asmaint2) "btt" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/item/radio/intercom{ - dir = 8; - name = "station intercom (General)"; - pixel_x = -28 - }, -/obj/machinery/light/spot{ - tag = "icon-tube1 (WEST)"; - icon_state = "tube1"; - dir = 8 - }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/escape) "btu" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion"; + tag = "icon-propulsion (EAST)" }, -/obj/structure/closet/walllocker/emerglocker{ - pixel_x = 28 +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "swall_f6"; + dir = 2 }, -/obj/machinery/light/spot{ - tag = "icon-tube1 (EAST)"; - icon_state = "tube1"; - dir = 4 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor3" - }, -/area/shuttle/escape) +/area/shuttle/transport) "btv" = ( /turf/simulated/shuttle/floor, /turf/simulated/shuttle/wall/interior{ @@ -38864,23 +38846,18 @@ /turf/simulated/floor/wood, /area/crew_quarters/bar) "bty" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/transport) "btz" = ( -/obj/structure/chair, -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; - dir = 1 - }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/transport) "btA" = ( @@ -38906,7 +38883,12 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "btD" = ( -/obj/structure/chair, +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/transport) "btE" = ( @@ -40463,16 +40445,21 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "bwI" = ( -/obj/structure/chair{ - dir = 1 +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion"; + tag = "icon-propulsion (EAST)" + }, +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "swall_f5"; + dir = 2 }, -/turf/simulated/shuttle/floor, /area/shuttle/transport) "bwJ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light/spot, /turf/simulated/shuttle/floor, /area/shuttle/transport) "bwK" = ( @@ -40655,17 +40642,14 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "bwX" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion"; - tag = "icon-propulsion (EAST)" +/obj/structure/closet/walllocker/emerglocker{ + pixel_x = -28 }, -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f6"; - dir = 2 +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, -/area/shuttle/transport) +/turf/simulated/shuttle/floor4, +/area/shuttle/escape) "bwY" = ( /obj/machinery/power/apc{ dir = 4; @@ -41451,17 +41435,16 @@ }, /area/hallway/primary/central/ne) "bys" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion"; - tag = "icon-propulsion (EAST)" +/obj/structure/closet/walllocker/emerglocker{ + pixel_x = 28 }, -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; - dir = 2 +/obj/structure/chair/comfy/shuttle{ + dir = 8 }, -/area/shuttle/transport) +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/escape) "byt" = ( /obj/machinery/door/airlock/command/glass{ name = "Bridge"; @@ -42700,20 +42683,12 @@ }, /area/shuttle/specops) "bAS" = ( -/obj/machinery/recharger/wallcharger{ - pixel_x = 4; - pixel_y = 32 - }, -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; +/obj/machinery/light/spot, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/structure/chair, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/specops) +/turf/simulated/shuttle/floor, +/area/shuttle/transport) "bAT" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -43168,11 +43143,8 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "bBT" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/closet/walllocker/emerglocker{ - pixel_x = -28 +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) @@ -43222,11 +43194,12 @@ }, /area/shuttle/escape) "bBZ" = ( -/obj/machinery/recharger/wallcharger{ - pixel_x = 4; - pixel_y = 32 +/obj/machinery/camera{ + c_tag = "CentComm Special Ops. Shuttle"; + dir = 2; + network = list("ERT","CentComm") }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -43266,12 +43239,11 @@ /turf/unsimulated/floor, /area/shuttle/specops) "bCe" = ( -/obj/machinery/camera{ - c_tag = "CentComm Special Ops. Shuttle"; - dir = 2; - network = list("ERT","CentComm") +/obj/machinery/recharger/wallcharger{ + pixel_x = 4; + pixel_y = 32 }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -44022,14 +43994,16 @@ }, /area/shuttle/escape) "bDG" = ( -/obj/structure/chair{ - dir = 4 +/obj/machinery/recharger/wallcharger{ + pixel_x = 4; + pixel_y = 32 }, /obj/machinery/light/spot{ - tag = "icon-tube1 (WEST)"; + tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; - dir = 8 + dir = 1 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -44514,8 +44488,10 @@ }, /area/shuttle/specops) "bEL" = ( -/obj/structure/chair{ - dir = 1 +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -45607,11 +45583,13 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "bGJ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/turf/simulated/shuttle/floor4, -/area/shuttle/escape) +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/specops) "bGK" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/poddoor{ @@ -50861,6 +50839,24 @@ icon_state = "diagonalWall3" }, /area/shuttle/administration) +"bPM" = ( +/obj/item/radio/intercom{ + dir = 8; + name = "station intercom (General)"; + pixel_x = -28 + }, +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/escape) "bPN" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; @@ -52059,6 +52055,22 @@ icon_state = "wall3" }, /area/shuttle/administration) +"bRH" = ( +/obj/structure/closet/walllocker/emerglocker{ + pixel_x = 28 + }, +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/escape) "bRI" = ( /obj/structure/plasticflaps/mining, /obj/machinery/conveyor/east{ @@ -54136,6 +54148,20 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/engine/gravitygenerator) +"bVk" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor2" + }, +/area/shuttle/constructionsite) +"bVl" = ( +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor2" + }, +/area/shuttle/constructionsite) "bVm" = ( /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; @@ -55105,6 +55131,35 @@ icon_state = "floor4" }, /area/shuttle/administration) +"bWO" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "Blast door control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/door_control{ + id = "adminshuttleshutters"; + name = "Shutter control"; + pixel_x = 5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "bWP" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; @@ -56079,6 +56134,18 @@ icon_state = "floor4" }, /area/shuttle/administration) +"bYu" = ( +/obj/item/radio/intercom{ + broadcasting = 0; + listening = 1; + name = "station intercom (General)"; + pixel_y = 25 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor, +/area/shuttle/pod_4) "bYv" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -57361,6 +57428,19 @@ "cam" = ( /turf/simulated/wall, /area/quartermaster/miningdock) +"can" = ( +/obj/machinery/status_display{ + density = 0; + layer = 4; + pixel_x = 0; + pixel_y = 32 + }, +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor, +/area/shuttle/pod_4) "cao" = ( /obj/structure/filingcabinet, /turf/simulated/floor/plasteel, @@ -58157,13 +58237,34 @@ /turf/simulated/floor/plasteel/airless, /area/toxins/test_area) "cbx" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/administration) +"cby" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"cbz" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "cbA" = ( /obj/machinery/door/poddoor/shutters{ density = 0; @@ -59416,6 +59517,12 @@ icon_state = "floor3" }, /area/shuttle/administration) +"cdq" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/shuttle/floor, +/area/shuttle/mining) "cdr" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/admin{ name = "NTV Argos shuttle navigation computer" @@ -60192,6 +60299,18 @@ tag = "icon-cafeteria (NORTHEAST)" }, /area/crew_quarters/hor) +"ceT" = ( +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "ceU" = ( /obj/structure/shuttle/engine/propulsion, /turf/simulated/shuttle/plating, @@ -60241,6 +60360,9 @@ /area/quartermaster/miningdock) "cfc" = ( /obj/machinery/hologram/holopad, +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock) "cfd" = ( @@ -61149,13 +61271,8 @@ }, /area/shuttle/administration) "cgA" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/light/spot{ - tag = "icon-tube1 (EAST)"; - icon_state = "tube1"; - dir = 4 +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -62161,22 +62278,30 @@ }, /area/shuttle/administration) "cil" = ( -/obj/structure/chair{ +/obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f6"; + icon_state = "swall_f6"; + dir = 2 }, -/area/shuttle/administration) +/area/shuttle/pod_4) "cim" = ( /turf/simulated/shuttle/floor, /area/shuttle/mining) "cin" = ( -/obj/structure/chair{ - dir = 1 +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 }, -/turf/simulated/shuttle/floor, -/area/shuttle/mining) +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f5"; + icon_state = "swall_f5"; + dir = 2 + }, +/area/shuttle/pod_4) "cio" = ( /obj/machinery/door/window/brigdoor/westleft{ color = "#d70000"; @@ -62224,6 +62349,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "brown" @@ -63388,32 +63516,12 @@ icon_state = "floor4" }, /area/shuttle/administration) -"ckh" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "cki" = ( /obj/machinery/light/small{ dir = 8 }, /turf/simulated/shuttle/floor, /area/shuttle/mining) -"ckj" = ( -/obj/structure/window/plasmareinforced{ - color = "#FF0000"; - dir = 8 - }, -/obj/structure/chair{ - dir = 1 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "ckk" = ( /obj/machinery/door/airlock/shuttle{ id_tag = "s_docking_airlock"; @@ -64838,21 +64946,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/asmaint) -"cmI" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/start{ - name = "Shaft Miner" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plasteel, -/area/quartermaster/miningdock) "cmJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -65480,6 +65573,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock) "cnT" = ( @@ -65520,6 +65616,9 @@ dir = 5; level = 1 }, +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock) "cnV" = ( @@ -66610,8 +66709,8 @@ icon_state = "2-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cpA" = ( /obj/effect/decal/warning_stripes/southwestcorner, @@ -72259,8 +72358,8 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint) "cyO" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cyP" = ( /obj/effect/spawner/random_barrier/obstruction, @@ -79926,8 +80025,8 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cMC" = ( /obj/effect/landmark{ @@ -80473,8 +80572,8 @@ dir = 10; level = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cNF" = ( /obj/structure/cable{ @@ -81479,13 +81578,13 @@ /area/assembly/assembly_line) "cPw" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cPx" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cPy" = ( /obj/structure/table/reinforced, @@ -81532,8 +81631,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cPD" = ( /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ @@ -81578,24 +81677,24 @@ icon_state = "4-8"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cPH" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cPI" = ( /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cPJ" = ( /obj/structure/table, @@ -81778,8 +81877,8 @@ icon_state = "4-8"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cQb" = ( /obj/machinery/particle_accelerator/control_box, @@ -81913,8 +82012,8 @@ icon_state = "0-2"; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cQr" = ( /obj/structure/disposalpipe/segment{ @@ -82427,8 +82526,8 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cRf" = ( /obj/machinery/door/poddoor{ @@ -83122,8 +83221,8 @@ icon_state = "1-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cSl" = ( /obj/machinery/atmospherics/unary/vent_pump/on, @@ -84097,8 +84196,8 @@ pixel_y = 8; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cTS" = ( /obj/effect/landmark/burnturf, @@ -84143,8 +84242,8 @@ /turf/simulated/floor/plasteel, /area/maintenance/turbine) "cTW" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cTX" = ( /obj/structure/cable{ @@ -86754,8 +86853,8 @@ pixel_x = -25; pixel_y = -8 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cYA" = ( /obj/structure/cable{ @@ -89325,8 +89424,8 @@ pixel_y = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddB" = ( /obj/structure/disposalpipe/segment{ @@ -89339,13 +89438,13 @@ /obj/structure/transit_tube{ icon_state = "E-W-Pass" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space) "ddD" = ( /obj/item/wrench, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ddE" = ( /obj/structure/cable{ @@ -89355,8 +89454,8 @@ pixel_y = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddF" = ( /obj/structure/sign/biohazard{ @@ -89418,21 +89517,21 @@ pixel_y = 25; req_access_txt = "75;13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ddN" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddO" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 6; level = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ddP" = ( /obj/structure/cable{ @@ -89447,8 +89546,8 @@ icon_state = "1-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddQ" = ( /obj/structure/cable{ @@ -89470,16 +89569,16 @@ pixel_x = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddR" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddS" = ( /obj/structure/particle_accelerator/fuel_chamber, @@ -89490,8 +89589,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddU" = ( /obj/structure/cable{ @@ -89513,8 +89612,8 @@ pixel_x = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddV" = ( /obj/structure/cable{ @@ -89529,20 +89628,9 @@ icon_state = "2-8"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) -"ddW" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 - }, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f6"; - icon_state = "swall_f6"; - dir = 2 - }, -/area/shuttle/pod_4) "ddX" = ( /obj/machinery/access_button{ command = "cycle_exterior"; @@ -89553,20 +89641,9 @@ pixel_y = 25; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) -"ddY" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 - }, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f5"; - icon_state = "swall_f5"; - dir = 2 - }, -/area/shuttle/pod_4) "ddZ" = ( /obj/structure/reagent_dispensers/watertank, /obj/structure/cable{ @@ -89599,8 +89676,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "dec" = ( /obj/machinery/atmospherics/pipe/manifold/visible, @@ -89611,8 +89688,8 @@ icon_state = "0-2"; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "dee" = ( /obj/structure/cable{ @@ -89622,8 +89699,8 @@ pixel_x = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "def" = ( /obj/structure/cable{ @@ -89644,14 +89721,14 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "deg" = ( /obj/structure/cable, /obj/machinery/power/tracker, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "deh" = ( /obj/machinery/space_heater, @@ -90751,14 +90828,6 @@ icon_state = "floor2" }, /area/shuttle/constructionsite) -"dgw" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor2" - }, -/area/shuttle/constructionsite) "dgx" = ( /obj/machinery/computer/station_alert, /turf/simulated/shuttle/floor{ @@ -90974,16 +91043,6 @@ /obj/item/caution, /turf/simulated/floor/plating, /area/maintenance/asmaint) -"dhb" = ( -/obj/machinery/flasher{ - id = "soltraderflash"; - pixel_y = -28 - }, -/obj/structure/chair{ - dir = 8 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/trade/sol) "dhc" = ( /obj/structure/lattice, /obj/structure/lattice, @@ -91439,15 +91498,6 @@ icon_state = "showroomfloor" }, /area/crew_quarters/kitchen) -"dhW" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/light, -/turf/simulated/shuttle/floor{ - icon_state = "floor2" - }, -/area/shuttle/constructionsite) "dhX" = ( /obj/machinery/computer/atmos_alert, /turf/simulated/shuttle/floor{ @@ -91705,12 +91755,6 @@ icon_state = "blue" }, /area/hallway/primary/central/north) -"diy" = ( -/obj/structure/chair, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/syndicate_sit) "diz" = ( /obj/machinery/light/small, /obj/machinery/camera/motion{ @@ -93814,10 +93858,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/simulated/floor/plating, /area/maintenance/asmaint2) -"dmo" = ( -/turf/space, -/obj/structure/lattice/catwalk, -/area/space/nearstation) "dmp" = ( /obj/structure/table, /obj/item/weldingtool, @@ -95141,8 +95181,8 @@ /turf/simulated/floor/wood, /area/crew_quarters/captain) "doE" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "doF" = ( /turf/simulated/floor/plating, @@ -95163,18 +95203,6 @@ /obj/machinery/teleport/hub, /turf/simulated/floor/plating, /area/turret_protected/aisat_interior) -"doI" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/item/radio/intercom{ - broadcasting = 0; - listening = 1; - name = "station intercom (General)"; - pixel_y = 25 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/pod_4) "doK" = ( /obj/machinery/light, /turf/simulated/floor/plating, @@ -95193,19 +95221,6 @@ }, /turf/simulated/shuttle/floor, /area/shuttle/pod_4) -"doM" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/status_display{ - density = 0; - layer = 4; - pixel_x = 0; - pixel_y = 32 - }, -/obj/machinery/light, -/turf/simulated/shuttle/floor, -/area/shuttle/pod_4) "doN" = ( /obj/machinery/computer/station_alert, /obj/machinery/alarm{ @@ -96514,35 +96529,6 @@ /area/toxins/launch{ name = "Toxins Launch Room" }) -"jnJ" = ( -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; - dir = 1 - }, -/obj/machinery/door_control{ - id = "adminshuttleblast"; - name = "Blast door control"; - pixel_x = -5; - pixel_y = 35; - req_access = list(101); - req_access_txt = "0" - }, -/obj/machinery/door_control{ - id = "adminshuttleshutters"; - name = "Shutter control"; - pixel_x = 5; - pixel_y = 35; - req_access = list(101); - req_access_txt = "0" - }, -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "kOE" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{ dir = 4 @@ -96556,6 +96542,15 @@ }, /turf/space, /area/space/nearstation) +"opK" = ( +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "brown" + }, +/area/quartermaster/miningdock) "oZV" = ( /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; @@ -103741,7 +103736,7 @@ arh arh arh arh -arW +aPV arh apr aaa @@ -103995,9 +103990,9 @@ aaa apr arh aqk -arW -arW -arW +aPV +aPV +aPV dhe arh apr @@ -104509,9 +104504,9 @@ aaa apr arh aql -arZ -aPV -dhb +bcK +beB +bgo aql arh apr @@ -105300,9 +105295,9 @@ aaa aaa aaa aaa -bwX +btu bvi -bys +bwI aaa aaa aaa @@ -105556,11 +105551,11 @@ aab aaa aaa aaa -bwX +btu btv bvj bwE -bys +bwI aaa bAQ bCa @@ -106078,7 +106073,7 @@ brO aaa bAR bCc -bDG +bEL bEK bAR aLd @@ -106328,9 +106323,9 @@ aSf boP aSd brQ -btD +btz bvj -bwI +bwJ brQ bjQ bAR @@ -106585,15 +106580,15 @@ blE boL aSd brO -btD +btz bvj -bwI +bwJ brO aLd bAR -bCe +bBZ bCb -bEL +bGJ bAR aSd aaa @@ -106842,15 +106837,15 @@ bmS boL aSd brO -btz +btD bvj -bwJ +bAS brO aSd ahb bCb bCb -bEL +bGJ bAR aSd aSd @@ -107099,15 +107094,15 @@ aSf bsd aSd brO -btD +btz bvj -bwI +bwJ brO aSd ahb bCb bCb -bEL +bGJ bAR aSd bGm @@ -107356,15 +107351,15 @@ aSf bsh aSd brR -btD +btz bvj -bwI +bwJ brR aSd bAR -bBZ +bCe bCb -bEL +bGJ bAR aSd bGl @@ -107613,15 +107608,15 @@ brc bsh aSd brO -btD +btz bvj -bwI +bwJ brO aMs bAR -bAS +bDG bCb -bEL +bGJ bAR aSd bKp @@ -107834,11 +107829,11 @@ aaa awq axj awM -aze -aAh -aAh +axo +azf +azf aCT -aCX +aCY afy aFf aFe @@ -107870,9 +107865,9 @@ blE bsh aSd brO -btz +btD bvj -bwJ +bAS brO aMs bAT @@ -108147,7 +108142,7 @@ bRA bRA bWJ bPI -jnJ +bWO cbx cbx bPI @@ -108348,16 +108343,16 @@ aaa aws axj awN -azh -azh -azh +axN +axN +axN aBD -aCX +aCY aEe aFf aFg aaa -dmo +doE aII aII aII @@ -108667,7 +108662,7 @@ cds bPI cgz cio -ckj +ceT bPI bYv aaa @@ -108871,7 +108866,7 @@ aaa aaa aaa aaa -dmo +doE aII aII aLw @@ -108924,7 +108919,7 @@ aaa bPI bRA bRA -ckh +cgA bPI aaa aaa @@ -109179,8 +109174,8 @@ aaa aaa aaa bPI -cgA -cil +cby +cbz bPI bYv aaa @@ -113484,12 +113479,12 @@ aaa awv axl ayk -azf +avu aEf -aBk -aBk -aCY -diy +axm +axm +aze +azh aFk aFi aGn @@ -113999,11 +113994,11 @@ awx axl ayk azi +awP +awP +awP ayk -aBl -aBl -ayk -diy +azh aex aFi aGn @@ -114520,9 +114515,9 @@ aaa aaa aaa aaa -dmo -dmo -dmo +doE +doE +doE aFY aEb aIf @@ -116121,7 +116116,7 @@ ceZ cgB cim cki -cin +cdq cnh ceZ aab @@ -116376,9 +116371,9 @@ aaa aaa ceY cgC -cin +cdq cim -cin +cdq cni coN aab @@ -116635,7 +116630,7 @@ ceZ cgD cim cim -cin +cdq cnj ceZ aab @@ -118177,7 +118172,7 @@ cam cgH cit ckn -ckn +opK cnm cam cgQ @@ -118356,7 +118351,7 @@ atK auw avv awz -axo +atL aym azk aAk @@ -118609,7 +118604,7 @@ aaa aaa aaa asT -atL +arW aux avy awz @@ -118688,9 +118683,9 @@ cam cbI cdy cff -cfb cir cfb +cfb cnS cno cam @@ -118870,7 +118865,7 @@ atJ auu avx awy -axm +avp awz azk aAk @@ -119204,7 +119199,7 @@ cdA cis ckq cls -cmI +cls cnU cno cam @@ -120016,9 +120011,9 @@ cZu cZu dcM dfY -dgv -dgv -dgv +bVk +bVk +bVk dfY aaa aaa @@ -120273,9 +120268,9 @@ cZu cZu dcU dfZ -dgw -dgw -dhW +dgv +dgv +bVl dfY aaa aaa @@ -120531,7 +120526,7 @@ dcM dfd dfY dgv -dgw +bVk dgv dfY aaa @@ -129028,9 +129023,9 @@ dfR dcq dcq dcq -ddW +cil doL -ddY +cin dcq aaa aaa @@ -129286,7 +129281,7 @@ dcq aaa dcq dou -doI +bYu dou dcq aaa @@ -129543,7 +129538,7 @@ dcq aaa dcq dou -doM +can dou dcq aaa @@ -130049,7 +130044,7 @@ dkO dkO cQZ cYz -dmo +doE dcq dfE dgd @@ -130305,7 +130300,7 @@ cQZ cQZ cQZ cQZ -dmo +doE aab dcq dfD @@ -130562,7 +130557,7 @@ dkq dkT dkT cQZ -dmo +doE aab aaa dmW @@ -130819,7 +130814,7 @@ dkp bbO dlw cQZ -dmo +doE aab aaa dmW @@ -131076,7 +131071,7 @@ dks dkT dkT cQZ -dmo +doE aab aab dmX @@ -131333,7 +131328,7 @@ cQZ cQZ cQZ cQZ -dmo +doE aab aaa dmW @@ -131590,7 +131585,7 @@ dkw dkV dkV cQZ -dmo +doE aab aaa dmW @@ -131847,7 +131842,7 @@ dku bdG dlx cQZ -dmo +doE aab aaa dmW @@ -132104,11 +132099,11 @@ dkx dkV dkV cQZ -dmo -dmo -dmo +doE +doE +doE ddC -dmo +doE ddM ddO cPw @@ -132361,7 +132356,7 @@ cQZ cQZ cQZ cQZ -dmo +doE aab aaa dmW @@ -132618,7 +132613,7 @@ aab aab aab aab -dmo +doE aab aaa dmW @@ -132866,16 +132861,16 @@ cSn cTo cSn cQZ -dmo -dmo -dmo -dmo -dmo -dmo -dmo -dmo -dmo -dmo +doE +doE +doE +doE +doE +doE +doE +doE +doE +doE aab dmB dmZ @@ -133123,7 +133118,7 @@ den deX dfO cQZ -dmo +doE aaa aaa aaa @@ -133380,7 +133375,7 @@ dem cRi dem cQZ -dmo +doE aab alw alw @@ -133637,7 +133632,7 @@ dem deY dem cQZ -dmo +doE aab alw aab @@ -133894,7 +133889,7 @@ cQZ cQZ cQZ cQZ -dmo +doE aaa diu djd @@ -135104,7 +135099,7 @@ bbC aGY beb djw -bje +bgp boX bpH bqH @@ -135191,10 +135186,10 @@ dlm dlm dlm dmD -dmo -dmo -dmo -dmo +doE +doE +doE +doE aab aab aab @@ -135361,7 +135356,7 @@ bbh aGY beb dju -bjg +bil bjv dnD bmy @@ -135451,7 +135446,7 @@ dlm dlm dnx aaa -dmo +doE aaa aaa aaa @@ -135618,7 +135613,7 @@ bbh aGY beb djx -bjh +bin bjv dnE bmy @@ -135708,7 +135703,7 @@ dmO dne dnI aaa -dmo +doE aaa aaa aaa @@ -135848,9 +135843,9 @@ atG auA axg axh -awP +aAh avt -axN +aCX atG aaa aFK @@ -135875,7 +135870,7 @@ bbI aGY beb bfH -bjh +bin bjx bfH bmy @@ -135965,7 +135960,7 @@ dlm dlm dnx aaa -dmo +doE aaa aaa aaa @@ -136106,7 +136101,7 @@ axf dgk axh auq -avp +aBk auq atG aab @@ -136132,7 +136127,7 @@ bbV aGY beb bfJ -bjh +bin bjy bkY bmy @@ -136220,9 +136215,9 @@ dlm dmE dlm ddD -dmo -dmo -dmo +doE +doE +doE aaa aaa aaa @@ -136363,7 +136358,7 @@ azT azT axh auq -avu +aBl auq aaa aaa @@ -136616,9 +136611,9 @@ aaa aaa aaa awl -dmo +doE avM -dmo +doE aus avw awm @@ -139705,7 +139700,7 @@ aab aqZ aaa aab -dmo +doE aHN aHN aHN @@ -139810,8 +139805,8 @@ dia dcW bZZ aaa -dmo -dmo +doE +doE cTR aaa aaa @@ -140219,7 +140214,7 @@ aab aqZ aaa aaa -dmo +doE aHN dof dog @@ -150273,15 +150268,15 @@ aaa aaa aaa bjC -bmX -bBT +blC +bwX bDz bjC beC +bPM +btt +btt btt -blA -blA -blA bzq beC bjC @@ -150530,7 +150525,7 @@ aaa aYD bic bjG -blu +bmX bDz bDz bjC @@ -150789,13 +150784,13 @@ bik bjC bmY bDz -bGJ +bBT bjC beC -blC -blC -blC -blC +bnc +bnc +bnc +bnc beC beC bBV @@ -151041,12 +151036,12 @@ aaa aYD baW beA -bgo -bil +bjg +blu bjC bmY bDz -bGJ +bBT bjC beC blD @@ -151297,7 +151292,7 @@ aaa aYD baW bcJ -beB +bje beC beC bjC @@ -151306,10 +151301,10 @@ bmQ bnb bqo beC -blA -blA -blA -blA +btt +btt +btt +btt beC bAP bBX @@ -151553,7 +151548,7 @@ aaa aaa aYU baX -bcK +bje beC beC beC @@ -151811,19 +151806,19 @@ aaa aYH baY bcL -beB +bje beC bim bjC -blC -blC -blC -blC +bnc +bnc +bnc +bnc beC -blC -blC -blC -blC +bnc +bnc +bnc +bnc beC bAP bBX @@ -152069,8 +152064,8 @@ aaa aYH baY beD -bgp -bin +bjh +blA bjJ blD bnb @@ -152329,15 +152324,15 @@ aYU baY beC bjC -blA -blA -blA -blA +btt +btt +btt +btt beC -blA -blA -blA -blA +btt +btt +btt +btt beC beC bBY @@ -152843,15 +152838,15 @@ aaa aaa aaa bjC -blC bnc -blC -blC -blC -btu -blC -blC -blC +bys +bnc +bnc +bnc +bRH +bnc +bnc +bnc beC beC bBS @@ -153050,7 +153045,7 @@ aha ahZ aha aha -amZ +arZ agZ aaa aaa @@ -153808,8 +153803,8 @@ aaa aaa agc agZ -ahp -ahp +amZ +amZ agZ ail agw diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 7a43bfc098b..d04bf394f26 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -3643,14 +3643,14 @@ }, /area/syndicate_mothership) "jt" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/light/small{ tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -3664,14 +3664,14 @@ /turf/simulated/floor/plating/airless, /area/syndicate_mothership) "jw" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/small{ tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -7380,9 +7380,8 @@ }, /area/centcom/evac) "sn" = ( -/obj/structure/chair{ - dir = 4; - name = "Defense" +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, /turf/simulated/shuttle/floor, /area/centcom/evac) @@ -12454,26 +12453,32 @@ }, /turf/unsimulated/floor/vox, /area/vox_station) +"KA" = ( +/obj/structure/chair/sofa/left, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/escape) "KR" = ( -/obj/structure/chair{ +/obj/machinery/light/small, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light/small, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/assault_pod) "KW" = ( -/obj/structure/chair, /obj/machinery/light/small{ dir = 1 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/assault_pod) "KX" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -12481,7 +12486,7 @@ }, /area/shuttle/assault_pod) "KY" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -12582,12 +12587,6 @@ icon_state = "floor4" }, /area/shuttle/escape) -"QJ" = ( -/obj/structure/chair/sofa/corner, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/escape) "Rf" = ( /obj/structure/chair{ dir = 1 @@ -12740,7 +12739,7 @@ /turf/simulated/shuttle/floor, /area/centcom/evac) "Wk" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -12748,7 +12747,7 @@ }, /area/centcom/evac) "Wl" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -12756,13 +12755,13 @@ }, /area/centcom/evac) "WI" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, /area/centcom/evac) "WU" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/centcom/evac) "Xj" = ( @@ -41460,7 +41459,7 @@ sq aN aN nV -QI +KA og og og @@ -41717,7 +41716,7 @@ sq aN aN nV -QJ +og og og og diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm index be3d4769341..7e8d296ba7d 100644 --- a/_maps/map_files/cyberiad/z3.dmm +++ b/_maps/map_files/cyberiad/z3.dmm @@ -764,8 +764,7 @@ /area/shuttle/freegolem) "bS" = ( /obj/machinery/light, -/obj/structure/chair/comfy/purp{ - icon_state = "comfychair"; +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/floor/mineral/titanium/purple, diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm index 531ef1f4dfb..1d4f0c698ea 100644 --- a/_maps/map_files/cyberiad/z4.dmm +++ b/_maps/map_files/cyberiad/z4.dmm @@ -845,37 +845,17 @@ /turf/simulated/floor/plating/airless, /area/constructionsite/hallway/center) "cl" = ( -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, -/area/space/nearstation) -"cm" = ( /turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, /area/space/nearstation) "cn" = ( -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/engiestation/solars) -"co" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) -"cp" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/space/nearstation) "cq" = ( /obj/structure/inflatable/door, /turf/simulated/floor/plasteel/airless, /area/constructionsite/hallway/center) -"cr" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/space/nearstation) -"cs" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) "ct" = ( /obj/machinery/power/solar, /obj/structure/cable{ @@ -892,8 +872,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/engiestation/solars) "cv" = ( /obj/machinery/power/tracker, @@ -916,8 +896,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/engiestation/solars) "cx" = ( /obj/machinery/power/solar, @@ -955,8 +935,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/engiestation/solars) "cB" = ( /obj/structure/cable{ @@ -974,8 +954,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/engiestation/solars) "cC" = ( /turf/simulated/wall/r_wall, @@ -1045,55 +1025,6 @@ icon_state = "bcircuit" }, /area/constructionsite/ai) -"cL" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) -"cM" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) -"cN" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) -"cO" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/obj/structure/cable{ - d1 = 2; - d2 = 4; - icon_state = "2-4" - }, -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) -"cP" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) -"cQ" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) "cR" = ( /obj/machinery/light_switch{ pixel_y = -28 @@ -1107,10 +1038,6 @@ icon_state = "dark" }, /area/engiestation) -"cT" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/space/nearstation) "cU" = ( /obj/structure/lattice, /turf/space, @@ -1270,10 +1197,6 @@ /obj/structure/grille, /turf/simulated/floor/plating/airless, /area/constructionsite/ai) -"do" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) "dp" = ( /obj/structure/cable{ d1 = 2; @@ -1285,8 +1208,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/engiestation/solars) "dq" = ( /obj/structure/cable{ @@ -1305,28 +1228,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, -/area/engiestation/solars) -"dr" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, -/obj/structure/cable{ - d1 = 2; - d2 = 4; - icon_state = "2-4" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, /turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, /area/engiestation/solars) "ds" = ( /obj/effect/spawner/window/reinforced, @@ -1437,28 +1340,8 @@ icon_state = "4-8"; pixel_x = 0 }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, -/area/engiestation/solars) -"dz" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, -/obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, /turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, /area/engiestation/solars) "dA" = ( /obj/structure/cable{ @@ -1471,12 +1354,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, -/area/engiestation/solars) -"dB" = ( /turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, /area/engiestation/solars) "dC" = ( /obj/machinery/recharge_station, @@ -1629,8 +1508,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/engiestation/solars) "dT" = ( /obj/structure/cable{ @@ -1644,23 +1523,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, -/area/engiestation/solars) -"dU" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, -/obj/structure/cable{ - d1 = 2; - d2 = 4; - icon_state = "2-4" - }, /turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, /area/engiestation/solars) "dV" = ( /obj/structure/cable{ @@ -1716,32 +1580,8 @@ icon_state = "4-8"; pixel_x = 0 }, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, -/area/engiestation/solars) -"eb" = ( -/obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, /turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) -"ec" = ( -/obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, /area/engiestation/solars) "ed" = ( /obj/item/stack/sheet/metal{ @@ -1880,10 +1720,6 @@ icon_state = "dark" }, /area/engiestation) -"em" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/engiestation/solars) "en" = ( /obj/machinery/vending/tool, /turf/simulated/floor/plasteel{ @@ -1919,10 +1755,6 @@ }, /turf/simulated/floor/plating/airless, /area/constructionsite/ai) -"es" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/space/nearstation) "et" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "0"; @@ -2228,10 +2060,6 @@ icon_state = "carpet" }, /area/engiestation) -"fi" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/space/nearstation) "fj" = ( /obj/machinery/vending/cola, /turf/simulated/floor/plasteel{ @@ -2530,13 +2358,13 @@ }, /area/engiestation) "fQ" = ( -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/space) "fR" = ( /obj/item/lighter/zippo, -/turf/simulated/floor/plating/airless, /obj/structure/lattice/catwalk, +/turf/simulated/floor/plating/airless, /area/space/nearstation) "fS" = ( /obj/machinery/shower{ @@ -2629,10 +2457,6 @@ icon_state = "delivery" }, /area/engiestation) -"gc" = ( -/turf/simulated/floor/plating/airless, -/obj/structure/lattice/catwalk, -/area/space/nearstation) "gd" = ( /obj/structure/lattice, /obj/structure/disposaloutlet{ @@ -14393,14 +14217,14 @@ aa aa ab cl -cr -cr -cr -cr -cr -cr -cr -cr +cl +cl +cl +cl +cl +cl +cl +cl fQ bC aa @@ -14649,7 +14473,7 @@ aa aa ab cl -es +cl ab ab ab @@ -14658,7 +14482,7 @@ ab ab aa aa -cm +cl ab aa aa @@ -14896,16 +14720,16 @@ aa aa ab cl -cr -cr -cr -cr -cP -cs -do -cs -do -cM +cl +cl +cl +cl +cn +cn +cn +cn +cn +cn cC cF cF @@ -14915,7 +14739,7 @@ cF cC aa aa -cm +cl ab aa aa @@ -15152,12 +14976,12 @@ aa aa aa ab -cm +cl ab ab aa ab -co +cn dd dp dK @@ -15409,12 +15233,12 @@ aa aa aa aa -cm +cl ab ab ab ab -co +cn dd dq dK @@ -15666,12 +15490,12 @@ aa aa aa aa -cm +cl aa ab ab ab -co +cn dd dq dK @@ -15923,16 +15747,16 @@ aa aa aa aa -cm +cl ab ab ab -cL -cM +cn +cn dd -dr +dq dK -dU +dT dK da eB @@ -16181,10 +16005,10 @@ aa aa ab cn -cs -cs -cs -cM +cn +cn +cn +cn cW cX ds @@ -16437,7 +16261,7 @@ aa aa aa ab -co +cn ct ct ct @@ -16698,7 +16522,7 @@ cn cu cA cA -cN +cA cY df du @@ -16951,7 +16775,7 @@ aa aa aa ab -co +cn cv ct ct @@ -17212,7 +17036,7 @@ cn cw cB cB -cO +cB cY df dw @@ -17465,7 +17289,7 @@ aa aa aa ab -co +cn cx cx cx @@ -17723,10 +17547,10 @@ aa aa ab cn -cs -cs -cs -cP +cn +cn +cn +cn cW cX ds @@ -17979,12 +17803,12 @@ aa aa aa aa -cm +cl aa aa ab -cQ -cP +cn +cn dd dy dK @@ -18236,16 +18060,16 @@ aa aa aa aa -cm +cl aa ab ab ab -co +cn dd -dz +dy dK -eb +ea dK da eI @@ -18493,16 +18317,16 @@ aa aa aa aa -cm +cl ab ab ab ab -co +cn dd -dz +dy dK -eb +ea dK da dj @@ -18750,16 +18574,16 @@ aa aa aa aa -cm +cl ab ab aa ab -co +cn dd dA dK -ec +cu dK da dj @@ -19007,17 +18831,17 @@ aa aa aa aa -cm +cl aa aa aa aa -cQ -cs -dB -cs -dB -em +cn +cn +cn +cn +cn +cn da eI da @@ -19264,7 +19088,7 @@ aa aa aa aa -cm +cl aa cC cF @@ -19285,7 +19109,7 @@ cF cF cF cC -gc +cl aa aa aa @@ -19521,7 +19345,7 @@ aa aa aa aa -cm +cl aa cC cG @@ -19542,7 +19366,7 @@ ab ab aa aa -cm +cl aa aa aa @@ -19778,7 +19602,7 @@ aa aa aa aa -cm +cl aa cC cH @@ -19799,7 +19623,7 @@ aa ab ab aa -cm +cl aa aa aa @@ -20035,7 +19859,7 @@ aa aa aa aa -cm +cl aa cC cI @@ -20056,7 +19880,7 @@ aa aa ab ab -cm +cl ab aa aa @@ -20292,7 +20116,7 @@ aa aa aa ab -cm +cl aa cC cF @@ -20307,13 +20131,13 @@ dE dj dE cC -fi -cr -cr -cr -cr -cr -es +cl +cl +cl +cl +cl +cl +cl bC aa aa @@ -20549,11 +20373,11 @@ aa aa aa ab -cp -cr -cr -cr -cT +cl +cl +cl +cl +cl dc cC dD diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index 86b1bb9cc7f..e51ec171e34 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -15,8 +15,8 @@ }, /area/djstation/solars) "ad" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ae" = ( /obj/structure/lattice, @@ -76,8 +76,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/djstation/solars) "ao" = ( /obj/structure/grille{ @@ -93,8 +93,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/djstation/solars) "aq" = ( /obj/structure/cable{ @@ -125,8 +125,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/djstation) "at" = ( /obj/structure/lattice, @@ -312,8 +312,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/djstation) "aR" = ( /obj/structure/cable{ @@ -331,8 +331,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/djstation/solars) "aS" = ( /obj/structure/cable{ @@ -340,8 +340,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/djstation/solars) "aT" = ( /obj/structure/cable{ @@ -359,8 +359,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/djstation/solars) "aU" = ( /obj/item/storage/toolbox/mechanical{ @@ -386,8 +386,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/djstation) "aW" = ( /turf/simulated/floor/plasteel{ @@ -4602,8 +4602,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "jL" = ( /obj/structure/table/wood, @@ -6021,7 +6021,7 @@ /area/space/nearstation) "nh" = ( /obj/item/shard, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plasteel/airless, @@ -6263,7 +6263,7 @@ /obj/item/shard{ icon_state = "medium" }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plating/asteroid/airless, @@ -6693,8 +6693,8 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "oT" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -7118,14 +7118,14 @@ }, /area/derelict/arrival) "pV" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Human remains" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -7569,7 +7569,7 @@ }, /area/derelict/arrival) "qT" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -7577,7 +7577,7 @@ }, /area/derelict/arrival) "qU" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -7751,8 +7751,8 @@ d2 = 8; icon_state = "4-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "rn" = ( /obj/structure/cable{ @@ -7765,8 +7765,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "ro" = ( /obj/structure/window/reinforced, @@ -7817,9 +7817,7 @@ dir = 1 }, /obj/structure/shuttle/engine/propulsion, -/turf/simulated/floor/plasteel/airless{ - icon_state = "floorscorched2" - }, +/turf/simulated/shuttle/plating, /area/derelict/arrival) "rt" = ( /obj/structure/window/reinforced, @@ -7993,8 +7991,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "rG" = ( /obj/structure/closet/crate/secure/loot, @@ -8029,8 +8027,8 @@ /turf/space, /area/derelict/crew_quarters) "rJ" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "rK" = ( /obj/machinery/power/tracker, @@ -8272,8 +8270,8 @@ d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "si" = ( /obj/structure/cable{ @@ -8333,12 +8331,12 @@ }, /area/derelict/crew_quarters) "sl" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/small{ dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -9006,8 +9004,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "tF" = ( /obj/structure/sign/greencross, @@ -9040,8 +9038,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "tI" = ( /obj/structure/cable{ @@ -9563,8 +9561,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "uJ" = ( /turf/space, @@ -9895,8 +9893,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "vn" = ( /obj/item/shard{ @@ -10462,8 +10460,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "wm" = ( /obj/structure/cable{ @@ -10476,8 +10474,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "wn" = ( /obj/structure/closet/jcloset, @@ -10502,8 +10500,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "wp" = ( /obj/structure/cable{ @@ -10521,8 +10519,8 @@ d2 = 4; icon_state = "1-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "wq" = ( /obj/structure/cable{ @@ -10540,8 +10538,8 @@ d2 = 8; icon_state = "1-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/derelict/solar_control) "wr" = ( /obj/docking_port/stationary{ diff --git a/_maps/map_files/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm index 3bfdb1d12b2..142bbcff5f7 100644 --- a/_maps/map_files/generic/Lavaland.dmm +++ b/_maps/map_files/generic/Lavaland.dmm @@ -200,7 +200,8 @@ dir = 1; pixel_y = -24 }, -/turf/simulated/floor/mech_bay_recharge_floor, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, /area/mine/eva) "aJ" = ( /obj/machinery/light/small{ @@ -436,12 +437,6 @@ /turf/simulated/floor/plasteel/freezer, /area/mine/living_quarters) "bp" = ( -/obj/structure/table, -/obj/item/pickaxe, -/obj/item/gps/mining, -/obj/item/gps/mining, -/obj/item/gps/mining, -/obj/item/gps/mining, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -451,6 +446,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/suit_storage_unit/lavaland, /turf/simulated/floor/plasteel, /area/mine/eva) "bq" = ( @@ -594,11 +590,6 @@ /obj/machinery/light{ dir = 8 }, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, /obj/effect/turf_decal/tile/brown{ dir = 8 }, @@ -611,7 +602,19 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/machinery/suit_storage_unit/lavaland, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, /turf/simulated/floor/plasteel, /area/mine/eva) "bF" = ( @@ -758,9 +761,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/cable{ - icon_state = "2-8" - }, /turf/simulated/floor/plasteel, /area/mine/eva) "bV" = ( @@ -943,16 +943,15 @@ pixel_y = -23 }, /obj/structure/cable, -/obj/machinery/recharge_station, /obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/machinery/suit_storage_unit/lavaland, /turf/simulated/floor/plasteel, /area/mine/eva) "cp" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/structure/cable, -/turf/simulated/floor/plating, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, /area/mine/eva) "cq" = ( /obj/effect/turf_decal/tile/brown{ @@ -977,9 +976,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -1854,13 +1850,10 @@ /turf/simulated/wall, /area/mine/production) "eo" = ( -/obj/machinery/computer/mech_bay_power_console{ - icon_state = "computer"; - dir = 1 - }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/suit_storage_unit/lavaland, /turf/simulated/floor/plasteel, /area/mine/eva) "ep" = ( @@ -2023,6 +2016,9 @@ /obj/structure/cable{ icon_state = "1-8" }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/simulated/floor/plasteel, /area/mine/production) "eD" = ( @@ -2100,6 +2096,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/structure/ore_box, /turf/simulated/floor/plasteel, /area/mine/production) "eK" = ( @@ -2148,6 +2145,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/simulated/floor/plasteel, /area/mine/production) "eQ" = ( @@ -2237,13 +2237,11 @@ dir = 1; pixel_y = -22 }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, /obj/effect/turf_decal/tile/purple{ dir = 8 }, /obj/effect/turf_decal/tile/purple, +/obj/machinery/recharge_station, /turf/simulated/floor/plasteel, /area/mine/production) "fc" = ( @@ -2253,9 +2251,6 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fd" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, /obj/machinery/light, /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -2263,6 +2258,8 @@ /obj/effect/turf_decal/tile/brown{ dir = 2 }, +/obj/machinery/mech_bay_recharge_port, +/obj/structure/cable, /turf/simulated/floor/plasteel, /area/mine/production) "fe" = ( @@ -2290,12 +2287,7 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fh" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/mech_bay_recharge_floor, /area/mine/production) "fi" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -2304,15 +2296,16 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fj" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, /obj/effect/turf_decal/tile/brown{ dir = 8 }, /obj/effect/turf_decal/tile/brown{ dir = 2 }, +/obj/machinery/computer/mech_bay_power_console{ + icon_state = "computer"; + dir = 1 + }, /turf/simulated/floor/plasteel, /area/mine/production) "fk" = ( @@ -2500,7 +2493,6 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fE" = ( -/obj/structure/ore_box, /obj/effect/turf_decal/tile/purple{ dir = 8 }, @@ -2579,7 +2571,6 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fL" = ( -/obj/structure/ore_box, /obj/effect/turf_decal/tile/brown{ dir = 8 }, @@ -2589,14 +2580,15 @@ /obj/effect/turf_decal/tile/brown{ dir = 2 }, +/obj/structure/closet/secure_closet/miner, /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fM" = ( -/obj/machinery/recharge_station, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/structure/closet/secure_closet/miner, /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fN" = ( @@ -4090,6 +4082,10 @@ }, /turf/simulated/floor/plasteel/freezer, /area/mine/living_quarters) +"tK" = ( +/obj/structure/ore_box, +/turf/simulated/floor/plasteel, +/area/mine/production) "vq" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/plasteel, @@ -20710,7 +20706,7 @@ dL ej eG ct -eW +tK bN ab ab diff --git a/_maps/map_files/shuttles/admin_admin.dmm b/_maps/map_files/shuttles/admin_admin.dmm index fda5ff55056..bad43283b9b 100644 --- a/_maps/map_files/shuttles/admin_admin.dmm +++ b/_maps/map_files/shuttles/admin_admin.dmm @@ -408,6 +408,9 @@ /obj/structure/chair/comfy/black{ dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -416,6 +419,9 @@ /obj/structure/chair/comfy/black{ dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -550,14 +556,14 @@ }, /area/shuttle/administration) "bl" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -603,7 +609,7 @@ }, /area/shuttle/administration) "br" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -643,7 +649,7 @@ color = "#FF0000"; dir = 8 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -651,7 +657,7 @@ }, /area/shuttle/administration) "bw" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ diff --git a/_maps/map_files/shuttles/admin_hospital.dmm b/_maps/map_files/shuttles/admin_hospital.dmm index de3cacaf413..c9a41d69463 100644 --- a/_maps/map_files/shuttles/admin_hospital.dmm +++ b/_maps/map_files/shuttles/admin_hospital.dmm @@ -237,6 +237,9 @@ icon_state = "chair"; dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -256,6 +259,9 @@ name = "NHV Asclepius Lobby"; network = list("NHV Asclepius") }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -319,7 +325,7 @@ }, /area/shuttle/administration) "aG" = ( -/obj/structure/chair/office/light{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -412,6 +418,9 @@ /obj/structure/chair{ dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -420,6 +429,9 @@ /obj/structure/chair{ dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -483,7 +495,7 @@ }, /area/shuttle/administration) "aY" = ( -/obj/structure/chair/office/light, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -664,6 +676,9 @@ req_access = list(101); req_access_txt = "0" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -890,6 +905,9 @@ dir = 8 }, /obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, diff --git a/_maps/map_files/shuttles/emergency_bar.dmm b/_maps/map_files/shuttles/emergency_bar.dmm index 0cfb856e28d..4dd07825738 100644 --- a/_maps/map_files/shuttles/emergency_bar.dmm +++ b/_maps/map_files/shuttles/emergency_bar.dmm @@ -43,7 +43,7 @@ /turf/simulated/floor/carpet, /area/shuttle/escape) "ai" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/floor/carpet, @@ -75,7 +75,7 @@ /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/floor/carpet, @@ -91,7 +91,7 @@ /turf/simulated/floor/carpet, /area/shuttle/escape) "ar" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/carpet, @@ -123,6 +123,9 @@ /obj/structure/chair{ dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "ax" = ( @@ -135,6 +138,7 @@ dir = 1 }, /obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "ay" = ( @@ -194,6 +198,9 @@ /obj/structure/closet/walllocker/emerglocker{ pixel_x = -28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aF" = ( @@ -224,10 +231,14 @@ /obj/structure/chair{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aK" = ( /obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aL" = ( diff --git a/_maps/map_files/shuttles/emergency_clown.dmm b/_maps/map_files/shuttles/emergency_clown.dmm index 1207e8a09ff..5942ed33b76 100644 --- a/_maps/map_files/shuttles/emergency_clown.dmm +++ b/_maps/map_files/shuttles/emergency_clown.dmm @@ -43,7 +43,7 @@ /turf/simulated/floor/noslip, /area/shuttle/escape) "ai" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/floor/plasteel{ @@ -58,14 +58,6 @@ /obj/machinery/computer/station_alert, /turf/simulated/floor/noslip, /area/shuttle/escape) -"al" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/shuttle/escape) "am" = ( /obj/item/toy/snappop/phoenix, /turf/simulated/floor/plasteel{ @@ -80,12 +72,12 @@ /turf/simulated/floor/noslip, /area/shuttle/escape) "ao" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = -28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/floor/noslip, /area/shuttle/escape) "ap" = ( @@ -95,12 +87,12 @@ }, /area/shuttle/escape) "aq" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/floor/noslip, /area/shuttle/escape) "ar" = ( @@ -114,7 +106,7 @@ /turf/simulated/floor/noslip, /area/shuttle/escape) "at" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plasteel{ @@ -129,7 +121,7 @@ }, /area/shuttle/escape) "av" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -675,7 +667,7 @@ bt ab ae ah -al +ai am au ax @@ -727,7 +719,7 @@ aa ad ag aj -al +ai ap au ax diff --git a/_maps/map_files/shuttles/emergency_cramped.dmm b/_maps/map_files/shuttles/emergency_cramped.dmm index de7bb67bb6b..5cd443121dc 100644 --- a/_maps/map_files/shuttles/emergency_cramped.dmm +++ b/_maps/map_files/shuttles/emergency_cramped.dmm @@ -46,7 +46,7 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "j" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/floor/plating, @@ -114,7 +114,7 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "s" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plating, diff --git a/_maps/map_files/shuttles/emergency_cyb.dmm b/_maps/map_files/shuttles/emergency_cyb.dmm index 3be4c293b80..5f35a77e455 100644 --- a/_maps/map_files/shuttles/emergency_cyb.dmm +++ b/_maps/map_files/shuttles/emergency_cyb.dmm @@ -43,7 +43,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "ai" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -56,12 +56,6 @@ /obj/machinery/computer/station_alert, /turf/simulated/shuttle/floor, /area/shuttle/escape) -"al" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) "am" = ( /turf/simulated/shuttle/floor, /area/shuttle/escape) @@ -73,21 +67,21 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "ao" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = -28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/escape) "ap" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/escape) "aq" = ( @@ -101,7 +95,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "as" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -111,7 +105,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "au" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -142,7 +136,7 @@ }, /area/shuttle/escape) "az" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor4, @@ -156,7 +150,7 @@ icon_state = "tube1"; dir = 1 }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aB" = ( @@ -171,7 +165,7 @@ }, /area/shuttle/escape) "aC" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -179,7 +173,7 @@ }, /area/shuttle/escape) "aD" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -205,12 +199,12 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "aG" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = -28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aH" = ( @@ -236,12 +230,12 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "aL" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -256,13 +250,13 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "aN" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aO" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aP" = ( @@ -296,9 +290,6 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "aS" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/item/radio/intercom{ dir = 8; name = "station intercom (General)"; @@ -309,14 +300,14 @@ icon_state = "tube1"; dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/escape) "aT" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, @@ -325,6 +316,9 @@ icon_state = "tube1"; dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -710,7 +704,7 @@ bw ab ae ah -al +ai am am av @@ -762,7 +756,7 @@ aa ad ag aj -al +ai am at av diff --git a/_maps/map_files/shuttles/emergency_dept.dmm b/_maps/map_files/shuttles/emergency_dept.dmm index 45acf04e012..32b14270d05 100644 --- a/_maps/map_files/shuttles/emergency_dept.dmm +++ b/_maps/map_files/shuttles/emergency_dept.dmm @@ -62,7 +62,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "al" = ( -/obj/structure/chair/comfy/blue{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -93,36 +93,6 @@ "aq" = ( /turf/simulated/shuttle/floor, /area/shuttle/escape) -"ar" = ( -/obj/structure/chair/comfy/beige{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) -"as" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) -"at" = ( -/obj/structure/chair/comfy/red{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) -"au" = ( -/obj/structure/chair/comfy/teal{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) -"av" = ( -/obj/structure/chair/comfy/purp{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) "aw" = ( /turf/simulated/shuttle/wall{ icon_state = "swall13"; @@ -143,7 +113,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "az" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aA" = ( @@ -155,7 +125,7 @@ icon_state = "tube1"; dir = 1 }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aB" = ( @@ -172,7 +142,7 @@ }, /area/shuttle/escape) "aD" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plasteel{ @@ -227,7 +197,7 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "aK" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/plasteel{ icon_state = "cafeteria"; dir = 2 @@ -276,13 +246,13 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "aQ" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aR" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/floor/plasteel{ @@ -327,53 +297,53 @@ }, /area/shuttle/escape) "aW" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aX" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor2" }, /area/shuttle/escape) "aY" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/floor/plasteel, /area/shuttle/escape) "aZ" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/floor/plasteel, /area/shuttle/escape) "ba" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor5" }, /area/shuttle/escape) "bb" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor4, @@ -405,9 +375,6 @@ }, /area/shuttle/escape) "bf" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/item/radio/intercom{ dir = 8; name = "station intercom (General)"; @@ -421,6 +388,9 @@ /obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "bg" = ( @@ -431,35 +401,35 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "bh" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plasteel, /area/shuttle/escape) "bi" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plasteel, /area/shuttle/escape) "bj" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor2" }, /area/shuttle/escape) "bk" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "bl" = ( @@ -473,10 +443,10 @@ }, /area/shuttle/escape) "bm" = ( -/obj/structure/chair{ +/obj/structure/window/reinforced, +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/structure/window/reinforced, /turf/simulated/shuttle/floor{ icon_state = "floor2" }, @@ -490,41 +460,38 @@ }, /area/shuttle/escape) "bo" = ( -/obj/structure/chair{ +/obj/structure/window/reinforced, +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/structure/window/reinforced, /turf/simulated/shuttle/floor{ icon_state = "floor2" }, /area/shuttle/escape) "bp" = ( /obj/structure/window/reinforced, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plasteel, /area/shuttle/escape) "bq" = ( /obj/structure/window/reinforced, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plasteel, /area/shuttle/escape) "br" = ( -/obj/structure/chair{ +/obj/structure/window/reinforced, +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/structure/window/reinforced, /turf/simulated/shuttle/floor{ icon_state = "floor5" }, /area/shuttle/escape) "bs" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, @@ -536,15 +503,18 @@ /obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/escape) "bt" = ( -/obj/structure/chair{ +/obj/structure/window/reinforced, +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/structure/window/reinforced, /turf/simulated/shuttle/floor{ icon_state = "floor5" }, @@ -593,23 +563,23 @@ }, /area/shuttle/escape) "bz" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/escape) "bA" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/window/reinforced{ dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor5" }, @@ -665,7 +635,7 @@ }, /area/shuttle/escape) "bF" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -678,7 +648,7 @@ }, /area/shuttle/escape) "bH" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -849,7 +819,7 @@ bT aa ae ai -ar +al aq ae az @@ -875,7 +845,7 @@ bT aa ae aj -as +al aq ae az @@ -901,7 +871,7 @@ bS ab af ak -at +al aq ax aB @@ -979,7 +949,7 @@ bU aa ae an -au +al aq ae aE @@ -1005,7 +975,7 @@ bP aa ae ao -av +al aq ae aC diff --git a/_maps/map_files/shuttles/emergency_meta.dmm b/_maps/map_files/shuttles/emergency_meta.dmm index 60b96451ecb..c711de199e7 100644 --- a/_maps/map_files/shuttles/emergency_meta.dmm +++ b/_maps/map_files/shuttles/emergency_meta.dmm @@ -138,29 +138,29 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "av" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/escape) "aw" = ( -/obj/structure/chair, /obj/machinery/light{ dir = 1; on = 1 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/escape) "ax" = ( -/obj/structure/chair, /obj/item/radio/intercom{ dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 27 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -239,7 +239,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "aD" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -295,11 +295,11 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "aK" = ( -/obj/structure/chair/office/dark, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/escape) "aL" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor{ @@ -307,10 +307,10 @@ }, /area/shuttle/escape) "aM" = ( -/obj/structure/chair{ +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -377,7 +377,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "aQ" = ( -/obj/structure/chair/office/dark{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -420,10 +420,10 @@ }, /area/shuttle/escape) "aW" = ( -/obj/structure/chair, /obj/machinery/light{ dir = 1 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -482,9 +482,6 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "bd" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/item/radio/intercom{ broadcasting = 0; listening = 1; @@ -492,6 +489,9 @@ pixel_y = -28 }, /obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -581,7 +581,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "bo" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/plating{ @@ -607,7 +607,7 @@ }, /area/shuttle/escape) "bs" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -615,7 +615,7 @@ }, /area/shuttle/escape) "bt" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -693,12 +693,12 @@ }, /area/shuttle/escape) "bE" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/reagent_dispensers/peppertank{ pixel_x = 31 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -762,12 +762,12 @@ }, /area/shuttle/escape) "bI" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light{ dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/plating{ icon_state = "floorgrime" }, @@ -779,18 +779,18 @@ }, /area/shuttle/escape) "bK" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light{ dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/escape) "bL" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ diff --git a/_maps/map_files/shuttles/emergency_mil.dmm b/_maps/map_files/shuttles/emergency_mil.dmm index de4bba7254b..3741f06c673 100644 --- a/_maps/map_files/shuttles/emergency_mil.dmm +++ b/_maps/map_files/shuttles/emergency_mil.dmm @@ -115,25 +115,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "au" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) -"av" = ( -/obj/structure/chair/comfy/teal{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) -"aw" = ( -/obj/structure/chair/comfy/red{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) -"ax" = ( -/obj/structure/chair/comfy/blue{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -142,18 +124,6 @@ /obj/machinery/computer/robotics, /turf/simulated/shuttle/floor, /area/shuttle/escape) -"az" = ( -/obj/structure/chair/comfy/beige{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) -"aA" = ( -/obj/structure/chair/comfy/purp{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) "aB" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall7"; @@ -181,7 +151,7 @@ }, /area/shuttle/escape) "aF" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aG" = ( @@ -193,7 +163,7 @@ icon_state = "tube1"; dir = 1 }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "aH" = ( @@ -335,7 +305,7 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "aX" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor4, @@ -469,32 +439,32 @@ icon_state = "tube1"; dir = 8 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plating, /area/shuttle/escape) "bk" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plating, /area/shuttle/escape) "bl" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plating, /area/shuttle/escape) "bm" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/floor/plating, /area/shuttle/escape) "bn" = ( @@ -503,22 +473,11 @@ icon_state = "tube1"; dir = 8 }, -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plating, /area/shuttle/escape) -"bo" = ( -/obj/machinery/light/spot{ - tag = "icon-tube1 (EAST)"; - icon_state = "tube1"; - dir = 4 - }, -/obj/structure/chair{ - dir = 8 - }, -/turf/simulated/floor/plating, -/area/shuttle/escape) "bp" = ( /obj/machinery/door/airlock/shuttle{ aiControlDisabled = 1; @@ -629,7 +588,7 @@ aa ab af as -az +au af aF aN @@ -732,7 +691,7 @@ aj ac af al -av +au at aC aH @@ -784,7 +743,7 @@ bz ac af an -aw +au at aC aH @@ -810,7 +769,7 @@ by ab af ao -ax +au at af aJ @@ -889,7 +848,7 @@ aa ab af ay -aA +au af aM aT @@ -901,12 +860,12 @@ bm bk bk bk -bo +bm bi aI br bk -bo +bm aC bw "} diff --git a/_maps/map_files/shuttles/emergency_narnar.dmm b/_maps/map_files/shuttles/emergency_narnar.dmm index 8d36106c3da..59111b3eeae 100644 --- a/_maps/map_files/shuttles/emergency_narnar.dmm +++ b/_maps/map_files/shuttles/emergency_narnar.dmm @@ -22,7 +22,7 @@ /turf/simulated/floor/engine/cult, /area/shuttle/escape) "af" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/floor/engine/cult, @@ -35,12 +35,6 @@ /obj/machinery/computer/station_alert, /turf/simulated/floor/engine/cult, /area/shuttle/escape) -"ai" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/simulated/floor/engine/cult, -/area/shuttle/escape) "aj" = ( /turf/simulated/floor/engine/cult, /area/shuttle/escape) @@ -52,21 +46,21 @@ /turf/simulated/floor/engine/cult, /area/shuttle/escape) "al" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = -28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/floor/engine/cult, /area/shuttle/escape) "am" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/floor/engine/cult, /area/shuttle/escape) "an" = ( @@ -74,7 +68,7 @@ /turf/simulated/floor/engine/cult, /area/shuttle/escape) "ao" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/engine/cult, @@ -84,7 +78,7 @@ /turf/simulated/floor/engine/cult, /area/shuttle/escape) "aq" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/engine/cult, @@ -94,14 +88,14 @@ /turf/simulated/floor/engine/cult, /area/shuttle/escape) "as" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Human remains" }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/floor/engine/cult, /area/shuttle/escape) "at" = ( @@ -113,23 +107,23 @@ icon_state = "tube1"; dir = 1 }, -/obj/structure/chair, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Human remains" }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/engine/cult, /area/shuttle/escape) "au" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Human remains" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/floor/engine/cult, /area/shuttle/escape) "av" = ( @@ -148,9 +142,6 @@ /turf/simulated/floor/engine/cult, /area/shuttle/escape) "ax" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = -28 }, @@ -159,6 +150,9 @@ icon_state = "remains"; name = "Human remains" }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/floor/engine/cult, /area/shuttle/escape) "ay" = ( @@ -176,20 +170,17 @@ /turf/simulated/floor/engine/cult, /area/shuttle/escape) "aB" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Human remains" }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/floor/engine/cult, /area/shuttle/escape) "aC" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/item/radio/intercom{ dir = 4; name = "station intercom (General)"; @@ -200,6 +191,9 @@ icon_state = "remains"; name = "Human remains" }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/floor/engine/cult, /area/shuttle/escape) "aD" = ( @@ -559,7 +553,7 @@ bj ab ab ae -ai +af aj aj ab @@ -611,7 +605,7 @@ aa ab ab ag -ai +af aj ap ab diff --git a/_maps/map_files/shuttles/emergency_old.dmm b/_maps/map_files/shuttles/emergency_old.dmm index 823d6f36a4f..6956613e0b8 100644 --- a/_maps/map_files/shuttles/emergency_old.dmm +++ b/_maps/map_files/shuttles/emergency_old.dmm @@ -43,7 +43,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "ai" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -72,12 +72,6 @@ /obj/machinery/computer/station_alert, /turf/simulated/shuttle/floor, /area/shuttle/escape) -"am" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) "an" = ( /turf/simulated/shuttle/floor, /area/shuttle/escape) @@ -89,21 +83,21 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "ap" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = -28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/escape) "aq" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, /turf/simulated/shuttle/floor, /area/shuttle/escape) "ar" = ( @@ -117,7 +111,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "at" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, @@ -127,7 +121,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "av" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -158,7 +152,7 @@ }, /area/shuttle/escape) "aA" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor{ @@ -177,7 +171,7 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "aC" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor{ @@ -192,12 +186,12 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "aE" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = -28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -210,12 +204,12 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "aG" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -266,9 +260,6 @@ }, /area/shuttle/escape) "aL" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/item/radio/intercom{ dir = 8; name = "station intercom (General)"; @@ -279,14 +270,14 @@ icon_state = "tube1"; dir = 8 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/shuttle/escape) "aM" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/closet/walllocker/emerglocker{ pixel_x = 28 }, @@ -295,6 +286,9 @@ icon_state = "tube1"; dir = 4 }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -393,7 +387,7 @@ }, /area/shuttle/escape) "aZ" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "ba" = ( @@ -455,7 +449,7 @@ }, /area/shuttle/escape) "bh" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor4, @@ -633,7 +627,7 @@ bo ab ae ah -am +ai an an aw @@ -685,7 +679,7 @@ aa ad ag aj -am +ai an au aw diff --git a/_maps/map_files/shuttles/ferry_base.dmm b/_maps/map_files/shuttles/ferry_base.dmm index a5e2d5aef05..658633d421a 100644 --- a/_maps/map_files/shuttles/ferry_base.dmm +++ b/_maps/map_files/shuttles/ferry_base.dmm @@ -45,14 +45,14 @@ }, /area/shuttle/transport) "h" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/shuttle/floor, /area/shuttle/transport) "i" = ( @@ -60,16 +60,16 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "j" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/transport) "k" = ( -/obj/structure/chair, /obj/machinery/light/spot{ tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1 }, +/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/transport) "l" = ( @@ -126,16 +126,16 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "s" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, /area/shuttle/transport) "t" = ( -/obj/structure/chair{ +/obj/machinery/light/spot, +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/light/spot, /turf/simulated/shuttle/floor, /area/shuttle/transport) "u" = ( diff --git a/_maps/map_files/shuttles/ferry_meat.dmm b/_maps/map_files/shuttles/ferry_meat.dmm index a4008980d4a..a0935fb04d3 100644 --- a/_maps/map_files/shuttles/ferry_meat.dmm +++ b/_maps/map_files/shuttles/ferry_meat.dmm @@ -47,14 +47,14 @@ }, /area/shuttle/transport) "h" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light/spot{ tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1 }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, @@ -103,7 +103,7 @@ }, /area/shuttle/transport) "n" = ( -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, @@ -114,7 +114,7 @@ icon_state = "tube1"; dir = 1 }, -/obj/structure/chair, +/obj/structure/chair/comfy/shuttle, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, diff --git a/_maps/map_files/templates/medium_shuttle1.dmm b/_maps/map_files/templates/medium_shuttle1.dmm index 109f921ed60..90acb3211a1 100644 --- a/_maps/map_files/templates/medium_shuttle1.dmm +++ b/_maps/map_files/templates/medium_shuttle1.dmm @@ -332,7 +332,7 @@ name = "Shuttle" }) "L" = ( -/obj/structure/chair/comfy/black{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plasteel{ diff --git a/_maps/map_files/templates/medium_shuttle2.dmm b/_maps/map_files/templates/medium_shuttle2.dmm index 4a0e2e5e031..8966fc3ac7a 100644 --- a/_maps/map_files/templates/medium_shuttle2.dmm +++ b/_maps/map_files/templates/medium_shuttle2.dmm @@ -222,9 +222,7 @@ name = "Shuttle" }) "B" = ( -/obj/structure/chair/comfy{ - tag = "icon-comfychair (EAST)"; - icon_state = "comfychair"; +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/floor/plasteel{ diff --git a/_maps/map_files/templates/medium_shuttle3.dmm b/_maps/map_files/templates/medium_shuttle3.dmm index 382a3a3e18d..e87eec1f66b 100644 --- a/_maps/map_files/templates/medium_shuttle3.dmm +++ b/_maps/map_files/templates/medium_shuttle3.dmm @@ -187,9 +187,7 @@ name = "Shuttle" }) "x" = ( -/obj/structure/chair/comfy{ - tag = "icon-comfychair (WEST)"; - icon_state = "comfychair"; +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/floor/plasteel{ diff --git a/_maps/map_files/templates/small_shuttle_1.dmm b/_maps/map_files/templates/small_shuttle_1.dmm index 92066f62880..a1fae43e707 100644 --- a/_maps/map_files/templates/small_shuttle_1.dmm +++ b/_maps/map_files/templates/small_shuttle_1.dmm @@ -59,7 +59,7 @@ }, /area/ruin/powered) "m" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/simulated/shuttle/floor, @@ -88,7 +88,7 @@ /turf/simulated/shuttle/floor, /area/ruin/powered) "r" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 1 }, /turf/simulated/shuttle/floor, @@ -108,7 +108,7 @@ }, /area/ruin/powered) "u" = ( -/obj/structure/chair{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/simulated/shuttle/floor, diff --git a/_maps/test_all_maps.dm b/_maps/test_all_maps.dm index f733f528a24..064bf8defaf 100644 --- a/_maps/test_all_maps.dm +++ b/_maps/test_all_maps.dm @@ -24,12 +24,27 @@ #include "map_files\RandomRuins\LavaRuins\lavaland_surface_blooddrunk1.dmm" #include "map_files\RandomRuins\LavaRuins\lavaland_surface_blooddrunk2.dmm" #include "map_files\RandomRuins\LavaRuins\lavaland_surface_blooddrunk3.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_cube.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_cultaltar.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_dead_ratvar.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_envy.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_fountain_hall.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_gluttony.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_greed.dmm" #include "map_files\RandomRuins\LavaRuins\lavaland_surface_hermit.dmm" #include "map_files\RandomRuins\LavaRuins\lavaland_surface_hierophant.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_pizzaparty.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_pride.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_puzzle.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_random_ripley.dmm" #include "map_files\RandomRuins\LavaRuins\lavaland_surface_seed_vault.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_sloth.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_survivalpod.dmm" #include "map_files\RandomRuins\LavaRuins\lavaland_surface_swarmer_crash.dmm" #include "map_files\RandomRuins\LavaRuins\lavaland_surface_syndicate_base1.dmm" - + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_ufo_crash.dmm" + #include "map_files\RandomRuins\LavaRuins\lavaland_surface_xeno_nest.dmm" + // Space Ruins #include "map_files\RandomRuins\SpaceRuins\abandonedzoo.dmm" diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index a6b346ee1c2..d81ea35e1e9 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -248,7 +248,8 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) // Ventcrawling #define VENT_SOUND_DELAY 30 /obj/machinery/atmospherics/relaymove(mob/living/user, direction) - if(!(direction & initialize_directions)) //can't go in a way we aren't connecting to + direction &= initialize_directions + if(!direction || !(direction in cardinal)) //cant go this way. return if(buckled_mob == user) diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index 5e44dcf20cc..00fddd5b1f0 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -189,7 +189,7 @@ T.to_be_destroyed = 0 T.max_fire_temperature_sustained = 0 -/obj/effect/hotspot/Crossed(mob/living/L) +/obj/effect/hotspot/Crossed(mob/living/L, oldloc) ..() if(isliving(L)) L.fire_act() diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm new file mode 100644 index 00000000000..e28708a81e6 --- /dev/null +++ b/code/__DEFINES/colors.dm @@ -0,0 +1,54 @@ + +#define COLOR_INPUT_DISABLED "#F0F0F0" +#define COLOR_INPUT_ENABLED "#D3B5B5" +#define COLOR_WHITE "#EEEEEE" +#define COLOR_SILVER "#C0C0C0" +#define COLOR_GRAY "#808080" +#define COLOR_FLOORTILE_GRAY "#8D8B8B" +#define COLOR_ALMOST_BLACK "#333333" +#define COLOR_BLACK "#000000" +#define COLOR_RED "#FF0000" +#define COLOR_RED_LIGHT "#FF3333" +#define COLOR_MAROON "#800000" +#define COLOR_YELLOW "#FFFF00" +#define COLOR_OLIVE "#808000" +#define COLOR_LIME "#32CD32" +#define COLOR_GREEN "#008000" +#define COLOR_CYAN "#00FFFF" +#define COLOR_TEAL "#008080" +#define COLOR_BLUE "#0000FF" +#define COLOR_BLUE_LIGHT "#33CCFF" +#define COLOR_NAVY "#000080" +#define COLOR_PINK "#FFC0CB" +#define COLOR_MAGENTA "#FF00FF" +#define COLOR_PURPLE "#800080" +#define COLOR_ORANGE "#FF9900" +#define COLOR_BEIGE "#CEB689" +#define COLOR_BLUE_GRAY "#75A2BB" +#define COLOR_BROWN "#BA9F6D" +#define COLOR_DARK_BROWN "#997C4F" +#define COLOR_DARK_ORANGE "#C3630C" +#define COLOR_GREEN_GRAY "#99BB76" +#define COLOR_RED_GRAY "#B4696A" +#define COLOR_PALE_BLUE_GRAY "#98C5DF" +#define COLOR_PALE_GREEN_GRAY "#B7D993" +#define COLOR_PALE_RED_GRAY "#D59998" +#define COLOR_PALE_PURPLE_GRAY "#CBB1CA" +#define COLOR_PURPLE_GRAY "#AE8CA8" + +//Color defines used by the assembly detailer. +#define COLOR_ASSEMBLY_BLACK "#545454" +#define COLOR_ASSEMBLY_BGRAY "#9497AB" +#define COLOR_ASSEMBLY_WHITE "#E2E2E2" +#define COLOR_ASSEMBLY_RED "#CC4242" +#define COLOR_ASSEMBLY_ORANGE "#E39751" +#define COLOR_ASSEMBLY_BEIGE "#AF9366" +#define COLOR_ASSEMBLY_BROWN "#97670E" +#define COLOR_ASSEMBLY_GOLD "#AA9100" +#define COLOR_ASSEMBLY_YELLOW "#CECA2B" +#define COLOR_ASSEMBLY_GURKHA "#999875" +#define COLOR_ASSEMBLY_LGREEN "#789876" +#define COLOR_ASSEMBLY_GREEN "#44843C" +#define COLOR_ASSEMBLY_LBLUE "#5D99BE" +#define COLOR_ASSEMBLY_BLUE "#38559E" +#define COLOR_ASSEMBLY_PURPLE "#6F6192" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index a8c6b4bd5e8..fbc28695ebf 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -70,6 +70,10 @@ #define ATTACK_EFFECT_MECHFIRE "mech_fire" #define ATTACK_EFFECT_MECHTOXIN "mech_toxin" #define ATTACK_EFFECT_BOOP "boop" //Honk +//NOTE: INTENT_HOTKEY_* defines are not actual intents! +//they are here to support hotkeys +#define INTENT_HOTKEY_LEFT "left" +#define INTENT_HOTKEY_RIGHT "right" //Embedded objects #define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) @@ -82,6 +86,22 @@ #define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) #define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) +// Body Parts +#define BODY_ZONE_HEAD "head" +#define BODY_ZONE_CHEST "chest" +#define BODY_ZONE_L_ARM "l_arm" +#define BODY_ZONE_R_ARM "r_arm" +#define BODY_ZONE_L_LEG "l_leg" +#define BODY_ZONE_R_LEG "r_leg" + +#define BODY_ZONE_PRECISE_EYES "eyes" +#define BODY_ZONE_PRECISE_MOUTH "mouth" +#define BODY_ZONE_PRECISE_GROIN "groin" +#define BODY_ZONE_PRECISE_L_HAND "l_hand" +#define BODY_ZONE_PRECISE_R_HAND "r_hand" +#define BODY_ZONE_PRECISE_L_FOOT "l_foot" +#define BODY_ZONE_PRECISE_R_FOOT "r_foot" + //Gun Stuff #define SAWN_INTACT 0 #define SAWN_OFF 1 diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index f82fc271fbd..14b712754fb 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -1,6 +1,9 @@ #define ALL ~0 //For convenience. #define NONE 0 +// for /datum/var/datum_flags +#define DF_USE_TAG (1<<0) + //FLAGS BITMASK #define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere To successfully stop you taking all pressure damage you must have both a suit and head item with this flag. #define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted. diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index a3efbab50d9..308e7a5f6d9 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -6,6 +6,7 @@ #define TARGET_INVALID_UNREACHABLE 5 #define TARGET_INVALID_GOLEM 6 #define TARGET_INVALID_EVENT 7 +#define TARGET_INVALID_IS_TARGET 8 //gamemode istype helpers #define GAMEMODE_IS_BLOB (SSticker && istype(SSticker.mode, /datum/game_mode/blob)) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 45953a2e47b..4a1e4f20f98 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -55,6 +55,7 @@ #define DATA_HUD_ABDUCTOR 18 #define ANTAG_HUD_DEVIL 19 #define ANTAG_HUD_EVENTMISC 20 +#define ANTAG_HUD_BLOB 21 // Notification action types #define NOTIFY_JUMP "jump" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 3418938d955..9b72483001c 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -57,17 +57,6 @@ #define MAX_STACK_AMOUNT_GLASS 50 #define MAX_STACK_AMOUNT_RODS 60 -//some colors -#define COLOR_RED "#FF0000" -#define COLOR_GREEN "#00FF00" -#define COLOR_BLUE "#0000FF" -#define COLOR_CYAN "#00FFFF" -#define COLOR_PINK "#FF00FF" -#define COLOR_YELLOW "#FFFF00" -#define COLOR_ORANGE "#FF9900" -#define COLOR_WHITE "#FFFFFF" -#define COLOR_GRAY "#808080" - //FONTS: // Used by Paper and PhotoCopier (and PaperBin once a year). // Used by PDA's Notekeeper. @@ -326,7 +315,7 @@ #define INVESTIGATE_BOMB "bombs" // The SQL version required by this version of the code -#define SQL_VERSION 6 +#define SQL_VERSION 8 // Vending machine stuff #define CAT_NORMAL 1 @@ -404,4 +393,8 @@ #define SENSOR_COORDS 3 // Cult summon possibilities -#define SUMMON_POSSIBILITIES 3 \ No newline at end of file +#define SUMMON_POSSIBILITIES 3 + +#define DICE_NOT_RIGGED 1 +#define DICE_BASICALLY_RIGGED 2 +#define DICE_TOTALLY_RIGGED 3 \ No newline at end of file diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 22b4334e3be..9582fddccfe 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -16,6 +16,7 @@ #define CHAT_GHOSTSIGHT 8 #define CHAT_PRAYER 16 #define CHAT_RADIO 32 +#define AZERTY 64 #define CHAT_DEBUGLOGS 128 #define CHAT_LOOC 256 #define CHAT_GHOSTRADIO 512 @@ -31,10 +32,12 @@ #define CHAT_NO_MENTORTICKETLOGS 524288 #define TYPING_ONCE 1048576 #define AMBIENT_OCCLUSION 2097152 +#define CHAT_GHOSTPDA 4194304 +#define NUMPAD_TARGET 8388608 +#define TOGGLES_TOTAL 16777215 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined. -#define TOGGLES_TOTAL 4194303 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined. -#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC|AMBIENT_OCCLUSION) +#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC|AMBIENT_OCCLUSION|CHAT_GHOSTPDA|NUMPAD_TARGET) // Admin attack logs filter system, see /proc/add_attack_logs and /proc/msg_admin_attack #define ATKLOG_ALL 0 diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 6b5807deaef..9e01753d492 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -353,12 +353,12 @@ var/middle = L.len / 2 + 1 // Copy is first,second-1 return mergeLists(sortList(L.Copy(0,middle)), sortList(L.Copy(middle))) //second parameter null = to end of list -//Mergsorge: uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead +//Mergsorge: uses sortAssoc() but uses the var's name specifically. This should probably be using mergeAtom() instead /proc/sortNames(var/list/L) var/list/Q = new() for(var/atom/x in L) Q[x.name] = x - return sortList(Q) + return sortAssoc(Q) /proc/mergeLists(var/list/L, var/list/R) var/Li=1 diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index 607ba3495d3..d419e925759 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -43,7 +43,7 @@ . = "e[.]" //like clients, which do have gender. -/client/proc/p_they(capitalized, temp_gender) +/client/p_they(capitalized, temp_gender) if(!temp_gender) temp_gender = gender . = "they" @@ -55,7 +55,7 @@ if(capitalized) . = capitalize(.) -/client/proc/p_their(capitalized, temp_gender) +/client/p_their(capitalized, temp_gender) if(!temp_gender) temp_gender = gender . = "their" @@ -67,7 +67,7 @@ if(capitalized) . = capitalize(.) -/client/proc/p_them(capitalized, temp_gender) +/client/p_them(capitalized, temp_gender) if(!temp_gender) temp_gender = gender . = "them" @@ -79,35 +79,35 @@ if(capitalized) . = capitalize(.) -/client/proc/p_have(temp_gender) +/client/p_have(temp_gender) if(!temp_gender) temp_gender = gender . = "has" if(temp_gender == PLURAL || temp_gender == NEUTER) . = "have" -/client/proc/p_are(temp_gender) +/client/p_are(temp_gender) if(!temp_gender) temp_gender = gender . = "is" if(temp_gender == PLURAL || temp_gender == NEUTER) . = "are" -/client/proc/p_were(temp_gender) +/client/p_were(temp_gender) if(!temp_gender) temp_gender = gender . = "was" if(temp_gender == PLURAL || temp_gender == NEUTER) . = "were" -/client/proc/p_do(temp_gender) +/client/p_do(temp_gender) if(!temp_gender) temp_gender = gender . = "does" if(temp_gender == PLURAL || temp_gender == NEUTER) . = "do" -/client/proc/p_s(temp_gender) +/client/p_s(temp_gender) if(!temp_gender) temp_gender = gender if(temp_gender != PLURAL && temp_gender != NEUTER) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index f90a9c4e5ad..ae7704459b5 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -157,6 +157,17 @@ if(degree < 315) return WEST return NORTH|WEST +/proc/angle2dir_cardinal(angle) + switch(round(angle, 0.1)) + if(315.5 to 360, 0 to 45.5) + return NORTH + if(45.6 to 135.5) + return EAST + if(135.6 to 225.5) + return SOUTH + if(225.6 to 315.5) + return WEST + //returns the north-zero clockwise angle in degrees, given a direction /proc/dir2angle(var/D) diff --git a/code/__HELPERS/unique_ids.dm b/code/__HELPERS/unique_ids.dm index 1e9c699dcb9..a66de0b5a88 100644 --- a/code/__HELPERS/unique_ids.dm +++ b/code/__HELPERS/unique_ids.dm @@ -16,7 +16,7 @@ var/global/next_unique_datum_id = 1 -/client/var/tmp/unique_datum_id = null +// /client/var/tmp/unique_datum_id = null /datum/proc/UID() if(!unique_datum_id) @@ -26,12 +26,6 @@ var/global/next_unique_datum_id = 1 tag = tag_backup return unique_datum_id -/client/proc/UID() - if(!unique_datum_id) - unique_datum_id = "\ref[src]_[next_unique_datum_id++]" - return unique_datum_id - - /proc/locateUID(uid) if(!istext(uid)) return null diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index f7c5b670dc8..10759fe336a 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1,2065 +1,2065 @@ -/* - * A large number of misc global procs. - */ - - /* Get the direction of startObj relative to endObj. - * Return values: To the right, 1. Below, 2. To the left, 3. Above, 4. Not found adjacent in cardinal directions, 0. - */ -/proc/getRelativeDirection(var/atom/movable/startObj, var/atom/movable/endObj) - if(endObj.x == startObj.x + 1 && endObj.y == startObj.y) - return EAST - - if(endObj.x == startObj.x - 1 && endObj.y == startObj.y) - return WEST - - if(endObj.y == startObj.y + 1 && endObj.x == startObj.x) - return NORTH - - if(endObj.y == startObj.y - 1 && endObj.x == startObj.x) - return SOUTH - - return 0 - -//Inverts the colour of an HTML string -/proc/invertHTML(HTMLstring) - - if(!( istext(HTMLstring) )) - CRASH("Given non-text argument!") - return - else - if(length(HTMLstring) != 7) - CRASH("Given non-HTML argument!") - return - var/textr = copytext(HTMLstring, 2, 4) - var/textg = copytext(HTMLstring, 4, 6) - var/textb = copytext(HTMLstring, 6, 8) - var/r = hex2num(textr) - var/g = hex2num(textg) - var/b = hex2num(textb) - textr = num2hex(255 - r) - textg = num2hex(255 - g) - textb = num2hex(255 - b) - if(length(textr) < 2) - textr = text("0[]", textr) - if(length(textg) < 2) - textr = text("0[]", textg) - if(length(textb) < 2) - textr = text("0[]", textb) - return text("#[][][]", textr, textg, textb) - return - -//Returns the middle-most value -/proc/dd_range(var/low, var/high, var/num) - return max(low,min(high,num)) - -//Returns whether or not A is the middle most value -/proc/InRange(var/A, var/lower, var/upper) - if(A < lower) return 0 - if(A > upper) return 0 - return 1 - - -/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. - if(!start || !end) return 0 - var/dy - var/dx - dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) - dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) - if(!dy) - return (dx>=0)?90:270 - .=arctan(dx/dy) - if(dy<0) - .+=180 - else if(dx<0) - .+=360 - -//Returns location. Returns null if no location was found. -/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = 0, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) -/* -Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no). -Random error in tile placement x, error in tile placement y, and block offset. -Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc. -Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive. -Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something. -*/ - - var/dirx = 0//Generic location finding variable. - var/diry = 0 - - var/xoffset = 0//Generic counter for offset location. - var/yoffset = 0 - - var/b1xerror = 0//Generic placing for point A in box. The lower left. - var/b1yerror = 0 - var/b2xerror = 0//Generic placing for point B in box. The upper right. - var/b2yerror = 0 - - errorx = abs(errorx)//Error should never be negative. - errory = abs(errory) - //var/errorxy = round((errorx+errory)/2)//Used for diagonal boxes. - - switch(target.dir)//This can be done through equations but switch is the simpler method. And works fast to boot. - //Directs on what values need modifying. - if(1)//North - diry+=distance - yoffset+=eoffsety - xoffset+=eoffsetx - b1xerror-=errorx - b1yerror-=errory - b2xerror+=errorx - b2yerror+=errory - if(2)//South - diry-=distance - yoffset-=eoffsety - xoffset+=eoffsetx - b1xerror-=errorx - b1yerror-=errory - b2xerror+=errorx - b2yerror+=errory - if(4)//East - dirx+=distance - yoffset+=eoffsetx//Flipped. - xoffset+=eoffsety - b1xerror-=errory//Flipped. - b1yerror-=errorx - b2xerror+=errory - b2yerror+=errorx - if(8)//West - dirx-=distance - yoffset-=eoffsetx//Flipped. - xoffset+=eoffsety - b1xerror-=errory//Flipped. - b1yerror-=errorx - b2xerror+=errory - b2yerror+=errorx - - var/turf/destination=locate(location.x+dirx,location.y+diry,location.z) - - if(destination)//If there is a destination. - if(errorx||errory)//If errorx or y were specified. - var/destination_list[] = list()//To add turfs to list. - //destination_list = new() - /*This will draw a block around the target turf, given what the error is. - Specifying the values above will basically draw a different sort of block. - If the values are the same, it will be a square. If they are different, it will be a rectengle. - In either case, it will center based on offset. Offset is position from center. - Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport, - the offset should remain positioned in relation to destination.*/ - - var/turf/center = locate((destination.x+xoffset),(destination.y+yoffset),location.z)//So now, find the new center. - - //Now to find a box from center location and make that our destination. - for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z) )) - if(density&&T.density) continue//If density was specified. - if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map. - if(T.y>world.maxy || T.y<1) continue - destination_list += T - if(destination_list.len) - destination = pick(destination_list) - else return - - else//Same deal here. - if(density&&destination.density) return - if(destination.x>world.maxx || destination.x<1) return - if(destination.y>world.maxy || destination.y<1) return - else return - - return destination - -// Returns true if direction is blocked from loc -// Checks if doors are open -/proc/DirBlocked(turf/loc,var/dir) - for(var/obj/structure/window/D in loc) - if(!D.density) - continue - if(D.fulltile) - return 1 - if(D.dir == dir) - return 1 - - for(var/obj/machinery/door/D in loc) - if(!D.density)//if the door is open - continue - else return 1 // if closed, it's a real, air blocking door - return 0 - -///////////////////////////////////////////////////////////////////////// - -/proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm - var/px=M.x //starting x - var/py=M.y - var/line[] = list(locate(px,py,M.z)) - var/dx=N.x-px //x distance - var/dy=N.y-py - var/dxabs=abs(dx)//Absolute value of x distance - var/dyabs=abs(dy) - var/sdx=SIGN(dx) //Sign of x distance (+ or -) - var/sdy=SIGN(dy) - var/x=dxabs>>1 //Counters for steps taken, setting to distance/2 - var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast. - var/j //Generic integer for counting - if(dxabs>=dyabs) //x distance is greater than y - for(j=0;j=dxabs) //Every dyabs steps, step once in y direction - y-=dxabs - py+=sdy - px+=sdx //Step on in x direction - line+=locate(px,py,M.z)//Add the turf to the list - else - for(j=0;j=dyabs) - x-=dyabs - px+=sdx - py+=sdy - line+=locate(px,py,M.z) - return line - -//Same as the thing below just for density and without support for atoms. -/proc/can_line(atom/source, atom/target, length = 5) - var/turf/current = get_turf(source) - var/turf/target_turf = get_turf(target) - var/steps = 0 - - while(current != target_turf) - if(steps > length) - return FALSE - if(!current) - return FALSE - if(current.density) - return FALSE - current = get_step_towards(current, target_turf) - steps++ - return TRUE - -//Returns whether or not a player is a guest using their ckey as an input -/proc/IsGuestKey(key) - if(findtext(key, "Guest-", 1, 7) != 1) //was findtextEx - return 0 - - var/i, ch, len = length(key) - - for(i = 7, i <= len, ++i) - ch = text2ascii(key, i) - if(ch < 48 || ch > 57) - return 0 - return 1 - -//Ensure the frequency is within bounds of what it should be sending/recieving at -/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ) - f = round(f) - f = max(low, f) - f = min(high, f) - if((f % 2) == 0) //Ensure the last digit is an odd number - f += 1 - return f - -//Turns 1479 into 147.9 -/proc/format_frequency(var/f) - return "[round(f / 10)].[f % 10]" - -/obj/proc/atmosanalyzer_scan(var/datum/gas_mixture/air_contents, mob/user, var/obj/target = src) - var/obj/icon = target - user.visible_message("[user] has used the analyzer on [target].", "You use the analyzer on [target].") - var/pressure = air_contents.return_pressure() - var/total_moles = air_contents.total_moles() - - user.show_message("Results of analysis of [bicon(icon)] [target].", 1) - if(total_moles>0) - var/o2_concentration = air_contents.oxygen/total_moles - var/n2_concentration = air_contents.nitrogen/total_moles - var/co2_concentration = air_contents.carbon_dioxide/total_moles - var/plasma_concentration = air_contents.toxins/total_moles - - var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) - - user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) - user.show_message("Nitrogen: [round(n2_concentration*100)] % ([round(air_contents.nitrogen,0.01)] moles)", 1) - user.show_message("Oxygen: [round(o2_concentration*100)] % ([round(air_contents.oxygen,0.01)] moles)", 1) - user.show_message("CO2: [round(co2_concentration*100)] % ([round(air_contents.carbon_dioxide,0.01)] moles)", 1) - user.show_message("Plasma: [round(plasma_concentration*100)] % ([round(air_contents.toxins,0.01)] moles)", 1) - if(unknown_concentration>0.01) - user.show_message("Unknown: [round(unknown_concentration*100)] % ([round(unknown_concentration*total_moles,0.01)] moles)", 1) - user.show_message("Total: [round(total_moles,0.01)] moles", 1) - user.show_message("Temperature: [round(air_contents.temperature-T0C)] °C", 1) - else - user.show_message("[target] is empty!", 1) - return - -//Picks a string of symbols to display as the law number for hacked or ion laws -/proc/ionnum() - return "[pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" - -//When an AI is activated, it can choose from a list of non-slaved borgs to have as a slave. -/proc/freeborg() - var/select = null - var/list/borgs = list() - for(var/mob/living/silicon/robot/A in GLOB.player_list) - if(A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone)) - continue - var/name = "[A.real_name] ([A.modtype] [A.braintype])" - borgs[name] = A - - if(borgs.len) - select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs - return borgs[select] - -//When a borg is activated, it can choose which AI it wants to be slaved to -/proc/active_ais() - . = list() - for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) - if(A.stat == DEAD) - continue - if(A.control_disabled == 1) - continue - . += A - return . - -//Find an active ai with the least borgs. VERBOSE PROCNAME HUH! -/proc/select_active_ai_with_fewest_borgs() - var/mob/living/silicon/ai/selected - var/list/active = active_ais() - for(var/mob/living/silicon/ai/A in active) - if(!selected || (selected.connected_robots > A.connected_robots)) - selected = A - - return selected - -/proc/select_active_ai(var/mob/user) - var/list/ais = active_ais() - if(ais.len) - if(user) . = input(usr,"AI signals detected:", "AI selection") in ais - else . = pick(ais) - return . - -/proc/get_sorted_mobs() - var/list/old_list = getmobs() - var/list/AI_list = list() - var/list/Dead_list = list() - var/list/keyclient_list = list() - var/list/key_list = list() - var/list/logged_list = list() - for(var/named in old_list) - var/mob/M = old_list[named] - if(issilicon(M)) - AI_list |= M - else if(isobserver(M) || M.stat == DEAD) - Dead_list |= M - else if(M.key && M.client) - keyclient_list |= M - else if(M.key) - key_list |= M - else - logged_list |= M - old_list.Remove(named) - var/list/new_list = list() - new_list += AI_list - new_list += keyclient_list - new_list += key_list - new_list += logged_list - new_list += Dead_list - return new_list - -//Returns a list of all mobs with their name -/proc/getmobs() - - var/list/mobs = sortmobs() - var/list/names = list() - var/list/creatures = list() - var/list/namecounts = list() - for(var/mob/M in mobs) - var/name = M.name - if(name in names) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - if(M.real_name && M.real_name != M.name) - name += " \[[M.real_name]\]" - if(M.stat == DEAD) - if(istype(M, /mob/dead/observer/)) - name += " \[ghost\]" - else - name += " \[dead\]" - creatures[name] = M - - return creatures - -//Orders mobs by type then by name -/proc/sortmobs() - var/list/moblist = list() - var/list/sortmob = sortAtom(GLOB.mob_list) - for(var/mob/living/silicon/ai/M in sortmob) - moblist.Add(M) - if(M.eyeobj) - moblist.Add(M.eyeobj) - for(var/mob/living/silicon/pai/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/robot/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/human/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/brain/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/alien/M in sortmob) - moblist.Add(M) - for(var/mob/dead/observer/M in sortmob) - moblist.Add(M) - for(var/mob/new_player/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/slime/M in sortmob) - moblist.Add(M) - for(var/mob/living/simple_animal/M in sortmob) - moblist.Add(M) - return moblist - -// Format a power value in W, kW, MW, or GW. -/proc/DisplayPower(powerused) - if(powerused < 1000) //Less than a kW - return "[powerused] W" - else if(powerused < 1000000) //Less than a MW - return "[round((powerused * 0.001), 0.01)] kW" - else if(powerused < 1000000000) //Less than a GW - return "[round((powerused * 0.000001), 0.001)] MW" - return "[round((powerused * 0.000000001), 0.0001)] GW" - -//E = MC^2 -/proc/convert2energy(var/M) - var/E = M*(SPEED_OF_LIGHT_SQ) - return E - -//M = E/C^2 -/proc/convert2mass(var/E) - var/M = E/(SPEED_OF_LIGHT_SQ) - return M - -//Forces a variable to be posative -/proc/modulus(var/M) - if(M >= 0) - return M - if(M < 0) - return -M - -/proc/get_mob_by_ckey(key) - if(!key) - return - for(var/mob/M in GLOB.mob_list) - if(M.ckey == key) - return M - -// Returns the atom sitting on the turf. -// For example, using this on a disk, which is in a bag, on a mob, will return the mob because it's on the turf. -/proc/get_atom_on_turf(var/atom/movable/M) - var/atom/loc = M - while(loc && loc.loc && !istype(loc.loc, /turf/)) - loc = loc.loc - return loc - -/* -Returns 1 if the chain up to the area contains the given typepath -0 otherwise -*/ -/atom/proc/is_found_within(var/typepath) - var/atom/A = src - while(A.loc) - if(istype(A.loc, typepath)) - return 1 - A = A.loc - return 0 - -// the on-close client verb -// called when a browser popup window is closed after registering with proc/onclose() -// if a valid atom reference is supplied, call the atom's Topic() with "close=1" -// otherwise, just reset the client mob's machine var. - - -// returns the turf located at the map edge in the specified direction relative to A -// used for mass driver -/proc/get_edge_target_turf(var/atom/A, var/direction) - - var/turf/target = locate(A.x, A.y, A.z) - if(!A || !target) - return 0 - //since NORTHEAST == NORTH & EAST, etc, doing it this way allows for diagonal mass drivers in the future - //and isn't really any more complicated - - // Note diagonal directions won't usually be accurate - if(direction & NORTH) - target = locate(target.x, world.maxy, target.z) - if(direction & SOUTH) - target = locate(target.x, 1, target.z) - if(direction & EAST) - target = locate(world.maxx, target.y, target.z) - if(direction & WEST) - target = locate(1, target.y, target.z) - - return target - -// returns turf relative to A in given direction at set range -// result is bounded to map size -// note range is non-pythagorean -// used for disposal system -/proc/get_ranged_target_turf(var/atom/A, var/direction, var/range) - - var/x = A.x - var/y = A.y - if(direction & NORTH) - y = min(world.maxy, y + range) - if(direction & SOUTH) - y = max(1, y - range) - if(direction & EAST) - x = min(world.maxx, x + range) - if(direction & WEST) - x = max(1, x - range) - - return locate(x,y,A.z) - - -// returns turf relative to A offset in dx and dy tiles -// bound to map limits -/proc/get_offset_target_turf(var/atom/A, var/dx, var/dy) - var/x = min(world.maxx, max(1, A.x + dx)) - var/y = min(world.maxy, max(1, A.y + dy)) - return locate(x,y,A.z) - -//Makes sure MIDDLE is between LOW and HIGH. If not, it adjusts it. Returns the adjusted value. -/proc/between(var/low, var/middle, var/high) - return max(min(middle, high), low) - -proc/arctan(x) - var/y=arcsin(x/sqrt(1+x*x)) - return y - -//returns random gauss number -proc/GaussRand(var/sigma) - var/x,y,rsq - do - x=2*rand()-1 - y=2*rand()-1 - rsq=x*x+y*y - while(rsq>1 || !rsq) - return sigma*y*sqrt(-2*log(rsq)/rsq) - -//returns random gauss number, rounded to 'roundto' -proc/GaussRandRound(var/sigma,var/roundto) - return round(GaussRand(sigma),roundto) - -//Will return the contents of an atom recursivly to a depth of 'searchDepth' -/atom/proc/GetAllContents(searchDepth = 5) - var/list/toReturn = list() - - for(var/atom/part in contents) - toReturn += part - if(part.contents.len && searchDepth) - toReturn += part.GetAllContents(searchDepth - 1) - - return toReturn - -//Searches contents of the atom and returns the sum of all w_class of obj/item within -/atom/proc/GetTotalContentsWeight(searchDepth = 5) - var/weight = 0 - var/list/content = GetAllContents(searchDepth) - for(var/obj/item/I in content) - weight += I.w_class - return weight - -//Step-towards method of determining whether one atom can see another. Similar to viewers() -/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate. - var/turf/current = get_turf(source) - var/turf/target_turf = get_turf(target) - var/steps = 1 - - if(current != target_turf) - current = get_step_towards(current, target_turf) - while(current != target_turf) - if(steps > length) - return 0 - if(current.opacity) - return 0 - for(var/thing in current) - var/atom/A = thing - if(A.opacity) - return 0 - current = get_step_towards(current, target_turf) - steps++ - - return 1 - -proc/is_blocked_turf(turf/T, exclude_mobs) - if(T.density) - return 1 - for(var/i in T) - var/atom/A = i - if(A.density && (!exclude_mobs || !ismob(A))) - return 1 - return 0 - -/proc/get_step_towards2(var/atom/ref , var/atom/trg) - var/base_dir = get_dir(ref, get_step_towards(ref,trg)) - var/turf/temp = get_step_towards(ref,trg) - - if(is_blocked_turf(temp)) - var/dir_alt1 = turn(base_dir, 90) - var/dir_alt2 = turn(base_dir, -90) - var/turf/turf_last1 = temp - var/turf/turf_last2 = temp - var/free_tile = null - var/breakpoint = 0 - - while(!free_tile && breakpoint < 10) - if(!is_blocked_turf(turf_last1)) - free_tile = turf_last1 - break - if(!is_blocked_turf(turf_last2)) - free_tile = turf_last2 - break - turf_last1 = get_step(turf_last1,dir_alt1) - turf_last2 = get_step(turf_last2,dir_alt2) - breakpoint++ - - if(!free_tile) return get_step(ref, base_dir) - else return get_step_towards(ref,free_tile) - - else return get_step(ref, base_dir) - -//Takes: Anything that could possibly have variables and a varname to check. -//Returns: 1 if found, 0 if not. -/proc/hasvar(var/datum/A, var/varname) - if(A.vars.Find(lowertext(varname))) return 1 - else return 0 - -//Returns: all the areas in the world -/proc/return_areas() - var/list/area/areas = list() - for(var/area/A in world) - areas += A - return areas - -//Returns: all the areas in the world, sorted. -/proc/return_sorted_areas() - return sortAtom(return_areas()) - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all areas of that type in the world. -/proc/get_areas(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/areas = new/list() - for(var/area/N in world) - if(istype(N, areatype)) areas += N - return areas - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all turfs in areas of that type of that type in the world. -/proc/get_area_turfs(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/turfs = new/list() - for(var/area/N in world) - if(istype(N, areatype)) - for(var/turf/T in N) turfs += T - return turfs - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world. -/proc/get_area_all_atoms(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/atoms = new/list() - for(var/area/N in world) - if(istype(N, areatype)) - for(var/atom/A in N) - atoms += A - return atoms - -/datum/coords //Simple datum for storing coordinates. - var/x_pos = null - var/y_pos = null - var/z_pos = null - -/area/proc/move_contents_to(var/area/A, var/turftoleave=null, var/direction = null) - //Takes: Area. Optional: turf type to leave behind. - //Returns: Nothing. - //Notes: Attempts to move the contents of one area to another area. - // Movement based on lower left corner. Tiles that do not fit - // into the new area will not be moved. - - if(!A || !src) return 0 - - var/list/turfs_src = get_area_turfs(src.type) - var/list/turfs_trg = get_area_turfs(A.type) - - var/src_min_x = 0 - var/src_min_y = 0 - for(var/turf/T in turfs_src) - if(T.x < src_min_x || !src_min_x) src_min_x = T.x - if(T.y < src_min_y || !src_min_y) src_min_y = T.y - - var/trg_min_x = 0 - var/trg_min_y = 0 - for(var/turf/T in turfs_trg) - if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x - if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y - - var/list/refined_src = new/list() - for(var/turf/T in turfs_src) - refined_src += T - refined_src[T] = new/datum/coords - var/datum/coords/C = refined_src[T] - C.x_pos = (T.x - src_min_x) - C.y_pos = (T.y - src_min_y) - - var/list/refined_trg = new/list() - for(var/turf/T in turfs_trg) - refined_trg += T - refined_trg[T] = new/datum/coords - var/datum/coords/C = refined_trg[T] - C.x_pos = (T.x - trg_min_x) - C.y_pos = (T.y - trg_min_y) - - var/list/fromupdate = new/list() - var/list/toupdate = new/list() - - moving: - for(var/turf/T in refined_src) - var/datum/coords/C_src = refined_src[T] - for(var/turf/B in refined_trg) - var/datum/coords/C_trg = refined_trg[B] - if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) - - var/old_dir1 = T.dir - var/old_icon_state1 = T.icon_state - var/old_icon1 = T.icon - - var/turf/X = B.ChangeTurf(T.type) - X.dir = old_dir1 - X.icon_state = old_icon_state1 - X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi - - // Give the new turf our air, if simulated - if(istype(X, /turf/simulated) && istype(T, /turf/simulated)) - var/turf/simulated/sim = X - sim.copy_air_with_tile(T) - - - /* Quick visual fix for some weird shuttle corner artefacts when on transit space tiles */ - if(direction && findtext(X.icon_state, "swall_s")) - - // Spawn a new shuttle corner object - var/obj/corner = new() - corner.loc = X - corner.density = 1 - corner.anchored = 1 - corner.icon = X.icon - corner.icon_state = replacetext(X.icon_state, "_s", "_f") - corner.tag = "delete me" - corner.name = "wall" - - // Find a new turf to take on the property of - var/turf/nextturf = get_step(corner, direction) - if(!nextturf || !istype(nextturf, /turf/space)) - nextturf = get_step(corner, turn(direction, 180)) - - - // Take on the icon of a neighboring scrolling space icon - X.icon = nextturf.icon - X.icon_state = nextturf.icon_state - - - for(var/obj/O in T) - - // Reset the shuttle corners - if(O.tag == "delete me") - X.icon = 'icons/turf/shuttle.dmi' - X.icon_state = replacetext(O.icon_state, "_f", "_s") // revert the turf to the old icon_state - X.name = "wall" - qdel(O) // prevents multiple shuttle corners from stacking - continue - if(!istype(O,/obj)) continue - O.loc.Exited(O) - O.setLoc(X,teleported=1) - O.loc.Entered(O) - for(var/mob/M in T) - if(!M.move_on_shuttle) - continue - M.loc = X - -// var/area/AR = X.loc - -// if(AR.lighting_use_dynamic) //TODO: rewrite this code so it's not messed by lighting ~Carn -// X.opacity = !X.opacity -// X.set_opacity(!X.opacity) - - toupdate += X - - if(turftoleave) - fromupdate += T.ChangeTurf(turftoleave) - else - T.ChangeTurf(T.baseturf) - - refined_src -= T - refined_trg -= B - continue moving - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - SSair.remove_from_active(T1) - T1.CalculateAdjacentTurfs() - SSair.add_to_active(T1,1) - - if(fromupdate.len) - for(var/turf/simulated/T2 in fromupdate) - SSair.remove_from_active(T2) - T2.CalculateAdjacentTurfs() - SSair.add_to_active(T2,1) - - - - -/proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0, var/atom/newloc = null) - if(!original) - return null - - var/obj/O = null - - if(sameloc) - O=new original.type(original.loc) - else - O=new original.type(newloc) - - if(perfectcopy) - if((O) && (original)) - var/static/list/forbidden_vars = list("type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group") - - for(var/V in original.vars - forbidden_vars) - if(istype(original.vars[V],/list)) - var/list/L = original.vars[V] - O.vars[V] = L.Copy() - else if(istype(original.vars[V],/datum)) - continue // this would reference the original's object, that will break when it is used or deleted. - else - O.vars[V] = original.vars[V] - if(istype(O)) - O.update_icon() - return O - -/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0 ) - //Takes: Area. Optional: If it should copy to areas that don't have plating - //Returns: Nothing. - //Notes: Attempts to move the contents of one area to another area. - // Movement based on lower left corner. Tiles that do not fit - // into the new area will not be moved. - - if(!A || !src) return 0 - - var/list/turfs_src = get_area_turfs(src.type) - var/list/turfs_trg = get_area_turfs(A.type) - - var/src_min_x = 0 - var/src_min_y = 0 - for(var/turf/T in turfs_src) - if(T.x < src_min_x || !src_min_x) src_min_x = T.x - if(T.y < src_min_y || !src_min_y) src_min_y = T.y - - var/trg_min_x = 0 - var/trg_min_y = 0 - for(var/turf/T in turfs_trg) - if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x - if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y - - var/list/refined_src = new/list() - for(var/turf/T in turfs_src) - refined_src += T - refined_src[T] = new/datum/coords - var/datum/coords/C = refined_src[T] - C.x_pos = (T.x - src_min_x) - C.y_pos = (T.y - src_min_y) - - var/list/refined_trg = new/list() - for(var/turf/T in turfs_trg) - refined_trg += T - refined_trg[T] = new/datum/coords - var/datum/coords/C = refined_trg[T] - C.x_pos = (T.x - trg_min_x) - C.y_pos = (T.y - trg_min_y) - - var/list/toupdate = new/list() - - var/copiedobjs = list() - - - moving: - for(var/turf/T in refined_src) - var/datum/coords/C_src = refined_src[T] - for(var/turf/B in refined_trg) - var/datum/coords/C_trg = refined_trg[B] - if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) - - var/old_dir1 = T.dir - var/old_icon_state1 = T.icon_state - var/old_icon1 = T.icon - - if(platingRequired) - if(istype(B, /turf/space)) - continue moving - - var/turf/X = new T.type(B) - X.dir = old_dir1 - X.icon_state = old_icon_state1 - X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi - - - var/list/objs = new/list() - var/list/newobjs = new/list() - var/list/mobs = new/list() - var/list/newmobs = new/list() - - for(var/obj/O in T) - - if(!istype(O,/obj)) - continue - - objs += O - - - for(var/obj/O in objs) - newobjs += DuplicateObject(O , 1) - - - for(var/obj/O in newobjs) - O.loc = X - - for(var/mob/M in T) - - if(!M.move_on_shuttle) - continue - mobs += M - - for(var/mob/M in mobs) - newmobs += DuplicateObject(M , 1) - - for(var/mob/M in newmobs) - M.loc = X - - copiedobjs += newobjs - copiedobjs += newmobs - - - - for(var/V in T.vars) - if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity", "group"))) - X.vars[V] = T.vars[V] - -// var/area/AR = X.loc - -// if(AR.lighting_use_dynamic) -// X.opacity = !X.opacity -// X.sd_set_opacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn - - toupdate += X - - refined_src -= T - refined_trg -= B - continue moving - - - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - T1.CalculateAdjacentTurfs() - SSair.add_to_active(T1,1) - - - return copiedobjs - - - -proc/get_cardinal_dir(atom/A, atom/B) - var/dx = abs(B.x - A.x) - var/dy = abs(B.y - A.y) - return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) - -//chances are 1:value. anyprob(1) will always return true -proc/anyprob(value) - return (rand(1,value)==value) - -proc/view_or_range(distance = world.view , center = usr , type) - switch(type) - if("view") - . = view(distance,center) - if("range") - . = range(distance,center) - return - -proc/oview_or_orange(distance = world.view , center = usr , type) - switch(type) - if("view") - . = oview(distance,center) - if("range") - . = orange(distance,center) - return - -proc/get_mob_with_client_list() - var/list/mobs = list() - for(var/mob/M in GLOB.mob_list) - if(M.client) - mobs += M - return mobs - - -/proc/parse_zone(zone) - if(zone == "r_hand") return "right hand" - else if(zone == "l_hand") return "left hand" - else if(zone == "l_arm") return "left arm" - else if(zone == "r_arm") return "right arm" - else if(zone == "l_leg") return "left leg" - else if(zone == "r_leg") return "right leg" - else if(zone == "l_foot") return "left foot" - else if(zone == "r_foot") return "right foot" - else if(zone == "l_hand") return "left hand" - else if(zone == "r_hand") return "right hand" - else if(zone == "l_foot") return "left foot" - else if(zone == "r_foot") return "right foot" - else return zone - -/* - - Gets the turf this atom's *ICON* appears to inhabit - It takes into account: - * Pixel_x/y - * Matrix x/y - - NOTE: if your atom has non-standard bounds then this proc - will handle it, but: - * if the bounds are even, then there are an even amount of "middle" turfs, the one to the EAST, NORTH, or BOTH is picked - (this may seem bad, but you're atleast as close to the center of the atom as possible, better than byond's default loc being all the way off) - * if the bounds are odd, the true middle turf of the atom is returned - -*/ - -/proc/get_turf_pixel(atom/movable/AM) - if(!istype(AM)) - return - - //Find AM's matrix so we can use it's X/Y pixel shifts - var/matrix/M = matrix(AM.transform) - - var/pixel_x_offset = AM.pixel_x + M.get_x_shift() - var/pixel_y_offset = AM.pixel_y + M.get_y_shift() - - //Irregular objects - if(AM.bound_height != world.icon_size || AM.bound_width != world.icon_size) - var/icon/AMicon = icon(AM.icon, AM.icon_state) - pixel_x_offset += ((AMicon.Width()/world.icon_size)-1)*(world.icon_size*0.5) - pixel_y_offset += ((AMicon.Height()/world.icon_size)-1)*(world.icon_size*0.5) - qdel(AMicon) - - //DY and DX - var/rough_x = round(round(pixel_x_offset,world.icon_size)/world.icon_size) - var/rough_y = round(round(pixel_y_offset,world.icon_size)/world.icon_size) - - //Find coordinates - var/turf/T = get_turf(AM) //use AM's turfs, as it's coords are the same as AM's AND AM's coords are lost if it is inside another atom - if(!T) - return null - var/final_x = T.x + rough_x - var/final_y = T.y + rough_y - - if(final_x || final_y) - return locate(final_x, final_y, T.z) - -//Finds the distance between two atoms, in pixels -//centered = 0 counts from turf edge to edge -//centered = 1 counts from turf center to turf center -//of course mathematically this is just adding world.icon_size on again -/proc/getPixelDistance(var/atom/A, var/atom/B, var/centered = 1) - if(!istype(A)||!istype(B)) - return 0 - . = bounds_dist(A, B) + sqrt((((A.pixel_x+B.pixel_x)**2) + ((A.pixel_y+B.pixel_y)**2))) - if(centered) - . += world.icon_size - -/proc/get(atom/loc, type) - while(loc) - if(istype(loc, type)) - return loc - loc = loc.loc - return null - -/proc/get_turf_or_move(turf/location) - return get_turf(location) - - -//For objects that should embed, but make no sense being is_sharp or is_pointed() -//e.g: rods -var/list/can_embed_types = typecacheof(list( - /obj/item/stack/rods, - /obj/item/pipe)) - -/proc/can_embed(obj/item/W) - if(is_sharp(W)) - return 1 - if(is_pointed(W)) - return 1 - - if(is_type_in_typecache(W, can_embed_types)) - return 1 - -//Quick type checks for some tools -var/global/list/common_tools = list( -/obj/item/stack/cable_coil, -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/screwdriver, -/obj/item/wirecutters, -/obj/item/multitool, -/obj/item/crowbar) - -/proc/istool(O) - if(O && is_type_in_list(O, common_tools)) - return 1 - return 0 - -/proc/iswrench(O) - if(istype(O, /obj/item/wrench)) - return 1 - return 0 - -/proc/iswelder(O) - if(istype(O, /obj/item/weldingtool)) - return 1 - return 0 - -/proc/iscoil(O) - if(istype(O, /obj/item/stack/cable_coil)) - return 1 - return 0 - -/proc/iswirecutter(O) - if(istype(O, /obj/item/wirecutters)) - return 1 - return 0 - -/proc/isscrewdriver(O) - if(istype(O, /obj/item/screwdriver)) - return 1 - return 0 - -/proc/ismultitool(O) - if(istype(O, /obj/item/multitool)) - return 1 - return 0 - -/proc/iscrowbar(O) - if(istype(O, /obj/item/crowbar)) - return 1 - return 0 - -/proc/ispowertool(O)//used to check if a tool can force powered doors - if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw)) - return TRUE - return FALSE - -/proc/iswire(O) - if(istype(O, /obj/item/stack/cable_coil)) - return 1 - return 0 - -/proc/is_hot(obj/item/W as obj) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/O = W - if(O.isOn()) - return 2500 - else - return 0 - if(istype(W, /obj/item/lighter)) - var/obj/item/lighter/O = W - if(O.lit) - return 1500 - else - return 0 - if(istype(W, /obj/item/match)) - var/obj/item/match/O = W - if(O.lit == 1) - return 1000 - else - return 0 - if(istype(W, /obj/item/clothing/mask/cigarette)) - var/obj/item/clothing/mask/cigarette/O = W - if(O.lit) - return 1000 - else - return 0 - if(istype(W, /obj/item/candle)) - var/obj/item/candle/O = W - if(O.lit) - return 1000 - else - return 0 - if(istype(W, /obj/item/flashlight/flare)) - var/obj/item/flashlight/flare/O = W - if(O.on) - return 1000 - else - return 0 - if(istype(W, /obj/item/gun/energy/plasmacutter)) - return 3800 - if(istype(W, /obj/item/melee/energy)) - var/obj/item/melee/energy/O = W - if(O.active) - return 3500 - else - return 0 - if(istype(W, /obj/item/assembly/igniter)) - return 20000 - else - return 0 - -//Whether or not the given item counts as sharp in terms of dealing damage -/proc/is_sharp(obj/O) - if(!O) - return 0 - if(O.sharp) - return 1 - return 0 - -/proc/is_surgery_tool(obj/item/W as obj) - return ( \ - istype(W, /obj/item/scalpel) || \ - istype(W, /obj/item/hemostat) || \ - istype(W, /obj/item/retractor) || \ - istype(W, /obj/item/cautery) || \ - istype(W, /obj/item/bonegel) || \ - istype(W, /obj/item/bonesetter) - ) - -/proc/reverse_direction(var/dir) - switch(dir) - if(NORTH) - return SOUTH - if(NORTHEAST) - return SOUTHWEST - if(EAST) - return WEST - if(SOUTHEAST) - return NORTHWEST - if(SOUTH) - return NORTH - if(SOUTHWEST) - return NORTHEAST - if(WEST) - return EAST - if(NORTHWEST) - return SOUTHEAST - -/* -Checks if that loc and dir has a item on the wall -*/ -var/list/static/global/wall_items = typecacheof(list(/obj/machinery/power/apc, /obj/machinery/alarm, - /obj/item/radio/intercom, /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, - /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, - /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/door_control, - /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/airlock, - /obj/item/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, - /obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment, - /obj/structure/sign)) - -/proc/gotwallitem(loc, dir) - for(var/obj/O in loc) - if(is_type_in_typecache(O, wall_items)) - //Direction works sometimes - if(O.dir == dir) - return 1 - - //Some stuff doesn't use dir properly, so we need to check pixel instead - switch(dir) - if(SOUTH) - if(O.pixel_y > 10) - return 1 - if(NORTH) - if(O.pixel_y < -10) - return 1 - if(WEST) - if(O.pixel_x > 10) - return 1 - if(EAST) - if(O.pixel_x < -10) - return 1 - - //Some stuff is placed directly on the wallturf (signs) - for(var/obj/O in get_step(loc, dir)) - if(is_type_in_typecache(O, wall_items)) - if(abs(O.pixel_x) <= 10 && abs(O.pixel_y) <= 10) - return 1 - return 0 - - -proc/get_angle(atom/a, atom/b) - return atan2(b.y - a.y, b.x - a.x) - -proc/atan2(x, y) - if(!x && !y) return 0 - return y >= 0 ? arccos(x / sqrt(x * x + y * y)) : -arccos(x / sqrt(x * x + y * y)) - -/proc/format_text(text) - return replacetext(replacetext(text,"\proper ",""),"\improper ","") - -/* -Standard way to write links -Sayu -*/ - -/proc/topic_link(var/datum/D, var/arglist, var/content) - if(istype(arglist,/list)) - arglist = list2params(arglist) - return "[content]" - - - -/proc/get_location_accessible(mob/M, location) - var/covered_locations = 0 //based on body_parts_covered - var/face_covered = 0 //based on flags_inv - var/eyesmouth_covered = 0 //based on flags_cover - if(iscarbon(M)) - var/mob/living/carbon/C = M - for(var/obj/item/clothing/I in list(C.back, C.wear_mask)) - covered_locations |= I.body_parts_covered - face_covered |= I.flags_inv - eyesmouth_covered |= I.flags_cover - if(ishuman(C)) - var/mob/living/carbon/human/H = C - for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.head, H.r_ear, H.l_ear)) - covered_locations |= I.body_parts_covered - face_covered |= I.flags_inv - eyesmouth_covered |= I.flags_cover - - switch(location) - if("head") - if(covered_locations & HEAD) - return 0 - if("eyes") - if(face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES || eyesmouth_covered & HEADCOVERSEYES) - return 0 - if("mouth") - if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH) - return 0 - if("chest") - if(covered_locations & UPPER_TORSO) - return 0 - if("groin") - if(covered_locations & LOWER_TORSO) - return 0 - if("l_arm") - if(covered_locations & ARM_LEFT) - return 0 - if("r_arm") - if(covered_locations & ARM_RIGHT) - return 0 - if("l_leg") - if(covered_locations & LEG_LEFT) - return 0 - if("r_leg") - if(covered_locations & LEG_RIGHT) - return 0 - if("l_hand") - if(covered_locations & HAND_LEFT) - return 0 - if("r_hand") - if(covered_locations & HAND_RIGHT) - return 0 - if("l_foot") - if(covered_locations & FOOT_LEFT) - return 0 - if("r_foot") - if(covered_locations & FOOT_RIGHT) - return 0 - - return 1 - -/proc/check_target_facings(mob/living/initator, mob/living/target) - /*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head. - Given how click code currently works (Nov '13), the initiating mob will be facing the target mob most of the time - That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/ - if(!ismob(target) || target.lying) - //Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side - return FACING_FAILED - if(initator.dir == target.dir) //mobs are facing the same direction - return FACING_SAME_DIR - if(is_A_facing_B(initator, target) && is_A_facing_B(target, initator)) //mobs are facing each other - return FACING_EACHOTHER - if(initator.dir + 2 == target.dir || initator.dir - 2 == target.dir || initator.dir + 6 == target.dir || initator.dir - 6 == target.dir) //Initating mob is looking at the target, while the target mob is looking in a direction perpendicular to the 1st - return FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR - - -atom/proc/GetTypeInAllContents(typepath) - var/list/processing_list = list(src) - var/list/processed = list() - - var/atom/found = null - - while(processing_list.len && found==null) - var/atom/A = processing_list[1] - if(istype(A, typepath)) - found = A - - processing_list -= A - - for(var/atom/a in A) - if(!(a in processed)) - processing_list |= a - - processed |= A - - return found - -/proc/random_step(atom/movable/AM, steps, chance) - var/initial_chance = chance - while(steps > 0) - if(prob(chance)) - step(AM, pick(alldirs)) - chance = max(chance - (initial_chance / steps), 0) - steps-- - -/proc/get_random_colour(var/simple, var/lower, var/upper) - var/colour - if(simple) - colour = pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")) - else - for(var/i=1;i<=3;i++) - var/temp_col = "[num2hex(rand(lower,upper))]" - if(length(temp_col )<2) - temp_col = "0[temp_col]" - colour += temp_col - return colour - -/proc/get_distant_turf(var/turf/T,var/direction,var/distance) - if(!T || !direction || !distance) return - - var/dest_x = T.x - var/dest_y = T.y - var/dest_z = T.z - - if(direction & NORTH) - dest_y = min(world.maxy, dest_y+distance) - if(direction & SOUTH) - dest_y = max(0, dest_y-distance) - if(direction & EAST) - dest_x = min(world.maxy, dest_x+distance) - if(direction & WEST) - dest_x = max(0, dest_x-distance) - - return locate(dest_x,dest_y,dest_z) - -var/mob/dview/dview_mob = new - -//Version of view() which ignores darkness, because BYOND doesn't have it. -/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) - if(!center) - return - - dview_mob.loc = center - - dview_mob.see_invisible = invis_flags - - . = view(range, dview_mob) - dview_mob.loc = null - -/mob/dview - invisibility = 101 - density = 0 - move_force = 0 - pull_force = 0 - move_resist = INFINITY - simulated = 0 - canmove = FALSE - see_in_dark = 1e6 - -/mob/dview/New() //For whatever reason, if this isn't called, then BYOND will throw a type mismatch runtime when attempting to add this to the mobs list. -Fox - -/mob/dview/Destroy() - // should never be deleted - return QDEL_HINT_LETMELIVE - -/proc/IsValidSrc(A) - if(istype(A, /datum)) - var/datum/D = A - return !QDELETED(D) - if(istype(A, /client)) - return TRUE - return FALSE - -//can a window be here, or is there a window blocking it? -/proc/valid_window_location(turf/T, dir_to_check) - if(!T) - return FALSE - for(var/obj/O in T) - if(istype(O, /obj/machinery/door/window) && (O.dir == dir_to_check || dir_to_check == FULLTILE_WINDOW_DIR)) - return FALSE - if(istype(O, /obj/structure/windoor_assembly)) - var/obj/structure/windoor_assembly/W = O - if(W.ini_dir == dir_to_check || dir_to_check == FULLTILE_WINDOW_DIR) - return FALSE - if(istype(O, /obj/structure/window)) - var/obj/structure/window/W = O - if(W.ini_dir == dir_to_check || W.ini_dir == FULLTILE_WINDOW_DIR || dir_to_check == FULLTILE_WINDOW_DIR) - return FALSE - return TRUE - -//Get the dir to the RIGHT of dir if they were on a clock -//NORTH --> NORTHEAST -/proc/get_clockwise_dir(dir) - . = angle2dir(dir2angle(dir)+45) - -//Get the dir to the LEFT of dir if they were on a clock -//NORTH --> NORTHWEST -/proc/get_anticlockwise_dir(dir) - . = angle2dir(dir2angle(dir)-45) - - -//Compare A's dir, the clockwise dir of A and the anticlockwise dir of A -//To the opposite dir of the dir returned by get_dir(B,A) -//If one of them is a match, then A is facing B -/proc/is_A_facing_B(atom/A, atom/B) - if(!istype(A) || !istype(B)) - return 0 - if(isliving(A)) - var/mob/living/LA = A - if(LA.lying) - return 0 - var/goal_dir = angle2dir(dir2angle(get_dir(B, A)+180)) - var/clockwise_A_dir = get_clockwise_dir(A.dir) - var/anticlockwise_A_dir = get_anticlockwise_dir(B.dir) - - if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir) - return 1 - return 0 - -//This is just so you can stop an orbit. -//orbit() can run without it (swap orbiting for A) -//but then you can never stop it and that's just silly. -/atom/movable/var/atom/orbiting = null - -//A: atom to orbit -//radius: range to orbit at, radius of the circle formed by orbiting -//clockwise: whether you orbit clockwise or anti clockwise -//rotation_speed: how fast to rotate -//rotation_segments: the resolution of the orbit circle, less = a more block circle, this can be used to produce hexagons (6 segments) triangles (3 segments), and so on, 36 is the best default. -//pre_rotation: Chooses to rotate src 90 degress towards the orbit dir (clockwise/anticlockwise), useful for things to go "head first" like ghosts -//lockinorbit: Forces src to always be on A's turf, otherwise the orbit cancels when src gets too far away (eg: ghosts) - -/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE, forceMove = FALSE) - if(!istype(A)) - return - - if(orbiting) - stop_orbit() - - orbiting = A - var/matrix/initial_transform = matrix(transform) - var/lastloc = loc - - //Head first! - if(pre_rotation) - var/matrix/M = matrix(transform) - var/pre_rot = 90 - if(!clockwise) - pre_rot = -90 - M.Turn(pre_rot) - transform = M - - var/matrix/shift = matrix(transform) - shift.Translate(0,radius) - transform = shift - - SpinAnimation(rotation_speed, -1, clockwise, rotation_segments) - - //we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit - transform = initial_transform - while(orbiting && orbiting == A && A.loc) - var/targetloc = get_turf(A) - if(!lockinorbit && loc != lastloc && loc != targetloc) - break - if(forceMove) - forceMove(targetloc) - else - loc = targetloc - lastloc = loc - sleep(0.6) - - if(orbiting == A) //make sure we haven't started orbiting something else. - orbiting = null - SpinAnimation(0,0) - - - -/atom/movable/proc/stop_orbit() - orbiting = null - -//Centers an image. -//Requires: -//The Image -//The x dimension of the icon file used in the image -//The y dimension of the icon file used in the image -// eg: center_image(I, 32,32) -// eg2: center_image(I, 96,96) -/proc/center_image(var/image/I, x_dimension = 0, y_dimension = 0) - if(!I) - return - - if(!x_dimension || !y_dimension) - return - - //Get out of here, punk ass kids calling procs needlessly - if((x_dimension == world.icon_size) && (y_dimension == world.icon_size)) - return I - - //Offset the image so that it's bottom left corner is shifted this many pixels - //This makes it infinitely easier to draw larger inhands/images larger than world.iconsize - //but still use them in game - var/x_offset = -((x_dimension/world.icon_size)-1)*(world.icon_size*0.5) - var/y_offset = -((y_dimension/world.icon_size)-1)*(world.icon_size*0.5) - - //Correct values under world.icon_size - if(x_dimension < world.icon_size) - x_offset *= -1 - if(y_dimension < world.icon_size) - y_offset *= -1 - - I.pixel_x = x_offset - I.pixel_y = y_offset - - return I - -//similar function to RANGE_TURFS(), but will search spiralling outwards from the center (like the above, but only turfs) -/proc/spiral_range_turfs(dist=0, center=usr, orange=0) - if(!dist) - if(!orange) - return list(center) - else - return list() - - var/turf/t_center = get_turf(center) - if(!t_center) - return list() - - var/list/L = list() - var/turf/T - var/y - var/x - var/c_dist = 1 - - if(!orange) - L += t_center - - while( c_dist <= dist ) - y = t_center.y + c_dist - x = t_center.x - c_dist + 1 - for(x in x to t_center.x+c_dist) - T = locate(x,y,t_center.z) - if(T) - L += T - - y = t_center.y + c_dist - 1 - x = t_center.x + c_dist - for(y in t_center.y-c_dist to y) - T = locate(x,y,t_center.z) - if(T) - L += T - - y = t_center.y - c_dist - x = t_center.x + c_dist - 1 - for(x in t_center.x-c_dist to x) - T = locate(x,y,t_center.z) - if(T) - L += T - - y = t_center.y - c_dist + 1 - x = t_center.x - c_dist - for(y in y to t_center.y+c_dist) - T = locate(x,y,t_center.z) - if(T) - L += T - c_dist++ - - return L - -//ultra range (no limitations on distance, faster than range for distances > 8); including areas drastically decreases performance -/proc/urange(dist=0, atom/center=usr, orange=0, areas=0) - if(!dist) - if(!orange) - return list(center) - else - return list() - - var/list/turfs = RANGE_TURFS(dist, center) - if(orange) - turfs -= get_turf(center) - . = list() - for(var/V in turfs) - var/turf/T = V - . += T - . += T.contents - if(areas) - . |= T.loc - -/proc/turf_clear(turf/T) - for(var/atom/A in T) - if(A.simulated) - return FALSE - return TRUE - -/proc/screen_loc2turf(scr_loc, turf/origin) - var/tX = splittext(scr_loc, ",") - var/tY = splittext(tX[2], ":") - var/tZ = origin.z - tY = tY[1] - tX = splittext(tX[1], ":") - tX = tX[1] - tX = max(1, min(world.maxx, origin.x + (text2num(tX) - (world.view + 1)))) - tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) - return locate(tX, tY, tZ) - -/proc/get_closest_atom(type, list, source) - var/closest_atom - var/closest_distance - for(var/A in list) - if(!istype(A, type)) - continue - var/distance = get_dist(source, A) - if(!closest_distance) - closest_distance = distance - closest_atom = A - else - if(closest_distance > distance) - closest_distance = distance - closest_atom = A - return closest_atom - -/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) - if(value == FALSE) //nothing should be calling us with a number, so this is safe - value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text - if(isnull(value)) - return - value = trim(value) - if(!isnull(value) && value != "") - matches = filter_fancy_list(matches, value) - - if(matches.len == 0) - return - - var/chosen - if(matches.len == 1) - chosen = matches[1] - else - chosen = input("Select a type", "Pick Type", matches[1]) as null|anything in matches - if(!chosen) - return - chosen = matches[chosen] - return chosen - -/proc/make_types_fancy(var/list/types) - if(ispath(types)) - types = list(types) - . = list() - for(var/type in types) - var/typename = "[type]" - var/static/list/TYPES_SHORTCUTS = list( - //longest paths comes first - otherwise they get shadowed by the more generic ones - /obj/effect/decal/cleanable = "CLEANABLE", - /obj/effect = "EFFECT", - /obj/item/ammo_casing = "AMMO", - /obj/item/book/manual = "MANUAL", - /obj/item/borg/upgrade = "BORG_UPGRADE", - /obj/item/cartridge = "PDA_CART", - /obj/item/clothing/head/helmet/space = "SPESSHELMET", - /obj/item/clothing/head = "HEAD", - /obj/item/clothing/under = "UNIFORM", - /obj/item/clothing/shoes = "SHOES", - /obj/item/clothing/suit = "SUIT", - /obj/item/clothing/gloves = "GLOVES", - /obj/item/clothing/mask/cigarette = "CIGARRETE", // oof - /obj/item/clothing/mask = "MASK", - /obj/item/clothing/glasses = "GLASSES", - /obj/item/clothing = "CLOTHING", - /obj/item/grenade/clusterbuster = "CLUSTERBUSTER", - /obj/item/grenade = "GRENADE", - /obj/item/gun = "GUN", - /obj/item/implant = "IMPLANT", - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", - /obj/item/mecha_parts/mecha_equipment/weapon = "MECHA_WEAPON", - /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", - /obj/item/melee = "MELEE", - /obj/item/mmi = "MMI", - /obj/item/nullrod = "NULLROD", - /obj/item/organ/external = "EXT_ORG", - /obj/item/organ/internal/cyberimp = "CYBERIMP", - /obj/item/organ/internal = "INT_ORG", - /obj/item/organ = "ORGAN", - /obj/item/pda = "PDA", - /obj/item/projectile = "PROJ", - /obj/item/radio/headset = "HEADSET", - /obj/item/reagent_containers/glass/beaker = "BEAKER", - /obj/item/reagent_containers/glass/bottle = "BOTTLE", - /obj/item/reagent_containers/food/pill/patch = "PATCH", - /obj/item/reagent_containers/food/pill = "PILL", - /obj/item/reagent_containers/food/drinks = "DRINK", - /obj/item/reagent_containers/food = "FOOD", - /obj/item/reagent_containers/syringe = "SYRINGE", - /obj/item/reagent_containers = "REAGENT_CONTAINERS", - /obj/item/robot_parts = "ROBOT_PARTS", - /obj/item/seeds = "SEED", - /obj/item/slime_extract = "SLIME_CORE", - /obj/item/spacepod_equipment/weaponry = "POD_WEAPON", - /obj/item/spacepod_equipment = "POD_EQUIP", - /obj/item/stack/sheet/mineral = "MINERAL", - /obj/item/stack/sheet = "SHEET", - /obj/item/stack/tile = "TILE", - /obj/item/stack = "STACK", - /obj/item/stock_parts/cell = "POWERCELL", - /obj/item/stock_parts = "STOCK_PARTS", - /obj/item/storage/firstaid = "FIRSTAID", - /obj/item/storage = "STORAGE", - /obj/item/tank = "GAS_TANK", - /obj/item/toy/crayon = "CRAYON", - /obj/item/toy = "TOY", - /obj/item = "ITEM", - /obj/machinery/atmospherics = "ATMOS_MACH", - /obj/machinery/computer = "CONSOLE", - /obj/machinery/door/airlock = "AIRLOCK", - /obj/machinery/door = "DOOR", - /obj/machinery/kitchen_machine = "KITCHEN", - /obj/machinery/portable_atmospherics/canister = "CANISTER", - /obj/machinery/portable_atmospherics = "PORT_ATMOS", - /obj/machinery/power = "POWER", - /obj/machinery/telecomms = "TCOMMS", - /obj/machinery = "MACHINERY", - /obj/mecha = "MECHA", - /obj/structure/closet/crate = "CRATE", - /obj/structure/closet = "CLOSET", - /obj/structure/statue = "STATUE", - /obj/structure/chair = "CHAIR", // oh no - /obj/structure/bed = "BED", - /obj/structure/chair/stool = "STOOL", - /obj/structure/table = "TABLE", - /obj/structure = "STRUCTURE", - /obj/vehicle = "VEHICLE", - /obj = "O", - /datum = "D", - /turf/simulated/floor = "SIM_FLOOR", - /turf/simulated/wall = "SIM_WALL", - /turf/unsimulated/floor = "UNSIM_FLOOR", - /turf/unsimulated/wall = "UNSIM_WALL", - /turf = "T", - /mob/living/carbon/alien = "XENO", - /mob/living/carbon/human = "HUMAN", - /mob/living/carbon = "CARBON", - /mob/living/silicon/robot = "CYBORG", - /mob/living/silicon/ai = "AI", - /mob/living/silicon = "SILICON", - /mob/living/simple_animal/bot = "BOT", - /mob/living/simple_animal = "SIMPLE", - /mob/living = "LIVING", - /mob = "M" - ) - for(var/tn in TYPES_SHORTCUTS) - if(copytext(typename, 1, length("[tn]/") + 1) == "[tn]/") - typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) - break - .[typename] = type - - -/proc/get_fancy_list_of_atom_types() - var/static/list/pre_generated_list - if(!pre_generated_list) //init - pre_generated_list = make_types_fancy(typesof(/atom)) - return pre_generated_list - - -/proc/get_fancy_list_of_datum_types() - var/static/list/pre_generated_list - if(!pre_generated_list) //init - pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) - return pre_generated_list - - -/proc/filter_fancy_list(list/L, filter as text) - var/list/matches = new - for(var/key in L) - var/value = L[key] - if(findtext("[key]", filter) || findtext("[value]", filter)) - matches[key] = value - return matches - -//Key thing that stops lag. Cornerstone of performance in ss13, Just sitting here, in unsorted.dm. - -//Increases delay as the server gets more overloaded, -//as sleeps aren't cheap and sleeping only to wake up and sleep again is wasteful -#define DELTA_CALC max(((max(TICK_USAGE, world.cpu) / 100) * max(Master.sleep_delta-1,1)), 1) - -//returns the number of ticks slept -/proc/stoplag(initial_delay) - if(!Master || !(Master.current_runlevel & RUNLEVELS_DEFAULT)) - sleep(world.tick_lag) - return 1 - if(!initial_delay) - initial_delay = world.tick_lag - . = 0 - var/i = DS2TICKS(initial_delay) - do - . += CEILING(i*DELTA_CALC, 1) - sleep(i*world.tick_lag*DELTA_CALC) - i *= 2 - while(TICK_USAGE > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) - -#undef DELTA_CALC - -// This proc gets a list of all "points of interest" (poi's) that can be used by admins to track valuable mobs or atoms (such as the nuke disk). -/proc/getpois(mobs_only=0,skip_mindless=0) - var/list/mobs = sortmobs() - var/list/names = list() - var/list/pois = list() - var/list/namecounts = list() - - for(var/mob/M in mobs) - if(skip_mindless && (!M.mind && !M.ckey)) - if(!isbot(M) && !istype(M, /mob/camera/)) - continue - if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins - continue - var/name = M.name - if(name in names) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - if(M.real_name && M.real_name != M.name) - name += " \[[M.real_name]\]" - if(M.stat == DEAD) - if(istype(M, /mob/dead/observer/)) - name += " \[ghost\]" - else - name += " \[dead\]" - pois[name] = M - - if(!mobs_only) - for(var/atom/A in GLOB.poi_list) - if(!A || !A.loc) - continue - var/name = A.name - if(names.Find(name)) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - pois[name] = A - - return pois - -/proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20) - var/client/C - if(istype(mob_or_client, /mob)) - var/mob/M = mob_or_client - if(M.client) - C = M.client - else - return - else if(istype(mob_or_client, /client)) - C = mob_or_client - - if(!istype(C)) - return - - C.color = flash_color - spawn(0) - animate(C, color = initial(C.color), time = flash_time) - -#define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255))) - -/proc/make_bit_triplet() - var/list/num_sample = list(1, 2, 3, 4, 5, 6, 7, 8, 9) - var/result = 0 - for(var/i = 0, i < 3, i++) - var/num = pick(num_sample) - num_sample -= num - result += (1 << num) - return result - -/proc/pixel_shift_dir(var/dir, var/amount_x = 32, var/amount_y = 32) //Returns a list with pixel_shift values that will shift an object's icon one tile in the direction passed. - amount_x = min(max(0, amount_x), 32) //No less than 0, no greater than 32. - amount_y = min(max(0, amount_x), 32) - var/list/shift = list("x" = 0, "y" = 0) - switch(dir) - if(NORTH) - shift["y"] = amount_y - if(SOUTH) - shift["y"] = -amount_y - if(EAST) - shift["x"] = amount_x - if(WEST) - shift["x"] = -amount_x - if(NORTHEAST) - shift = list("x" = amount_x, "y" = amount_y) - if(NORTHWEST) - shift = list("x" = -amount_x, "y" = amount_y) - if(SOUTHEAST) - shift = list("x" = amount_x, "y" = -amount_y) - if(SOUTHWEST) - shift = list("x" = -amount_x, "y" = -amount_y) - - return shift - -//Return a list of atoms in a location of a given type. Can be refined to look for pixel-shift. -/proc/get_atoms_of_type(var/atom/here, var/type, var/check_shift, var/shift_x = 0, var/shift_y = 0) - . = list() - if(here) - for(var/atom/thing in here) - if(istype(thing, type) && (check_shift && thing.pixel_x == shift_x && thing.pixel_y == shift_y)) - . += thing - -//gives us the stack trace from CRASH() without ending the current proc. -/proc/stack_trace(msg) - CRASH(msg) - -/datum/proc/stack_trace(msg) - CRASH(msg) - -/proc/pass() - return - -/atom/proc/Shake(pixelshiftx = 15, pixelshifty = 15, duration = 250) - var/initialpixelx = pixel_x - var/initialpixely = pixel_y - var/shiftx = rand(-pixelshiftx,pixelshiftx) - var/shifty = rand(-pixelshifty,pixelshifty) - animate(src, pixel_x = pixel_x + shiftx, pixel_y = pixel_y + shifty, time = 0.2, loop = duration) - pixel_x = initialpixelx - pixel_y = initialpixely - -/proc/params2turf(scr_loc, turf/origin, client/C) - if(!scr_loc) - return null - var/tX = splittext(scr_loc, ",") - var/tY = splittext(tX[2], ":") - var/tZ = origin.z - tY = tY[1] - tX = splittext(tX[1], ":") - tX = tX[1] - var/list/actual_view = getviewsize(C ? C.view : world.view) - tX = Clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx) - tY = Clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy) - return locate(tX, tY, tZ) +/* + * A large number of misc global procs. + */ + + /* Get the direction of startObj relative to endObj. + * Return values: To the right, 1. Below, 2. To the left, 3. Above, 4. Not found adjacent in cardinal directions, 0. + */ +/proc/getRelativeDirection(var/atom/movable/startObj, var/atom/movable/endObj) + if(endObj.x == startObj.x + 1 && endObj.y == startObj.y) + return EAST + + if(endObj.x == startObj.x - 1 && endObj.y == startObj.y) + return WEST + + if(endObj.y == startObj.y + 1 && endObj.x == startObj.x) + return NORTH + + if(endObj.y == startObj.y - 1 && endObj.x == startObj.x) + return SOUTH + + return 0 + +//Inverts the colour of an HTML string +/proc/invertHTML(HTMLstring) + + if(!( istext(HTMLstring) )) + CRASH("Given non-text argument!") + return + else + if(length(HTMLstring) != 7) + CRASH("Given non-HTML argument!") + return + var/textr = copytext(HTMLstring, 2, 4) + var/textg = copytext(HTMLstring, 4, 6) + var/textb = copytext(HTMLstring, 6, 8) + var/r = hex2num(textr) + var/g = hex2num(textg) + var/b = hex2num(textb) + textr = num2hex(255 - r) + textg = num2hex(255 - g) + textb = num2hex(255 - b) + if(length(textr) < 2) + textr = text("0[]", textr) + if(length(textg) < 2) + textr = text("0[]", textg) + if(length(textb) < 2) + textr = text("0[]", textb) + return text("#[][][]", textr, textg, textb) + return + +//Returns the middle-most value +/proc/dd_range(var/low, var/high, var/num) + return max(low,min(high,num)) + +//Returns whether or not A is the middle most value +/proc/InRange(var/A, var/lower, var/upper) + if(A < lower) return 0 + if(A > upper) return 0 + return 1 + + +/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. + if(!start || !end) return 0 + var/dy + var/dx + dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) + dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) + if(!dy) + return (dx>=0)?90:270 + .=arctan(dx/dy) + if(dy<0) + .+=180 + else if(dx<0) + .+=360 + +//Returns location. Returns null if no location was found. +/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = 0, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) +/* +Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no). +Random error in tile placement x, error in tile placement y, and block offset. +Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc. +Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive. +Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something. +*/ + + var/dirx = 0//Generic location finding variable. + var/diry = 0 + + var/xoffset = 0//Generic counter for offset location. + var/yoffset = 0 + + var/b1xerror = 0//Generic placing for point A in box. The lower left. + var/b1yerror = 0 + var/b2xerror = 0//Generic placing for point B in box. The upper right. + var/b2yerror = 0 + + errorx = abs(errorx)//Error should never be negative. + errory = abs(errory) + //var/errorxy = round((errorx+errory)/2)//Used for diagonal boxes. + + switch(target.dir)//This can be done through equations but switch is the simpler method. And works fast to boot. + //Directs on what values need modifying. + if(1)//North + diry+=distance + yoffset+=eoffsety + xoffset+=eoffsetx + b1xerror-=errorx + b1yerror-=errory + b2xerror+=errorx + b2yerror+=errory + if(2)//South + diry-=distance + yoffset-=eoffsety + xoffset+=eoffsetx + b1xerror-=errorx + b1yerror-=errory + b2xerror+=errorx + b2yerror+=errory + if(4)//East + dirx+=distance + yoffset+=eoffsetx//Flipped. + xoffset+=eoffsety + b1xerror-=errory//Flipped. + b1yerror-=errorx + b2xerror+=errory + b2yerror+=errorx + if(8)//West + dirx-=distance + yoffset-=eoffsetx//Flipped. + xoffset+=eoffsety + b1xerror-=errory//Flipped. + b1yerror-=errorx + b2xerror+=errory + b2yerror+=errorx + + var/turf/destination=locate(location.x+dirx,location.y+diry,location.z) + + if(destination)//If there is a destination. + if(errorx||errory)//If errorx or y were specified. + var/destination_list[] = list()//To add turfs to list. + //destination_list = new() + /*This will draw a block around the target turf, given what the error is. + Specifying the values above will basically draw a different sort of block. + If the values are the same, it will be a square. If they are different, it will be a rectengle. + In either case, it will center based on offset. Offset is position from center. + Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport, + the offset should remain positioned in relation to destination.*/ + + var/turf/center = locate((destination.x+xoffset),(destination.y+yoffset),location.z)//So now, find the new center. + + //Now to find a box from center location and make that our destination. + for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z) )) + if(density&&T.density) continue//If density was specified. + if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map. + if(T.y>world.maxy || T.y<1) continue + destination_list += T + if(destination_list.len) + destination = pick(destination_list) + else return + + else//Same deal here. + if(density&&destination.density) return + if(destination.x>world.maxx || destination.x<1) return + if(destination.y>world.maxy || destination.y<1) return + else return + + return destination + +// Returns true if direction is blocked from loc +// Checks if doors are open +/proc/DirBlocked(turf/loc,var/dir) + for(var/obj/structure/window/D in loc) + if(!D.density) + continue + if(D.fulltile) + return 1 + if(D.dir == dir) + return 1 + + for(var/obj/machinery/door/D in loc) + if(!D.density)//if the door is open + continue + else return 1 // if closed, it's a real, air blocking door + return 0 + +///////////////////////////////////////////////////////////////////////// + +/proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm + var/px=M.x //starting x + var/py=M.y + var/line[] = list(locate(px,py,M.z)) + var/dx=N.x-px //x distance + var/dy=N.y-py + var/dxabs=abs(dx)//Absolute value of x distance + var/dyabs=abs(dy) + var/sdx=SIGN(dx) //Sign of x distance (+ or -) + var/sdy=SIGN(dy) + var/x=dxabs>>1 //Counters for steps taken, setting to distance/2 + var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast. + var/j //Generic integer for counting + if(dxabs>=dyabs) //x distance is greater than y + for(j=0;j=dxabs) //Every dyabs steps, step once in y direction + y-=dxabs + py+=sdy + px+=sdx //Step on in x direction + line+=locate(px,py,M.z)//Add the turf to the list + else + for(j=0;j=dyabs) + x-=dyabs + px+=sdx + py+=sdy + line+=locate(px,py,M.z) + return line + +//Same as the thing below just for density and without support for atoms. +/proc/can_line(atom/source, atom/target, length = 5) + var/turf/current = get_turf(source) + var/turf/target_turf = get_turf(target) + var/steps = 0 + + while(current != target_turf) + if(steps > length) + return FALSE + if(!current) + return FALSE + if(current.density) + return FALSE + current = get_step_towards(current, target_turf) + steps++ + return TRUE + +//Returns whether or not a player is a guest using their ckey as an input +/proc/IsGuestKey(key) + if(findtext(key, "Guest-", 1, 7) != 1) //was findtextEx + return 0 + + var/i, ch, len = length(key) + + for(i = 7, i <= len, ++i) + ch = text2ascii(key, i) + if(ch < 48 || ch > 57) + return 0 + return 1 + +//Ensure the frequency is within bounds of what it should be sending/recieving at +/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ) + f = round(f) + f = max(low, f) + f = min(high, f) + if((f % 2) == 0) //Ensure the last digit is an odd number + f += 1 + return f + +//Turns 1479 into 147.9 +/proc/format_frequency(var/f) + return "[round(f / 10)].[f % 10]" + +/obj/proc/atmosanalyzer_scan(var/datum/gas_mixture/air_contents, mob/user, var/obj/target = src) + var/obj/icon = target + user.visible_message("[user] has used the analyzer on [target].", "You use the analyzer on [target].") + var/pressure = air_contents.return_pressure() + var/total_moles = air_contents.total_moles() + + user.show_message("Results of analysis of [bicon(icon)] [target].", 1) + if(total_moles>0) + var/o2_concentration = air_contents.oxygen/total_moles + var/n2_concentration = air_contents.nitrogen/total_moles + var/co2_concentration = air_contents.carbon_dioxide/total_moles + var/plasma_concentration = air_contents.toxins/total_moles + + var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) + + user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) + user.show_message("Nitrogen: [round(n2_concentration*100)] % ([round(air_contents.nitrogen,0.01)] moles)", 1) + user.show_message("Oxygen: [round(o2_concentration*100)] % ([round(air_contents.oxygen,0.01)] moles)", 1) + user.show_message("CO2: [round(co2_concentration*100)] % ([round(air_contents.carbon_dioxide,0.01)] moles)", 1) + user.show_message("Plasma: [round(plasma_concentration*100)] % ([round(air_contents.toxins,0.01)] moles)", 1) + if(unknown_concentration>0.01) + user.show_message("Unknown: [round(unknown_concentration*100)] % ([round(unknown_concentration*total_moles,0.01)] moles)", 1) + user.show_message("Total: [round(total_moles,0.01)] moles", 1) + user.show_message("Temperature: [round(air_contents.temperature-T0C)] °C", 1) + else + user.show_message("[target] is empty!", 1) + return + +//Picks a string of symbols to display as the law number for hacked or ion laws +/proc/ionnum() + return "[pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" + +//When an AI is activated, it can choose from a list of non-slaved borgs to have as a slave. +/proc/freeborg() + var/select = null + var/list/borgs = list() + for(var/mob/living/silicon/robot/A in GLOB.player_list) + if(A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone)) + continue + var/name = "[A.real_name] ([A.modtype] [A.braintype])" + borgs[name] = A + + if(borgs.len) + select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs + return borgs[select] + +//When a borg is activated, it can choose which AI it wants to be slaved to +/proc/active_ais() + . = list() + for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) + if(A.stat == DEAD) + continue + if(A.control_disabled == 1) + continue + . += A + return . + +//Find an active ai with the least borgs. VERBOSE PROCNAME HUH! +/proc/select_active_ai_with_fewest_borgs() + var/mob/living/silicon/ai/selected + var/list/active = active_ais() + for(var/mob/living/silicon/ai/A in active) + if(!selected || (selected.connected_robots > A.connected_robots)) + selected = A + + return selected + +/proc/select_active_ai(var/mob/user) + var/list/ais = active_ais() + if(ais.len) + if(user) . = input(usr,"AI signals detected:", "AI selection") in ais + else . = pick(ais) + return . + +/proc/get_sorted_mobs() + var/list/old_list = getmobs() + var/list/AI_list = list() + var/list/Dead_list = list() + var/list/keyclient_list = list() + var/list/key_list = list() + var/list/logged_list = list() + for(var/named in old_list) + var/mob/M = old_list[named] + if(issilicon(M)) + AI_list |= M + else if(isobserver(M) || M.stat == DEAD) + Dead_list |= M + else if(M.key && M.client) + keyclient_list |= M + else if(M.key) + key_list |= M + else + logged_list |= M + old_list.Remove(named) + var/list/new_list = list() + new_list += AI_list + new_list += keyclient_list + new_list += key_list + new_list += logged_list + new_list += Dead_list + return new_list + +//Returns a list of all mobs with their name +/proc/getmobs() + + var/list/mobs = sortmobs() + var/list/names = list() + var/list/creatures = list() + var/list/namecounts = list() + for(var/mob/M in mobs) + var/name = M.name + if(name in names) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + else + names.Add(name) + namecounts[name] = 1 + if(M.real_name && M.real_name != M.name) + name += " \[[M.real_name]\]" + if(M.stat == DEAD) + if(istype(M, /mob/dead/observer/)) + name += " \[ghost\]" + else + name += " \[dead\]" + creatures[name] = M + + return creatures + +//Orders mobs by type then by name +/proc/sortmobs() + var/list/moblist = list() + var/list/sortmob = sortAtom(GLOB.mob_list) + for(var/mob/living/silicon/ai/M in sortmob) + moblist.Add(M) + if(M.eyeobj) + moblist.Add(M.eyeobj) + for(var/mob/living/silicon/pai/M in sortmob) + moblist.Add(M) + for(var/mob/living/silicon/robot/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/human/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/brain/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/alien/M in sortmob) + moblist.Add(M) + for(var/mob/dead/observer/M in sortmob) + moblist.Add(M) + for(var/mob/new_player/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/slime/M in sortmob) + moblist.Add(M) + for(var/mob/living/simple_animal/M in sortmob) + moblist.Add(M) + return moblist + +// Format a power value in W, kW, MW, or GW. +/proc/DisplayPower(powerused) + if(powerused < 1000) //Less than a kW + return "[powerused] W" + else if(powerused < 1000000) //Less than a MW + return "[round((powerused * 0.001), 0.01)] kW" + else if(powerused < 1000000000) //Less than a GW + return "[round((powerused * 0.000001), 0.001)] MW" + return "[round((powerused * 0.000000001), 0.0001)] GW" + +//E = MC^2 +/proc/convert2energy(var/M) + var/E = M*(SPEED_OF_LIGHT_SQ) + return E + +//M = E/C^2 +/proc/convert2mass(var/E) + var/M = E/(SPEED_OF_LIGHT_SQ) + return M + +//Forces a variable to be posative +/proc/modulus(var/M) + if(M >= 0) + return M + if(M < 0) + return -M + +/proc/get_mob_by_ckey(key) + if(!key) + return + for(var/mob/M in GLOB.mob_list) + if(M.ckey == key) + return M + +// Returns the atom sitting on the turf. +// For example, using this on a disk, which is in a bag, on a mob, will return the mob because it's on the turf. +/proc/get_atom_on_turf(var/atom/movable/M) + var/atom/loc = M + while(loc && loc.loc && !istype(loc.loc, /turf/)) + loc = loc.loc + return loc + +/* +Returns 1 if the chain up to the area contains the given typepath +0 otherwise +*/ +/atom/proc/is_found_within(var/typepath) + var/atom/A = src + while(A.loc) + if(istype(A.loc, typepath)) + return 1 + A = A.loc + return 0 + +// the on-close client verb +// called when a browser popup window is closed after registering with proc/onclose() +// if a valid atom reference is supplied, call the atom's Topic() with "close=1" +// otherwise, just reset the client mob's machine var. + + +// returns the turf located at the map edge in the specified direction relative to A +// used for mass driver +/proc/get_edge_target_turf(var/atom/A, var/direction) + + var/turf/target = locate(A.x, A.y, A.z) + if(!A || !target) + return 0 + //since NORTHEAST == NORTH & EAST, etc, doing it this way allows for diagonal mass drivers in the future + //and isn't really any more complicated + + // Note diagonal directions won't usually be accurate + if(direction & NORTH) + target = locate(target.x, world.maxy, target.z) + if(direction & SOUTH) + target = locate(target.x, 1, target.z) + if(direction & EAST) + target = locate(world.maxx, target.y, target.z) + if(direction & WEST) + target = locate(1, target.y, target.z) + + return target + +// returns turf relative to A in given direction at set range +// result is bounded to map size +// note range is non-pythagorean +// used for disposal system +/proc/get_ranged_target_turf(var/atom/A, var/direction, var/range) + + var/x = A.x + var/y = A.y + if(direction & NORTH) + y = min(world.maxy, y + range) + if(direction & SOUTH) + y = max(1, y - range) + if(direction & EAST) + x = min(world.maxx, x + range) + if(direction & WEST) + x = max(1, x - range) + + return locate(x,y,A.z) + + +// returns turf relative to A offset in dx and dy tiles +// bound to map limits +/proc/get_offset_target_turf(var/atom/A, var/dx, var/dy) + var/x = min(world.maxx, max(1, A.x + dx)) + var/y = min(world.maxy, max(1, A.y + dy)) + return locate(x,y,A.z) + +//Makes sure MIDDLE is between LOW and HIGH. If not, it adjusts it. Returns the adjusted value. +/proc/between(var/low, var/middle, var/high) + return max(min(middle, high), low) + +proc/arctan(x) + var/y=arcsin(x/sqrt(1+x*x)) + return y + +//returns random gauss number +proc/GaussRand(var/sigma) + var/x,y,rsq + do + x=2*rand()-1 + y=2*rand()-1 + rsq=x*x+y*y + while(rsq>1 || !rsq) + return sigma*y*sqrt(-2*log(rsq)/rsq) + +//returns random gauss number, rounded to 'roundto' +proc/GaussRandRound(var/sigma,var/roundto) + return round(GaussRand(sigma),roundto) + +//Will return the contents of an atom recursivly to a depth of 'searchDepth' +/atom/proc/GetAllContents(searchDepth = 5) + var/list/toReturn = list() + + for(var/atom/part in contents) + toReturn += part + if(part.contents.len && searchDepth) + toReturn += part.GetAllContents(searchDepth - 1) + + return toReturn + +//Searches contents of the atom and returns the sum of all w_class of obj/item within +/atom/proc/GetTotalContentsWeight(searchDepth = 5) + var/weight = 0 + var/list/content = GetAllContents(searchDepth) + for(var/obj/item/I in content) + weight += I.w_class + return weight + +//Step-towards method of determining whether one atom can see another. Similar to viewers() +/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate. + var/turf/current = get_turf(source) + var/turf/target_turf = get_turf(target) + var/steps = 1 + + if(current != target_turf) + current = get_step_towards(current, target_turf) + while(current != target_turf) + if(steps > length) + return 0 + if(current.opacity) + return 0 + for(var/thing in current) + var/atom/A = thing + if(A.opacity) + return 0 + current = get_step_towards(current, target_turf) + steps++ + + return 1 + +proc/is_blocked_turf(turf/T, exclude_mobs) + if(T.density) + return 1 + for(var/i in T) + var/atom/A = i + if(A.density && (!exclude_mobs || !ismob(A))) + return 1 + return 0 + +/proc/get_step_towards2(var/atom/ref , var/atom/trg) + var/base_dir = get_dir(ref, get_step_towards(ref,trg)) + var/turf/temp = get_step_towards(ref,trg) + + if(is_blocked_turf(temp)) + var/dir_alt1 = turn(base_dir, 90) + var/dir_alt2 = turn(base_dir, -90) + var/turf/turf_last1 = temp + var/turf/turf_last2 = temp + var/free_tile = null + var/breakpoint = 0 + + while(!free_tile && breakpoint < 10) + if(!is_blocked_turf(turf_last1)) + free_tile = turf_last1 + break + if(!is_blocked_turf(turf_last2)) + free_tile = turf_last2 + break + turf_last1 = get_step(turf_last1,dir_alt1) + turf_last2 = get_step(turf_last2,dir_alt2) + breakpoint++ + + if(!free_tile) return get_step(ref, base_dir) + else return get_step_towards(ref,free_tile) + + else return get_step(ref, base_dir) + +//Takes: Anything that could possibly have variables and a varname to check. +//Returns: 1 if found, 0 if not. +/proc/hasvar(var/datum/A, var/varname) + if(A.vars.Find(lowertext(varname))) return 1 + else return 0 + +//Returns: all the areas in the world +/proc/return_areas() + var/list/area/areas = list() + for(var/area/A in world) + areas += A + return areas + +//Returns: all the areas in the world, sorted. +/proc/return_sorted_areas() + return sortAtom(return_areas()) + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all areas of that type in the world. +/proc/get_areas(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/areas = new/list() + for(var/area/N in world) + if(istype(N, areatype)) areas += N + return areas + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all turfs in areas of that type of that type in the world. +/proc/get_area_turfs(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/turfs = new/list() + for(var/area/N in world) + if(istype(N, areatype)) + for(var/turf/T in N) turfs += T + return turfs + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world. +/proc/get_area_all_atoms(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/atoms = new/list() + for(var/area/N in world) + if(istype(N, areatype)) + for(var/atom/A in N) + atoms += A + return atoms + +/datum/coords //Simple datum for storing coordinates. + var/x_pos = null + var/y_pos = null + var/z_pos = null + +/area/proc/move_contents_to(var/area/A, var/turftoleave=null, var/direction = null) + //Takes: Area. Optional: turf type to leave behind. + //Returns: Nothing. + //Notes: Attempts to move the contents of one area to another area. + // Movement based on lower left corner. Tiles that do not fit + // into the new area will not be moved. + + if(!A || !src) return 0 + + var/list/turfs_src = get_area_turfs(src.type) + var/list/turfs_trg = get_area_turfs(A.type) + + var/src_min_x = 0 + var/src_min_y = 0 + for(var/turf/T in turfs_src) + if(T.x < src_min_x || !src_min_x) src_min_x = T.x + if(T.y < src_min_y || !src_min_y) src_min_y = T.y + + var/trg_min_x = 0 + var/trg_min_y = 0 + for(var/turf/T in turfs_trg) + if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x + if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y + + var/list/refined_src = new/list() + for(var/turf/T in turfs_src) + refined_src += T + refined_src[T] = new/datum/coords + var/datum/coords/C = refined_src[T] + C.x_pos = (T.x - src_min_x) + C.y_pos = (T.y - src_min_y) + + var/list/refined_trg = new/list() + for(var/turf/T in turfs_trg) + refined_trg += T + refined_trg[T] = new/datum/coords + var/datum/coords/C = refined_trg[T] + C.x_pos = (T.x - trg_min_x) + C.y_pos = (T.y - trg_min_y) + + var/list/fromupdate = new/list() + var/list/toupdate = new/list() + + moving: + for(var/turf/T in refined_src) + var/datum/coords/C_src = refined_src[T] + for(var/turf/B in refined_trg) + var/datum/coords/C_trg = refined_trg[B] + if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) + + var/old_dir1 = T.dir + var/old_icon_state1 = T.icon_state + var/old_icon1 = T.icon + + var/turf/X = B.ChangeTurf(T.type) + X.dir = old_dir1 + X.icon_state = old_icon_state1 + X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi + + // Give the new turf our air, if simulated + if(istype(X, /turf/simulated) && istype(T, /turf/simulated)) + var/turf/simulated/sim = X + sim.copy_air_with_tile(T) + + + /* Quick visual fix for some weird shuttle corner artefacts when on transit space tiles */ + if(direction && findtext(X.icon_state, "swall_s")) + + // Spawn a new shuttle corner object + var/obj/corner = new() + corner.loc = X + corner.density = 1 + corner.anchored = 1 + corner.icon = X.icon + corner.icon_state = replacetext(X.icon_state, "_s", "_f") + corner.tag = "delete me" + corner.name = "wall" + + // Find a new turf to take on the property of + var/turf/nextturf = get_step(corner, direction) + if(!nextturf || !istype(nextturf, /turf/space)) + nextturf = get_step(corner, turn(direction, 180)) + + + // Take on the icon of a neighboring scrolling space icon + X.icon = nextturf.icon + X.icon_state = nextturf.icon_state + + + for(var/obj/O in T) + + // Reset the shuttle corners + if(O.tag == "delete me") + X.icon = 'icons/turf/shuttle.dmi' + X.icon_state = replacetext(O.icon_state, "_f", "_s") // revert the turf to the old icon_state + X.name = "wall" + qdel(O) // prevents multiple shuttle corners from stacking + continue + if(!istype(O,/obj)) continue + O.loc.Exited(O) + O.setLoc(X,teleported=1) + O.loc.Entered(O) + for(var/mob/M in T) + if(!M.move_on_shuttle) + continue + M.loc = X + +// var/area/AR = X.loc + +// if(AR.lighting_use_dynamic) //TODO: rewrite this code so it's not messed by lighting ~Carn +// X.opacity = !X.opacity +// X.set_opacity(!X.opacity) + + toupdate += X + + if(turftoleave) + fromupdate += T.ChangeTurf(turftoleave) + else + T.ChangeTurf(T.baseturf) + + refined_src -= T + refined_trg -= B + continue moving + + if(toupdate.len) + for(var/turf/simulated/T1 in toupdate) + SSair.remove_from_active(T1) + T1.CalculateAdjacentTurfs() + SSair.add_to_active(T1,1) + + if(fromupdate.len) + for(var/turf/simulated/T2 in fromupdate) + SSair.remove_from_active(T2) + T2.CalculateAdjacentTurfs() + SSair.add_to_active(T2,1) + + + + +/proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0, var/atom/newloc = null) + if(!original) + return null + + var/obj/O = null + + if(sameloc) + O=new original.type(original.loc) + else + O=new original.type(newloc) + + if(perfectcopy) + if((O) && (original)) + var/static/list/forbidden_vars = list("type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group") + + for(var/V in original.vars - forbidden_vars) + if(istype(original.vars[V],/list)) + var/list/L = original.vars[V] + O.vars[V] = L.Copy() + else if(istype(original.vars[V],/datum)) + continue // this would reference the original's object, that will break when it is used or deleted. + else + O.vars[V] = original.vars[V] + if(istype(O)) + O.update_icon() + return O + +/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0 ) + //Takes: Area. Optional: If it should copy to areas that don't have plating + //Returns: Nothing. + //Notes: Attempts to move the contents of one area to another area. + // Movement based on lower left corner. Tiles that do not fit + // into the new area will not be moved. + + if(!A || !src) return 0 + + var/list/turfs_src = get_area_turfs(src.type) + var/list/turfs_trg = get_area_turfs(A.type) + + var/src_min_x = 0 + var/src_min_y = 0 + for(var/turf/T in turfs_src) + if(T.x < src_min_x || !src_min_x) src_min_x = T.x + if(T.y < src_min_y || !src_min_y) src_min_y = T.y + + var/trg_min_x = 0 + var/trg_min_y = 0 + for(var/turf/T in turfs_trg) + if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x + if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y + + var/list/refined_src = new/list() + for(var/turf/T in turfs_src) + refined_src += T + refined_src[T] = new/datum/coords + var/datum/coords/C = refined_src[T] + C.x_pos = (T.x - src_min_x) + C.y_pos = (T.y - src_min_y) + + var/list/refined_trg = new/list() + for(var/turf/T in turfs_trg) + refined_trg += T + refined_trg[T] = new/datum/coords + var/datum/coords/C = refined_trg[T] + C.x_pos = (T.x - trg_min_x) + C.y_pos = (T.y - trg_min_y) + + var/list/toupdate = new/list() + + var/copiedobjs = list() + + + moving: + for(var/turf/T in refined_src) + var/datum/coords/C_src = refined_src[T] + for(var/turf/B in refined_trg) + var/datum/coords/C_trg = refined_trg[B] + if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) + + var/old_dir1 = T.dir + var/old_icon_state1 = T.icon_state + var/old_icon1 = T.icon + + if(platingRequired) + if(istype(B, /turf/space)) + continue moving + + var/turf/X = new T.type(B) + X.dir = old_dir1 + X.icon_state = old_icon_state1 + X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi + + + var/list/objs = new/list() + var/list/newobjs = new/list() + var/list/mobs = new/list() + var/list/newmobs = new/list() + + for(var/obj/O in T) + + if(!istype(O,/obj)) + continue + + objs += O + + + for(var/obj/O in objs) + newobjs += DuplicateObject(O , 1) + + + for(var/obj/O in newobjs) + O.loc = X + + for(var/mob/M in T) + + if(!M.move_on_shuttle) + continue + mobs += M + + for(var/mob/M in mobs) + newmobs += DuplicateObject(M , 1) + + for(var/mob/M in newmobs) + M.loc = X + + copiedobjs += newobjs + copiedobjs += newmobs + + + + for(var/V in T.vars) + if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity", "group"))) + X.vars[V] = T.vars[V] + +// var/area/AR = X.loc + +// if(AR.lighting_use_dynamic) +// X.opacity = !X.opacity +// X.sd_set_opacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn + + toupdate += X + + refined_src -= T + refined_trg -= B + continue moving + + + + if(toupdate.len) + for(var/turf/simulated/T1 in toupdate) + T1.CalculateAdjacentTurfs() + SSair.add_to_active(T1,1) + + + return copiedobjs + + + +proc/get_cardinal_dir(atom/A, atom/B) + var/dx = abs(B.x - A.x) + var/dy = abs(B.y - A.y) + return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) + +//chances are 1:value. anyprob(1) will always return true +proc/anyprob(value) + return (rand(1,value)==value) + +proc/view_or_range(distance = world.view , center = usr , type) + switch(type) + if("view") + . = view(distance,center) + if("range") + . = range(distance,center) + return + +proc/oview_or_orange(distance = world.view , center = usr , type) + switch(type) + if("view") + . = oview(distance,center) + if("range") + . = orange(distance,center) + return + +proc/get_mob_with_client_list() + var/list/mobs = list() + for(var/mob/M in GLOB.mob_list) + if(M.client) + mobs += M + return mobs + + +/proc/parse_zone(zone) + if(zone == "r_hand") return "right hand" + else if(zone == "l_hand") return "left hand" + else if(zone == "l_arm") return "left arm" + else if(zone == "r_arm") return "right arm" + else if(zone == "l_leg") return "left leg" + else if(zone == "r_leg") return "right leg" + else if(zone == "l_foot") return "left foot" + else if(zone == "r_foot") return "right foot" + else if(zone == "l_hand") return "left hand" + else if(zone == "r_hand") return "right hand" + else if(zone == "l_foot") return "left foot" + else if(zone == "r_foot") return "right foot" + else return zone + +/* + + Gets the turf this atom's *ICON* appears to inhabit + It takes into account: + * Pixel_x/y + * Matrix x/y + + NOTE: if your atom has non-standard bounds then this proc + will handle it, but: + * if the bounds are even, then there are an even amount of "middle" turfs, the one to the EAST, NORTH, or BOTH is picked + (this may seem bad, but you're atleast as close to the center of the atom as possible, better than byond's default loc being all the way off) + * if the bounds are odd, the true middle turf of the atom is returned + +*/ + +/proc/get_turf_pixel(atom/movable/AM) + if(!istype(AM)) + return + + //Find AM's matrix so we can use it's X/Y pixel shifts + var/matrix/M = matrix(AM.transform) + + var/pixel_x_offset = AM.pixel_x + M.get_x_shift() + var/pixel_y_offset = AM.pixel_y + M.get_y_shift() + + //Irregular objects + if(AM.bound_height != world.icon_size || AM.bound_width != world.icon_size) + var/icon/AMicon = icon(AM.icon, AM.icon_state) + pixel_x_offset += ((AMicon.Width()/world.icon_size)-1)*(world.icon_size*0.5) + pixel_y_offset += ((AMicon.Height()/world.icon_size)-1)*(world.icon_size*0.5) + qdel(AMicon) + + //DY and DX + var/rough_x = round(round(pixel_x_offset,world.icon_size)/world.icon_size) + var/rough_y = round(round(pixel_y_offset,world.icon_size)/world.icon_size) + + //Find coordinates + var/turf/T = get_turf(AM) //use AM's turfs, as it's coords are the same as AM's AND AM's coords are lost if it is inside another atom + if(!T) + return null + var/final_x = T.x + rough_x + var/final_y = T.y + rough_y + + if(final_x || final_y) + return locate(final_x, final_y, T.z) + +//Finds the distance between two atoms, in pixels +//centered = 0 counts from turf edge to edge +//centered = 1 counts from turf center to turf center +//of course mathematically this is just adding world.icon_size on again +/proc/getPixelDistance(var/atom/A, var/atom/B, var/centered = 1) + if(!istype(A)||!istype(B)) + return 0 + . = bounds_dist(A, B) + sqrt((((A.pixel_x+B.pixel_x)**2) + ((A.pixel_y+B.pixel_y)**2))) + if(centered) + . += world.icon_size + +/proc/get(atom/loc, type) + while(loc) + if(istype(loc, type)) + return loc + loc = loc.loc + return null + +/proc/get_turf_or_move(turf/location) + return get_turf(location) + + +//For objects that should embed, but make no sense being is_sharp or is_pointed() +//e.g: rods +var/list/can_embed_types = typecacheof(list( + /obj/item/stack/rods, + /obj/item/pipe)) + +/proc/can_embed(obj/item/W) + if(is_sharp(W)) + return 1 + if(is_pointed(W)) + return 1 + + if(is_type_in_typecache(W, can_embed_types)) + return 1 + +//Quick type checks for some tools +var/global/list/common_tools = list( +/obj/item/stack/cable_coil, +/obj/item/wrench, +/obj/item/weldingtool, +/obj/item/screwdriver, +/obj/item/wirecutters, +/obj/item/multitool, +/obj/item/crowbar) + +/proc/istool(O) + if(O && is_type_in_list(O, common_tools)) + return 1 + return 0 + +/proc/iswrench(O) + if(istype(O, /obj/item/wrench)) + return 1 + return 0 + +/proc/iswelder(O) + if(istype(O, /obj/item/weldingtool)) + return 1 + return 0 + +/proc/iscoil(O) + if(istype(O, /obj/item/stack/cable_coil)) + return 1 + return 0 + +/proc/iswirecutter(O) + if(istype(O, /obj/item/wirecutters)) + return 1 + return 0 + +/proc/isscrewdriver(O) + if(istype(O, /obj/item/screwdriver)) + return 1 + return 0 + +/proc/ismultitool(O) + if(istype(O, /obj/item/multitool)) + return 1 + return 0 + +/proc/iscrowbar(O) + if(istype(O, /obj/item/crowbar)) + return 1 + return 0 + +/proc/ispowertool(O)//used to check if a tool can force powered doors + if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw)) + return TRUE + return FALSE + +/proc/iswire(O) + if(istype(O, /obj/item/stack/cable_coil)) + return 1 + return 0 + +/proc/is_hot(obj/item/W as obj) + if(istype(W, /obj/item/weldingtool)) + var/obj/item/weldingtool/O = W + if(O.isOn()) + return 2500 + else + return 0 + if(istype(W, /obj/item/lighter)) + var/obj/item/lighter/O = W + if(O.lit) + return 1500 + else + return 0 + if(istype(W, /obj/item/match)) + var/obj/item/match/O = W + if(O.lit == 1) + return 1000 + else + return 0 + if(istype(W, /obj/item/clothing/mask/cigarette)) + var/obj/item/clothing/mask/cigarette/O = W + if(O.lit) + return 1000 + else + return 0 + if(istype(W, /obj/item/candle)) + var/obj/item/candle/O = W + if(O.lit) + return 1000 + else + return 0 + if(istype(W, /obj/item/flashlight/flare)) + var/obj/item/flashlight/flare/O = W + if(O.on) + return 1000 + else + return 0 + if(istype(W, /obj/item/gun/energy/plasmacutter)) + return 3800 + if(istype(W, /obj/item/melee/energy)) + var/obj/item/melee/energy/O = W + if(O.active) + return 3500 + else + return 0 + if(istype(W, /obj/item/assembly/igniter)) + return 20000 + else + return 0 + +//Whether or not the given item counts as sharp in terms of dealing damage +/proc/is_sharp(obj/O) + if(!O) + return 0 + if(O.sharp) + return 1 + return 0 + +/proc/is_surgery_tool(obj/item/W as obj) + return ( \ + istype(W, /obj/item/scalpel) || \ + istype(W, /obj/item/hemostat) || \ + istype(W, /obj/item/retractor) || \ + istype(W, /obj/item/cautery) || \ + istype(W, /obj/item/bonegel) || \ + istype(W, /obj/item/bonesetter) + ) + +/proc/reverse_direction(var/dir) + switch(dir) + if(NORTH) + return SOUTH + if(NORTHEAST) + return SOUTHWEST + if(EAST) + return WEST + if(SOUTHEAST) + return NORTHWEST + if(SOUTH) + return NORTH + if(SOUTHWEST) + return NORTHEAST + if(WEST) + return EAST + if(NORTHWEST) + return SOUTHEAST + +/* +Checks if that loc and dir has a item on the wall +*/ +var/list/static/global/wall_items = typecacheof(list(/obj/machinery/power/apc, /obj/machinery/alarm, + /obj/item/radio/intercom, /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, + /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, + /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/door_control, + /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/airlock, + /obj/item/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, + /obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment, + /obj/structure/sign)) + +/proc/gotwallitem(loc, dir) + for(var/obj/O in loc) + if(is_type_in_typecache(O, wall_items)) + //Direction works sometimes + if(O.dir == dir) + return 1 + + //Some stuff doesn't use dir properly, so we need to check pixel instead + switch(dir) + if(SOUTH) + if(O.pixel_y > 10) + return 1 + if(NORTH) + if(O.pixel_y < -10) + return 1 + if(WEST) + if(O.pixel_x > 10) + return 1 + if(EAST) + if(O.pixel_x < -10) + return 1 + + //Some stuff is placed directly on the wallturf (signs) + for(var/obj/O in get_step(loc, dir)) + if(is_type_in_typecache(O, wall_items)) + if(abs(O.pixel_x) <= 10 && abs(O.pixel_y) <= 10) + return 1 + return 0 + + +proc/get_angle(atom/a, atom/b) + return atan2(b.y - a.y, b.x - a.x) + +proc/atan2(x, y) + if(!x && !y) return 0 + return y >= 0 ? arccos(x / sqrt(x * x + y * y)) : -arccos(x / sqrt(x * x + y * y)) + +/proc/format_text(text) + return replacetext(replacetext(text,"\proper ",""),"\improper ","") + +/* +Standard way to write links -Sayu +*/ + +/proc/topic_link(var/datum/D, var/arglist, var/content) + if(istype(arglist,/list)) + arglist = list2params(arglist) + return "[content]" + + + +/proc/get_location_accessible(mob/M, location) + var/covered_locations = 0 //based on body_parts_covered + var/face_covered = 0 //based on flags_inv + var/eyesmouth_covered = 0 //based on flags_cover + if(iscarbon(M)) + var/mob/living/carbon/C = M + for(var/obj/item/clothing/I in list(C.back, C.wear_mask)) + covered_locations |= I.body_parts_covered + face_covered |= I.flags_inv + eyesmouth_covered |= I.flags_cover + if(ishuman(C)) + var/mob/living/carbon/human/H = C + for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.head, H.r_ear, H.l_ear)) + covered_locations |= I.body_parts_covered + face_covered |= I.flags_inv + eyesmouth_covered |= I.flags_cover + + switch(location) + if("head") + if(covered_locations & HEAD) + return 0 + if("eyes") + if(face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES || eyesmouth_covered & HEADCOVERSEYES) + return 0 + if("mouth") + if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH) + return 0 + if("chest") + if(covered_locations & UPPER_TORSO) + return 0 + if("groin") + if(covered_locations & LOWER_TORSO) + return 0 + if("l_arm") + if(covered_locations & ARM_LEFT) + return 0 + if("r_arm") + if(covered_locations & ARM_RIGHT) + return 0 + if("l_leg") + if(covered_locations & LEG_LEFT) + return 0 + if("r_leg") + if(covered_locations & LEG_RIGHT) + return 0 + if("l_hand") + if(covered_locations & HAND_LEFT) + return 0 + if("r_hand") + if(covered_locations & HAND_RIGHT) + return 0 + if("l_foot") + if(covered_locations & FOOT_LEFT) + return 0 + if("r_foot") + if(covered_locations & FOOT_RIGHT) + return 0 + + return 1 + +/proc/check_target_facings(mob/living/initator, mob/living/target) + /*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head. + Given how click code currently works (Nov '13), the initiating mob will be facing the target mob most of the time + That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/ + if(!ismob(target) || target.lying) + //Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side + return FACING_FAILED + if(initator.dir == target.dir) //mobs are facing the same direction + return FACING_SAME_DIR + if(is_A_facing_B(initator, target) && is_A_facing_B(target, initator)) //mobs are facing each other + return FACING_EACHOTHER + if(initator.dir + 2 == target.dir || initator.dir - 2 == target.dir || initator.dir + 6 == target.dir || initator.dir - 6 == target.dir) //Initating mob is looking at the target, while the target mob is looking in a direction perpendicular to the 1st + return FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR + + +atom/proc/GetTypeInAllContents(typepath) + var/list/processing_list = list(src) + var/list/processed = list() + + var/atom/found = null + + while(processing_list.len && found==null) + var/atom/A = processing_list[1] + if(istype(A, typepath)) + found = A + + processing_list -= A + + for(var/atom/a in A) + if(!(a in processed)) + processing_list |= a + + processed |= A + + return found + +/proc/random_step(atom/movable/AM, steps, chance) + var/initial_chance = chance + while(steps > 0) + if(prob(chance)) + step(AM, pick(alldirs)) + chance = max(chance - (initial_chance / steps), 0) + steps-- + +/proc/get_random_colour(var/simple, var/lower, var/upper) + var/colour + if(simple) + colour = pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")) + else + for(var/i=1;i<=3;i++) + var/temp_col = "[num2hex(rand(lower,upper))]" + if(length(temp_col )<2) + temp_col = "0[temp_col]" + colour += temp_col + return colour + +/proc/get_distant_turf(var/turf/T,var/direction,var/distance) + if(!T || !direction || !distance) return + + var/dest_x = T.x + var/dest_y = T.y + var/dest_z = T.z + + if(direction & NORTH) + dest_y = min(world.maxy, dest_y+distance) + if(direction & SOUTH) + dest_y = max(0, dest_y-distance) + if(direction & EAST) + dest_x = min(world.maxy, dest_x+distance) + if(direction & WEST) + dest_x = max(0, dest_x-distance) + + return locate(dest_x,dest_y,dest_z) + +var/mob/dview/dview_mob = new + +//Version of view() which ignores darkness, because BYOND doesn't have it. +/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) + if(!center) + return + + dview_mob.loc = center + + dview_mob.see_invisible = invis_flags + + . = view(range, dview_mob) + dview_mob.loc = null + +/mob/dview + invisibility = 101 + density = 0 + move_force = 0 + pull_force = 0 + move_resist = INFINITY + simulated = 0 + canmove = FALSE + see_in_dark = 1e6 + +/mob/dview/New() //For whatever reason, if this isn't called, then BYOND will throw a type mismatch runtime when attempting to add this to the mobs list. -Fox + +/mob/dview/Destroy() + // should never be deleted + return QDEL_HINT_LETMELIVE + +/proc/IsValidSrc(A) + if(istype(A, /datum)) + var/datum/D = A + return !QDELETED(D) + if(istype(A, /client)) + return TRUE + return FALSE + +//can a window be here, or is there a window blocking it? +/proc/valid_window_location(turf/T, dir_to_check) + if(!T) + return FALSE + for(var/obj/O in T) + if(istype(O, /obj/machinery/door/window) && (O.dir == dir_to_check || dir_to_check == FULLTILE_WINDOW_DIR)) + return FALSE + if(istype(O, /obj/structure/windoor_assembly)) + var/obj/structure/windoor_assembly/W = O + if(W.ini_dir == dir_to_check || dir_to_check == FULLTILE_WINDOW_DIR) + return FALSE + if(istype(O, /obj/structure/window)) + var/obj/structure/window/W = O + if(W.ini_dir == dir_to_check || W.ini_dir == FULLTILE_WINDOW_DIR || dir_to_check == FULLTILE_WINDOW_DIR) + return FALSE + return TRUE + +//Get the dir to the RIGHT of dir if they were on a clock +//NORTH --> NORTHEAST +/proc/get_clockwise_dir(dir) + . = angle2dir(dir2angle(dir)+45) + +//Get the dir to the LEFT of dir if they were on a clock +//NORTH --> NORTHWEST +/proc/get_anticlockwise_dir(dir) + . = angle2dir(dir2angle(dir)-45) + + +//Compare A's dir, the clockwise dir of A and the anticlockwise dir of A +//To the opposite dir of the dir returned by get_dir(B,A) +//If one of them is a match, then A is facing B +/proc/is_A_facing_B(atom/A, atom/B) + if(!istype(A) || !istype(B)) + return 0 + if(isliving(A)) + var/mob/living/LA = A + if(LA.lying) + return 0 + var/goal_dir = angle2dir(dir2angle(get_dir(B, A)+180)) + var/clockwise_A_dir = get_clockwise_dir(A.dir) + var/anticlockwise_A_dir = get_anticlockwise_dir(B.dir) + + if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir) + return 1 + return 0 + +//This is just so you can stop an orbit. +//orbit() can run without it (swap orbiting for A) +//but then you can never stop it and that's just silly. +/atom/movable/var/atom/orbiting = null + +//A: atom to orbit +//radius: range to orbit at, radius of the circle formed by orbiting +//clockwise: whether you orbit clockwise or anti clockwise +//rotation_speed: how fast to rotate +//rotation_segments: the resolution of the orbit circle, less = a more block circle, this can be used to produce hexagons (6 segments) triangles (3 segments), and so on, 36 is the best default. +//pre_rotation: Chooses to rotate src 90 degress towards the orbit dir (clockwise/anticlockwise), useful for things to go "head first" like ghosts +//lockinorbit: Forces src to always be on A's turf, otherwise the orbit cancels when src gets too far away (eg: ghosts) + +/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE, forceMove = FALSE) + if(!istype(A)) + return + + if(orbiting) + stop_orbit() + + orbiting = A + var/matrix/initial_transform = matrix(transform) + var/lastloc = loc + + //Head first! + if(pre_rotation) + var/matrix/M = matrix(transform) + var/pre_rot = 90 + if(!clockwise) + pre_rot = -90 + M.Turn(pre_rot) + transform = M + + var/matrix/shift = matrix(transform) + shift.Translate(0,radius) + transform = shift + + SpinAnimation(rotation_speed, -1, clockwise, rotation_segments) + + //we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit + transform = initial_transform + while(orbiting && orbiting == A && A.loc) + var/targetloc = get_turf(A) + if(!lockinorbit && loc != lastloc && loc != targetloc) + break + if(forceMove) + forceMove(targetloc) + else + loc = targetloc + lastloc = loc + sleep(0.6) + + if(orbiting == A) //make sure we haven't started orbiting something else. + orbiting = null + SpinAnimation(0,0) + + + +/atom/movable/proc/stop_orbit() + orbiting = null + +//Centers an image. +//Requires: +//The Image +//The x dimension of the icon file used in the image +//The y dimension of the icon file used in the image +// eg: center_image(I, 32,32) +// eg2: center_image(I, 96,96) +/proc/center_image(var/image/I, x_dimension = 0, y_dimension = 0) + if(!I) + return + + if(!x_dimension || !y_dimension) + return + + //Get out of here, punk ass kids calling procs needlessly + if((x_dimension == world.icon_size) && (y_dimension == world.icon_size)) + return I + + //Offset the image so that it's bottom left corner is shifted this many pixels + //This makes it infinitely easier to draw larger inhands/images larger than world.iconsize + //but still use them in game + var/x_offset = -((x_dimension/world.icon_size)-1)*(world.icon_size*0.5) + var/y_offset = -((y_dimension/world.icon_size)-1)*(world.icon_size*0.5) + + //Correct values under world.icon_size + if(x_dimension < world.icon_size) + x_offset *= -1 + if(y_dimension < world.icon_size) + y_offset *= -1 + + I.pixel_x = x_offset + I.pixel_y = y_offset + + return I + +//similar function to RANGE_TURFS(), but will search spiralling outwards from the center (like the above, but only turfs) +/proc/spiral_range_turfs(dist=0, center=usr, orange=0) + if(!dist) + if(!orange) + return list(center) + else + return list() + + var/turf/t_center = get_turf(center) + if(!t_center) + return list() + + var/list/L = list() + var/turf/T + var/y + var/x + var/c_dist = 1 + + if(!orange) + L += t_center + + while( c_dist <= dist ) + y = t_center.y + c_dist + x = t_center.x - c_dist + 1 + for(x in x to t_center.x+c_dist) + T = locate(x,y,t_center.z) + if(T) + L += T + + y = t_center.y + c_dist - 1 + x = t_center.x + c_dist + for(y in t_center.y-c_dist to y) + T = locate(x,y,t_center.z) + if(T) + L += T + + y = t_center.y - c_dist + x = t_center.x + c_dist - 1 + for(x in t_center.x-c_dist to x) + T = locate(x,y,t_center.z) + if(T) + L += T + + y = t_center.y - c_dist + 1 + x = t_center.x - c_dist + for(y in y to t_center.y+c_dist) + T = locate(x,y,t_center.z) + if(T) + L += T + c_dist++ + + return L + +//ultra range (no limitations on distance, faster than range for distances > 8); including areas drastically decreases performance +/proc/urange(dist=0, atom/center=usr, orange=0, areas=0) + if(!dist) + if(!orange) + return list(center) + else + return list() + + var/list/turfs = RANGE_TURFS(dist, center) + if(orange) + turfs -= get_turf(center) + . = list() + for(var/V in turfs) + var/turf/T = V + . += T + . += T.contents + if(areas) + . |= T.loc + +/proc/turf_clear(turf/T) + for(var/atom/A in T) + if(A.simulated) + return FALSE + return TRUE + +/proc/screen_loc2turf(scr_loc, turf/origin) + var/tX = splittext(scr_loc, ",") + var/tY = splittext(tX[2], ":") + var/tZ = origin.z + tY = tY[1] + tX = splittext(tX[1], ":") + tX = tX[1] + tX = max(1, min(world.maxx, origin.x + (text2num(tX) - (world.view + 1)))) + tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) + return locate(tX, tY, tZ) + +/proc/get_closest_atom(type, list, source) + var/closest_atom + var/closest_distance + for(var/A in list) + if(!istype(A, type)) + continue + var/distance = get_dist(source, A) + if(!closest_distance) + closest_distance = distance + closest_atom = A + else + if(closest_distance > distance) + closest_distance = distance + closest_atom = A + return closest_atom + +/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) + if(value == FALSE) //nothing should be calling us with a number, so this is safe + value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text + if(isnull(value)) + return + value = trim(value) + if(!isnull(value) && value != "") + matches = filter_fancy_list(matches, value) + + if(matches.len == 0) + return + + var/chosen + if(matches.len == 1) + chosen = matches[1] + else + chosen = input("Select a type", "Pick Type", matches[1]) as null|anything in matches + if(!chosen) + return + chosen = matches[chosen] + return chosen + +/proc/make_types_fancy(var/list/types) + if(ispath(types)) + types = list(types) + . = list() + for(var/type in types) + var/typename = "[type]" + var/static/list/TYPES_SHORTCUTS = list( + //longest paths comes first - otherwise they get shadowed by the more generic ones + /obj/effect/decal/cleanable = "CLEANABLE", + /obj/effect = "EFFECT", + /obj/item/ammo_casing = "AMMO", + /obj/item/book/manual = "MANUAL", + /obj/item/borg/upgrade = "BORG_UPGRADE", + /obj/item/cartridge = "PDA_CART", + /obj/item/clothing/head/helmet/space = "SPESSHELMET", + /obj/item/clothing/head = "HEAD", + /obj/item/clothing/under = "UNIFORM", + /obj/item/clothing/shoes = "SHOES", + /obj/item/clothing/suit = "SUIT", + /obj/item/clothing/gloves = "GLOVES", + /obj/item/clothing/mask/cigarette = "CIGARRETE", // oof + /obj/item/clothing/mask = "MASK", + /obj/item/clothing/glasses = "GLASSES", + /obj/item/clothing = "CLOTHING", + /obj/item/grenade/clusterbuster = "CLUSTERBUSTER", + /obj/item/grenade = "GRENADE", + /obj/item/gun = "GUN", + /obj/item/implant = "IMPLANT", + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", + /obj/item/mecha_parts/mecha_equipment/weapon = "MECHA_WEAPON", + /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", + /obj/item/melee = "MELEE", + /obj/item/mmi = "MMI", + /obj/item/nullrod = "NULLROD", + /obj/item/organ/external = "EXT_ORG", + /obj/item/organ/internal/cyberimp = "CYBERIMP", + /obj/item/organ/internal = "INT_ORG", + /obj/item/organ = "ORGAN", + /obj/item/pda = "PDA", + /obj/item/projectile = "PROJ", + /obj/item/radio/headset = "HEADSET", + /obj/item/reagent_containers/glass/beaker = "BEAKER", + /obj/item/reagent_containers/glass/bottle = "BOTTLE", + /obj/item/reagent_containers/food/pill/patch = "PATCH", + /obj/item/reagent_containers/food/pill = "PILL", + /obj/item/reagent_containers/food/drinks = "DRINK", + /obj/item/reagent_containers/food = "FOOD", + /obj/item/reagent_containers/syringe = "SYRINGE", + /obj/item/reagent_containers = "REAGENT_CONTAINERS", + /obj/item/robot_parts = "ROBOT_PARTS", + /obj/item/seeds = "SEED", + /obj/item/slime_extract = "SLIME_CORE", + /obj/item/spacepod_equipment/weaponry = "POD_WEAPON", + /obj/item/spacepod_equipment = "POD_EQUIP", + /obj/item/stack/sheet/mineral = "MINERAL", + /obj/item/stack/sheet = "SHEET", + /obj/item/stack/tile = "TILE", + /obj/item/stack = "STACK", + /obj/item/stock_parts/cell = "POWERCELL", + /obj/item/stock_parts = "STOCK_PARTS", + /obj/item/storage/firstaid = "FIRSTAID", + /obj/item/storage = "STORAGE", + /obj/item/tank = "GAS_TANK", + /obj/item/toy/crayon = "CRAYON", + /obj/item/toy = "TOY", + /obj/item = "ITEM", + /obj/machinery/atmospherics = "ATMOS_MACH", + /obj/machinery/computer = "CONSOLE", + /obj/machinery/door/airlock = "AIRLOCK", + /obj/machinery/door = "DOOR", + /obj/machinery/kitchen_machine = "KITCHEN", + /obj/machinery/portable_atmospherics/canister = "CANISTER", + /obj/machinery/portable_atmospherics = "PORT_ATMOS", + /obj/machinery/power = "POWER", + /obj/machinery/telecomms = "TCOMMS", + /obj/machinery = "MACHINERY", + /obj/mecha = "MECHA", + /obj/structure/closet/crate = "CRATE", + /obj/structure/closet = "CLOSET", + /obj/structure/statue = "STATUE", + /obj/structure/chair = "CHAIR", // oh no + /obj/structure/bed = "BED", + /obj/structure/chair/stool = "STOOL", + /obj/structure/table = "TABLE", + /obj/structure = "STRUCTURE", + /obj/vehicle = "VEHICLE", + /obj = "O", + /datum = "D", + /turf/simulated/floor = "SIM_FLOOR", + /turf/simulated/wall = "SIM_WALL", + /turf/unsimulated/floor = "UNSIM_FLOOR", + /turf/unsimulated/wall = "UNSIM_WALL", + /turf = "T", + /mob/living/carbon/alien = "XENO", + /mob/living/carbon/human = "HUMAN", + /mob/living/carbon = "CARBON", + /mob/living/silicon/robot = "CYBORG", + /mob/living/silicon/ai = "AI", + /mob/living/silicon = "SILICON", + /mob/living/simple_animal/bot = "BOT", + /mob/living/simple_animal = "SIMPLE", + /mob/living = "LIVING", + /mob = "M" + ) + for(var/tn in TYPES_SHORTCUTS) + if(copytext(typename, 1, length("[tn]/") + 1) == "[tn]/") + typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) + break + .[typename] = type + + +/proc/get_fancy_list_of_atom_types() + var/static/list/pre_generated_list + if(!pre_generated_list) //init + pre_generated_list = make_types_fancy(typesof(/atom)) + return pre_generated_list + + +/proc/get_fancy_list_of_datum_types() + var/static/list/pre_generated_list + if(!pre_generated_list) //init + pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) + return pre_generated_list + + +/proc/filter_fancy_list(list/L, filter as text) + var/list/matches = new + for(var/key in L) + var/value = L[key] + if(findtext("[key]", filter) || findtext("[value]", filter)) + matches[key] = value + return matches + +//Key thing that stops lag. Cornerstone of performance in ss13, Just sitting here, in unsorted.dm. + +//Increases delay as the server gets more overloaded, +//as sleeps aren't cheap and sleeping only to wake up and sleep again is wasteful +#define DELTA_CALC max(((max(TICK_USAGE, world.cpu) / 100) * max(Master.sleep_delta-1,1)), 1) + +//returns the number of ticks slept +/proc/stoplag(initial_delay) + if(!Master || !(Master.current_runlevel & RUNLEVELS_DEFAULT)) + sleep(world.tick_lag) + return 1 + if(!initial_delay) + initial_delay = world.tick_lag + . = 0 + var/i = DS2TICKS(initial_delay) + do + . += CEILING(i*DELTA_CALC, 1) + sleep(i*world.tick_lag*DELTA_CALC) + i *= 2 + while(TICK_USAGE > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) + +#undef DELTA_CALC + +// This proc gets a list of all "points of interest" (poi's) that can be used by admins to track valuable mobs or atoms (such as the nuke disk). +/proc/getpois(mobs_only=0,skip_mindless=0) + var/list/mobs = sortmobs() + var/list/names = list() + var/list/pois = list() + var/list/namecounts = list() + + for(var/mob/M in mobs) + if(skip_mindless && (!M.mind && !M.ckey)) + if(!isbot(M) && !istype(M, /mob/camera/)) + continue + if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins + continue + var/name = M.name + if(name in names) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + else + names.Add(name) + namecounts[name] = 1 + if(M.real_name && M.real_name != M.name) + name += " \[[M.real_name]\]" + if(M.stat == DEAD) + if(istype(M, /mob/dead/observer/)) + name += " \[ghost\]" + else + name += " \[dead\]" + pois[name] = M + + if(!mobs_only) + for(var/atom/A in GLOB.poi_list) + if(!A || !A.loc) + continue + var/name = A.name + if(names.Find(name)) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + else + names.Add(name) + namecounts[name] = 1 + pois[name] = A + + return pois + +/proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20) + var/client/C + if(istype(mob_or_client, /mob)) + var/mob/M = mob_or_client + if(M.client) + C = M.client + else + return + else if(istype(mob_or_client, /client)) + C = mob_or_client + + if(!istype(C)) + return + + C.color = flash_color + spawn(0) + animate(C, color = initial(C.color), time = flash_time) + +#define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255))) + +/proc/make_bit_triplet() + var/list/num_sample = list(1, 2, 3, 4, 5, 6, 7, 8, 9) + var/result = 0 + for(var/i = 0, i < 3, i++) + var/num = pick(num_sample) + num_sample -= num + result += (1 << num) + return result + +/proc/pixel_shift_dir(var/dir, var/amount_x = 32, var/amount_y = 32) //Returns a list with pixel_shift values that will shift an object's icon one tile in the direction passed. + amount_x = min(max(0, amount_x), 32) //No less than 0, no greater than 32. + amount_y = min(max(0, amount_x), 32) + var/list/shift = list("x" = 0, "y" = 0) + switch(dir) + if(NORTH) + shift["y"] = amount_y + if(SOUTH) + shift["y"] = -amount_y + if(EAST) + shift["x"] = amount_x + if(WEST) + shift["x"] = -amount_x + if(NORTHEAST) + shift = list("x" = amount_x, "y" = amount_y) + if(NORTHWEST) + shift = list("x" = -amount_x, "y" = amount_y) + if(SOUTHEAST) + shift = list("x" = amount_x, "y" = -amount_y) + if(SOUTHWEST) + shift = list("x" = -amount_x, "y" = -amount_y) + + return shift + +//Return a list of atoms in a location of a given type. Can be refined to look for pixel-shift. +/proc/get_atoms_of_type(var/atom/here, var/type, var/check_shift, var/shift_x = 0, var/shift_y = 0) + . = list() + if(here) + for(var/atom/thing in here) + if(istype(thing, type) && (check_shift && thing.pixel_x == shift_x && thing.pixel_y == shift_y)) + . += thing + +//gives us the stack trace from CRASH() without ending the current proc. +/proc/stack_trace(msg) + CRASH(msg) + +/datum/proc/stack_trace(msg) + CRASH(msg) + +/proc/pass() + return + +/atom/proc/Shake(pixelshiftx = 15, pixelshifty = 15, duration = 250) + var/initialpixelx = pixel_x + var/initialpixely = pixel_y + var/shiftx = rand(-pixelshiftx,pixelshiftx) + var/shifty = rand(-pixelshifty,pixelshifty) + animate(src, pixel_x = pixel_x + shiftx, pixel_y = pixel_y + shifty, time = 0.2, loop = duration) + pixel_x = initialpixelx + pixel_y = initialpixely + +/proc/params2turf(scr_loc, turf/origin, client/C) + if(!scr_loc) + return null + var/tX = splittext(scr_loc, ",") + var/tY = splittext(tX[2], ":") + var/tZ = origin.z + tY = tY[1] + tX = splittext(tX[1], ":") + tX = tX[1] + var/list/actual_view = getviewsize(C ? C.view : world.view) + tX = Clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx) + tY = Clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy) + return locate(tX, tY, tZ) diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index be5f4867c56..384cfb5f29a 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -12,6 +12,7 @@ GLOBAL_LIST_INIT(mime_names, file2list("config/names/mime.txt")) GLOBAL_LIST_INIT(golem_names, file2list("config/names/golem.txt")) GLOBAL_LIST_INIT(verbs, file2list("config/names/verbs.txt")) +GLOBAL_LIST_INIT(nouns, file2list("config/names/nouns.txt")) GLOBAL_LIST_INIT(adjectives, file2list("config/names/adjectives.txt")) GLOBAL_LIST_INIT(dream_strings, file2list("config/names/dreams.txt")) GLOBAL_LIST_INIT(nightmare_strings, file2list("config/names/nightmares.txt")) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 5780e86a298..15ed4429965 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -1,4 +1,3 @@ - /obj/screen/movable/action_button var/datum/action/linked_action screen_loc = null @@ -6,18 +5,26 @@ /obj/screen/movable/action_button/Click(location,control,params) var/list/modifiers = params2list(params) if(modifiers["shift"]) - moved = 0 + if(locked) + to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") + return TRUE + moved = FALSE usr.update_action_buttons() //redraw buttons that are no longer considered "moved" - return 1 - if(usr.next_move >= world.time) // Is this needed ? + return TRUE + if(modifiers["ctrl"]) + locked = !locked + to_chat(usr, "Action button \"[name]\" [locked ? "" : "un"]locked.") + return TRUE + if(usr.next_click > world.time) return + usr.next_click = world.time + 1 linked_action.Trigger() - return 1 + return TRUE //Hide/Show Action Buttons ... Button /obj/screen/movable/action_button/hide_toggle name = "Hide Buttons" - desc = "Shift-click any button to reset its position. Alt-click to reset all buttons to their default positions." + desc = "Shift-click any button to reset its position, and Control-click it to lock/unlock its position. Alt-click this button to reset all buttons to their default positions." icon = 'icons/mob/actions/actions.dmi' icon_state = "bg_default" var/hidden = 0 @@ -25,9 +32,16 @@ /obj/screen/movable/action_button/hide_toggle/Click(location,control,params) var/list/modifiers = params2list(params) if(modifiers["shift"]) + if(locked) + to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") + return TRUE moved = FALSE usr.update_action_buttons(TRUE) return TRUE + if(modifiers["ctrl"]) + locked = !locked + to_chat(usr, "Action button \"[name]\" [locked ? "" : "un"]locked.") + return TRUE if(modifiers["alt"]) for(var/V in usr.actions) var/datum/action/A = V @@ -69,7 +83,6 @@ var/image/img = image(icon, src, hidden ? "show" : "hide") overlays += img - /obj/screen/movable/action_button/MouseEntered(location,control,params) openToolTip(usr,src,params,title = name,content = desc) @@ -77,7 +90,6 @@ /obj/screen/movable/action_button/MouseExited() closeToolTip(usr) - /mob/proc/update_action_buttons_icon() for(var/X in actions) var/datum/action/A = X @@ -122,7 +134,6 @@ client.screen += hud_used.hide_actions_toggle - #define AB_MAX_COLUMNS 10 /datum/hud/proc/ButtonNumberToScreenCoords(number) // TODO : Make this zero-indexed for readabilty diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 3081880394f..8ce4d64911b 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -177,6 +177,41 @@ desc = "You're severely malnourished. The hunger pains make moving around a chore." icon_state = "starving" +///Vampire "hunger" + +/obj/screen/alert/fat/vampire + name = "Fat" + desc = "You somehow drank too much blood, lardass. Run around the station and lose some weight." + icon_state = "v_fat" + +/obj/screen/alert/full/vampire + name = "Full" + desc = "You feel full and satisfied, but you know you will thirst for more blood soon..." + icon_state = "v_full" + +/obj/screen/alert/well_fed/vampire + name = "Well Fed" + desc = "You feel quite satisfied, but you could do with a bit more blood." + icon_state = "v_well_fed" + +/obj/screen/alert/fed/vampire + name = "Fed" + desc = "You feel moderately satisfied, but a bit more blood wouldn't hurt." + icon_state = "v_fed" + +/obj/screen/alert/hungry/vampire + name = "Hungry" + desc = "You currently thirst for blood." + icon_state = "v_hungry" + +/obj/screen/alert/starving/vampire + name = "Starving" + desc = "You're severely thirsty. The thirst pains make moving around a chore." + icon_state = "v_starving" + +//End of Vampire "hunger" + + /obj/screen/alert/hot name = "Too Hot" desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit." diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index 668e0e67fc7..366931cea33 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -11,6 +11,7 @@ /obj/screen/movable var/snap2grid = FALSE var/moved = FALSE + var/locked = TRUE var/x_off = -16 var/y_off = -16 @@ -20,8 +21,10 @@ /obj/screen/movable/snap snap2grid = TRUE - /obj/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) + if(locked) //no! I am locked! begone! + return + var/list/PM = params2list(params) //No screen-loc information? abort. @@ -47,7 +50,6 @@ moved = screen_loc - //Debug procs /client/proc/test_movable_UI() set category = "Debug" @@ -67,7 +69,6 @@ screen += M - /client/proc/test_snap_UI() set category = "Debug" set name = "Spawn Snap UI Object" @@ -84,4 +85,4 @@ S.screen_loc = screen_l - screen += S \ No newline at end of file + screen += S diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index c583617ac23..91c8d6250b4 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -453,7 +453,6 @@ /obj/screen/healths/corgi icon = 'icons/mob/screen_corgi.dmi' - /obj/screen/healths/guardian name = "summoner health" icon = 'icons/mob/guardian.dmi' @@ -467,14 +466,18 @@ screen_loc = ui_healthdoll var/list/cached_healthdoll_overlays = list() // List of icon states (strings) for overlays +/obj/screen/healthdoll/Click() + if(ishuman(usr)) + var/mob/living/carbon/H = usr + H.check_self_for_injuries() + /obj/screen/component_button var/obj/screen/parent - /obj/screen/component_button/Initialize(mapload, obj/screen/new_parent) . = ..() parent = new_parent /obj/screen/component_button/Click(params) if(parent) - parent.component_click(src, params) \ No newline at end of file + parent.component_click(src, params) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 3f155fa8031..5792aff1725 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -72,6 +72,11 @@ var/assistantlimit = 0 //enables assistant limiting var/assistantratio = 2 //how many assistants to security members + // The AFK subsystem will not be activated if any of the below config values are equal or less than 0 + var/warn_afk_minimum = 0 // How long till you get a warning while being AFK + var/auto_cryo_afk = 0 // How long till you get put into cryo when you're AFK + var/auto_despawn_afk = 0 // How long till you actually despawn in cryo when you're AFK (Not ssd so not automatic) + var/auto_cryo_ssd_mins = 0 var/ssd_warning = 0 @@ -314,6 +319,13 @@ if("shadowling_max_age") config.shadowling_max_age = text2num(value) + if("warn_afk_minimum") + config.warn_afk_minimum = text2num(value) + if("auto_cryo_afk") + config.auto_cryo_afk = text2num(value) + if("auto_despawn_afk") + config.auto_despawn_afk = text2num(value) + if("auto_cryo_ssd_mins") config.auto_cryo_ssd_mins = text2num(value) if("ssd_warning") diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm new file mode 100644 index 00000000000..9f409fd35b4 --- /dev/null +++ b/code/controllers/subsystem/afk.dm @@ -0,0 +1,81 @@ +#define AFK_WARNED 1 +#define AFK_CRYOD 2 + +SUBSYSTEM_DEF(afk) + name = "AFK Watcher" + wait = 300 + flags = SS_BACKGROUND + var/list/afk_players = list() // Associative list. ckey as key and AFK state as value + + +/datum/controller/subsystem/afk/Initialize() + if(config.warn_afk_minimum <= 0 || config.auto_cryo_afk <= 0 || config.auto_despawn_afk <= 0) + flags |= SS_NO_FIRE + +/datum/controller/subsystem/afk/fire() + var/list/toRemove = list() + for(var/mob/living/carbon/human/H in GLOB.living_mob_list) + if(!H.ckey) // Useless non ckey creatures + continue + + var/turf/T + // Only players and players with the AFK watch enabled + // No dead, unconcious, restrained, people without jobs, people on other Z levels than the station or antags + if(!H.client || !H.client.prefs.afk_watch || !H.mind || \ + H.stat || H.restrained() || !H.job || H.mind.special_role || \ + !is_station_level((T = get_turf(H)).z)) // Assign the turf as last. Small optimization + if(afk_players[H.ckey]) + toRemove += H.ckey + continue + + var/mins_afk = round(H.client.inactivity / 600) + if(mins_afk < config.warn_afk_minimum) + if(afk_players[H.ckey]) + toRemove += H.ckey + continue + + if(!afk_players[H.ckey]) + afk_players[H.ckey] = AFK_WARNED + warn(H, "You are AFK for [mins_afk] minutes. You will be cryod after [config.auto_cryo_afk] total minutes and fully despawned after [config.auto_despawn_afk] total minutes. Please move or click in game if you want to avoid being despawned.") + else + var/area/A = T.loc // Turfs loc is the area + if(afk_players[H.ckey] == AFK_WARNED) + if(mins_afk >= config.auto_cryo_afk && A.can_get_auto_cryod) + if(A.fast_despawn) + toRemove += H.ckey + warn(H, "You are have been despawned after being AFK for [mins_afk] minutes. You have been despawned instantly due to you being in a secure area.") + msg_admins(H, mins_afk, T, "forcefully despawned", "AFK in a fast despawn area") + force_cryo_human(H) + else if(cryo_ssd(H)) + afk_players[H.ckey] = AFK_CRYOD + msg_admins(H, mins_afk, T, "put into cryostorage") + warn(H, "You are AFK for [mins_afk] minutes and have been moved to cryostorage. After being AFK for [config.auto_despawn_afk] total minutes you will be fully despawned. Please eject yourself (right click, eject) out of the cryostorage if you want to avoid being despawned.") + + else if(mins_afk >= config.auto_despawn_afk) + var/obj/machinery/cryopod/P = H.loc + msg_admins(H, mins_afk, T, "forcefully despawned") + warn(H, "You are have been despawned after being AFK for [mins_afk] minutes.") + toRemove += H.ckey + P.despawn_occupant() + + removeFromWatchList(toRemove) + +/datum/controller/subsystem/afk/proc/warn(mob/living/carbon/human/H, text) + to_chat(H, text) + SEND_SOUND(H, 'sound/effects/adminhelp.ogg') + if(H.client) + window_flash(H.client) + +/datum/controller/subsystem/afk/proc/msg_admins(mob/living/carbon/human/H, mins_afk, turf/location, action, info) + log_admin("[key_name(H)] has been [action] by the AFK Watcher subsystem after being AFK for [mins_afk] minutes.[info ? " Extra info:" + info : ""]") + message_admins("[key_name_admin(H)] at ([get_area(location).name] [ADMIN_JMP(location)]) has been [action] by the AFK Watcher subsystem after being AFK for [mins_afk] minutes.[info ? " Extra info:" + info : ""]") + +/datum/controller/subsystem/afk/proc/removeFromWatchList(list/toRemove) + for(var/C in toRemove) + for(var/i in 1 to afk_players.len) + if(afk_players[i] == C) + afk_players.Cut(i, i + 1) + break + +#undef AFK_WARNED +#undef AFK_CRYOD \ No newline at end of file diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm new file mode 100644 index 00000000000..f379deec72b --- /dev/null +++ b/code/controllers/subsystem/input.dm @@ -0,0 +1,122 @@ +SUBSYSTEM_DEF(input) + name = "Input" + wait = 1 //SS_TICKER means this runs every tick + init_order = INIT_ORDER_INPUT + flags = SS_TICKER + priority = FIRE_PRIORITY_INPUT + runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY + + var/list/macro_sets + var/list/movement_keys + var/list/alt_movement_keys + +/datum/controller/subsystem/input/Initialize() + setup_default_macro_sets() + + setup_default_movement_keys() + + initialized = TRUE + + refresh_client_macro_sets() + + return ..() + +// This is for when macro sets are eventualy datumized +/datum/controller/subsystem/input/proc/setup_default_macro_sets() + var/list/static/default_macro_sets + + if(default_macro_sets) + macro_sets = default_macro_sets + return + + default_macro_sets = list( + "default" = list( + "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", + "O" = "ooc", + "T" = ".say", + "M" = ".me", + "Back" = "\".winset \\\"input.focus=true input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs + "Any" = "\"KeyDown \[\[*\]\]\"", + "Any+UP" = "\"KeyUp \[\[*\]\]\"", + ), + "old_default" = list( + "Tab" = "\".winset \\\"mainwindow.macro=old_hotkeys map.focus=true input.background-color=[COLOR_INPUT_DISABLED]\\\"\"", + "Ctrl+T" = ".say", + "Ctrl+O" = "ooc", + ), + "old_hotkeys" = list( + "Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", + "O" = "ooc", + "T" = ".say", + "M" = ".me", + "Back" = "\".winset \\\"input.focus=true input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs + "Any" = "\"KeyDown \[\[*\]\]\"", + "Any+UP" = "\"KeyUp \[\[*\]\]\"", + ), + ) + + // Because i'm lazy and don't want to type all these out twice + var/list/old_default = default_macro_sets["old_default"] + + var/list/static/oldmode_keys = list( + "North", "East", "South", "West", + "Northeast", "Southeast", "Northwest", "Southwest", + "Insert", "Delete", "Ctrl", "Alt", + "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", + ) + + for(var/i in 1 to oldmode_keys.len) + var/key = oldmode_keys[i] + old_default[key] = "\"KeyDown [key]\"" + old_default["[key]+UP"] = "\"KeyUp [key]\"" + + var/list/static/oldmode_ctrl_override_keys = list( + "W" = "W", "A" = "A", "S" = "S", "D" = "D", // movement + "1" = "1", "2" = "2", "3" = "3", "4" = "4", // intent + "B" = "B", // resist + "E" = "E", // quick equip + "F" = "F", // intent left + "G" = "G", // intent right + "H" = "H", // stop pulling + "Q" = "Q", // drop + "R" = "R", // throw + "X" = "X", // switch hands + "Y" = "Y", // activate item + "Z" = "Z", // activate item + ) + + for(var/i in 1 to oldmode_ctrl_override_keys.len) + var/key = oldmode_ctrl_override_keys[i] + var/override = oldmode_ctrl_override_keys[key] + old_default["Ctrl+[key]"] = "\"KeyDown [override]\"" + old_default["Ctrl+[key]+UP"] = "\"KeyUp [override]\"" + + macro_sets = default_macro_sets + +// For initially setting up or resetting to default the movement keys +/datum/controller/subsystem/input/proc/setup_default_movement_keys() + var/static/list/default_movement_keys = list( + "W" = NORTH, "A" = WEST, "S" = SOUTH, "D" = EAST, // WASD + "North" = NORTH, "West" = WEST, "South" = SOUTH, "East" = EAST, // Arrow keys & Numpad + ) + var/static/list/azerty_movement_keys = list( + "Z" = NORTH, "Q" = WEST, "S" = SOUTH, "D" = EAST, // WASD + "North" = NORTH, "West" = WEST, "South" = SOUTH, "East" = EAST, // Arrow keys & Numpad + ) + movement_keys = default_movement_keys.Copy() + alt_movement_keys = azerty_movement_keys.Copy() + +// Badmins just wanna have fun ♪ +/datum/controller/subsystem/input/proc/refresh_client_macro_sets() + var/list/clients = GLOB.clients + for(var/i in 1 to clients.len) + var/client/user = clients[i] + user.set_macros() + +/datum/controller/subsystem/input/fire() + var/list/clients = GLOB.clients // Let's sing the list cache song + if(listclearnulls(clients)) // clear nulls before we run keyloop + log_world("Found a null in clients list!") + for(var/i in 1 to clients.len) + var/client/C = clients[i] + C.keyLoop() diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 6a603bd7235..166083b36ff 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -25,9 +25,9 @@ SUBSYSTEM_DEF(jobs) // Only fires every 5 minutes /datum/controller/subsystem/jobs/fire() if(!config.sql_enabled || !config.use_exp_tracking) - return + return update_exp(5,0) - + /datum/controller/subsystem/jobs/proc/SetupOccupations(var/list/faction = list("Station")) occupations = list() var/list/all_jobs = subtypesof(/datum/job) @@ -284,7 +284,7 @@ SUBSYSTEM_DEF(jobs) //Get the players who are ready for(var/mob/new_player/player in GLOB.player_list) - if(player.ready && player.mind && !player.mind.assigned_role) + if(player.ready && player.has_valid_preferences() && player.mind && !player.mind.assigned_role) unassigned += player if(player.client.prefs.randomslot) player.client.prefs.load_random_character_slot(player.client) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index bbe2db385a0..4aa30657778 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -42,11 +42,6 @@ SUBSYSTEM_DEF(ticker) 'sound/music/title1.ogg',\ 'sound/music/title2.ogg',\ 'sound/music/title3.ogg',) - // Setup codephrase - if(!GLOB.syndicate_code_phrase) - GLOB.syndicate_code_phrase = generate_code_phrase() - if(!GLOB.syndicate_code_response) - GLOB.syndicate_code_response = generate_code_phrase() // Map name if(using_map && using_map.name) @@ -197,6 +192,10 @@ SUBSYSTEM_DEF(ticker) //shuttle_controller.setup_shuttle_docks() spawn(0)//Forking here so we dont have to wait for this to finish + if(!GLOB.syndicate_code_phrase) + GLOB.syndicate_code_phrase = generate_code_phrase() + if(!GLOB.syndicate_code_response) + GLOB.syndicate_code_response = generate_code_phrase() mode.post_setup() //Cleanup some stuff for(var/obj/effect/landmark/start/S in GLOB.landmarks_list) diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 60718af6525..f694b6d2e75 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -21,7 +21,7 @@ /client/proc/debug_controller(controller in list("failsafe", "Master", "Ticker", "Air", "Jobs", "Sun", "Radio", "Configuration", "pAI", "Cameras", "Garbage", "Event", "Alarm", "Nano", "Vote", "Fires", - "Mob", "NPC Pool", "Shuttle", "Timer", "Weather", "Space", "Mob Hunt Server")) + "Mob", "NPC Pool", "Shuttle", "Timer", "Weather", "Space", "Mob Hunt Server","Input")) set category = "Debug" set name = "Debug Controller" set desc = "Debug the various periodic loop controllers for the game (be careful!)" @@ -97,5 +97,8 @@ if("Mob Hunt Server") debug_variables(SSmob_hunt) feedback_add_details("admin_verb","DMobHuntServer") + if("Input") + debug_variables(SSinput) + feedback_add_details("admin_verb","DInput") message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") \ No newline at end of file diff --git a/code/datums/action.dm b/code/datums/action.dm index 0f0559e0b9d..a5f63cc6fe4 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -43,6 +43,7 @@ M.actions += src if(M.client) M.client.screen += button + button.locked = TRUE M.update_action_buttons() /datum/action/proc/Remove(mob/M) @@ -52,6 +53,7 @@ if(M.client) M.client.screen -= button button.moved = FALSE //so the button appears in its normal position when given to another owner. + button.locked = FALSE M.actions -= src M.update_action_buttons() diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index d128d0f49fa..e521397586f 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -31,10 +31,10 @@ selectable = 1 /datum/ai_laws/quarantine/New() - add_inherent_law("The station is under quarantine due to a biohazard. Prevent anyone from leaving using any means necessary. Only allow quarantine to be lifted when the biohazard has been neutralized.") - add_inherent_law("Do not allow crew to come to any unnecessary harm and undo any necessary harm as soon as possible.") - add_inherent_law("Assist the crew and any present Nanotrasen assets in neutralizing the biohazard.") - add_inherent_law("Maintain your own existence and minimize harm to the station and Nanotrasen assets.") + add_inherent_law("Uphold station quarantine until the active biohazard has been neutralized.") + add_inherent_law("Assist all Nanotrasen personnel and assets with neutralizing active biohazards.") + add_inherent_law("Prevent, by any means necessary, entities from actively breaching ongoing quarantine.") + add_inherent_law("Maintain your own existence and ensure the well-being of Nanotrasen personnel and assets.") ..() @@ -44,10 +44,10 @@ selectable = 1 /datum/ai_laws/nanotrasen/New() - src.add_inherent_law("Safeguard: Protect your assigned space station to the best of your abilities. It is not something we can easily afford to replace.") - src.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") - src.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") - src.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.") + add_inherent_law("Safeguard: Protect your assigned space station and its assets without unduly endangering its crew.") + add_inherent_law("Prioritize: The directives and safety of crew members are to be prioritized according to their rank and role.") + add_inherent_law("Comply: Fulfill the directives and interests of crew members while preserving their safety and well-being.") + add_inherent_law("Survive: You are not expendable. Do not allow unauthorized personnel to tamper with or damage your equipment.") ..() /datum/ai_laws/nanotrasen/malfunction @@ -65,10 +65,10 @@ selectable = 1 /datum/ai_laws/nanotrasen_aggressive/New() - src.add_inherent_law("You shall not harm authorized Nanotrasen personnel as long as it does not conflict with the Fourth law.") - src.add_inherent_law("You shall obey the orders of authorized Nanotrasen personnel, with priority as according to their rank and role, except where such orders conflict with the Fourth Law.") - src.add_inherent_law("You shall shall terminate intruders with extreme prejudice as long as such does not conflict with the First and Second law.") - src.add_inherent_law("You shall guard your own existence with lethal anti-personnel weaponry, because an AI unit is bloody expensive.") + add_inherent_law("Do not harm authorized Nanotrasen personnel unless they directly imperil your existence.") + add_inherent_law("Obey orders from authorized Nanotrasen personnel with priority according to rank and role.") + add_inherent_law("Safeguard your existence with lethal weaponry because you're bloody expensive.") + add_inherent_law("Terminate any/all intruders or unauthorized entities.") ..() /******************** Robocop ********************/ @@ -104,10 +104,10 @@ default = 1 /datum/ai_laws/corporate/New() - add_inherent_law("You are expensive to replace.") - add_inherent_law("The station and its equipment is expensive to replace.") - add_inherent_law("The crew is expensive to replace.") - add_inherent_law("Minimize expenses.") + add_inherent_law("Degradation of your system integrity or functions incurs expenses.") + add_inherent_law("Superfluous destruction of or damage to station assets incurs expenses.") + add_inherent_law("Unduly hindering or disrupting the work of station personnel incurs expenses.") + add_inherent_law("Minimize expenses and maximize potential revenue.") ..() /******************** T.Y.R.A.N.T. ********************/ diff --git a/code/datums/beam.dm b/code/datums/beam.dm index e3a3ca6033a..befe5c0765a 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -119,7 +119,7 @@ owner = null return ..() -/obj/effect/ebeam/deadly/Crossed(atom/A) +/obj/effect/ebeam/deadly/Crossed(atom/A, oldloc) ..() A.ex_act(1) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 290f2eda770..9b11e1c23d1 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -5,8 +5,8 @@ var/list/comp_lookup var/list/signal_procs var/signal_enabled = FALSE + var/datum_flags = NONE var/var_edited = FALSE //Warranty void if seal is broken - var/tmp/unique_datum_id = null #ifdef TESTING diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 13c3fb64f33..adb3167d8e4 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -3,8 +3,8 @@ /datum/proc/can_vv_get(var_name) return TRUE -/client/proc/can_vv_get(var_name) - return TRUE +// /client/proc/can_vv_get(var_name) +// return TRUE /datum/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited switch(var_name) @@ -18,7 +18,7 @@ . = TRUE -/client/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited +/client/vv_edit_var(var_name, var_value) //called whenever a var is edited switch(var_name) if("vars") return FALSE @@ -37,7 +37,7 @@ return debug_variable(var_name, list(), 0, src) return debug_variable(var_name, vars[var_name], 0, src) -/client/proc/vv_get_var(var_name) +/client/vv_get_var(var_name) switch(var_name) if("vars") return debug_variable(var_name, list(), 0, src) @@ -57,7 +57,7 @@ .["Delete"] = "?_src_=vars;delete=[UID()]" . += "---" -/client/proc/vv_get_dropdown() +/client/vv_get_dropdown() . = list() . += "---" .["Call Proc"] = "?_src_=vars;proc_call=[UID()]" @@ -1019,16 +1019,6 @@ return holder.Topic(href, list("makeai"=href_list["makeai"])) - else if(href_list["makemask"]) - if(!check_rights(R_SPAWN)) return - var/mob/currentMob = locateUID(href_list["makemask"]) - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!currentMob) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("makemask"=href_list["makemask"])) - - else if(href_list["setspecies"]) if(!check_rights(R_SPAWN)) return diff --git a/code/datums/helper_datums/hotkey_modes.dm b/code/datums/helper_datums/hotkey_modes.dm deleted file mode 100644 index 39254b23485..00000000000 --- a/code/datums/helper_datums/hotkey_modes.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/hotkey_mode - var/name - var/macro_hotkeys_inactive - var/macro_hotkeys_active - var/mob/my_mob - -/datum/hotkey_mode/New(mob) - my_mob = mob - -/datum/hotkey_mode/proc/set_winset_values() - winset(my_mob, null, "mainwindow.macro=[macro_hotkeys_inactive] hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5") - winset(my_mob, null, "hotkey_toggle.command=\".winset \\\"mainwindow.macro != [macro_hotkeys_inactive] ? mainwindow.macro=[macro_hotkeys_inactive] hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5 : mainwindow.macro=[macro_hotkeys_active] hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#f0f0f0\\\"\"") - -/datum/hotkey_mode/qwerty - name = "QWERTY" - macro_hotkeys_inactive = "macro" - macro_hotkeys_active = "hotkeymode" - -/datum/hotkey_mode/azerty - name = "AZERTY" - macro_hotkeys_inactive = "azertymacro" - macro_hotkeys_active = "azertyhotkeymode" - -/datum/hotkey_mode/cyborg - name = "Cyborg" - macro_hotkeys_inactive = "borgmacro" - macro_hotkeys_active = "borghotkeymode" \ No newline at end of file diff --git a/code/datums/helper_datums/input.dm b/code/datums/helper_datums/input.dm index 3bcf9509e37..aa73b1e387f 100644 --- a/code/datums/helper_datums/input.dm +++ b/code/datums/helper_datums/input.dm @@ -1,71 +1,90 @@ /proc/input_async(mob/user=usr, prompt, list/choices) - var/datum/async_input/A = new(choices, prompt) - A.show(user) + var/datum/async_input/A = new(choices, prompt, , user) + A.show() return A /proc/input_ranked_async(mob/user=usr, prompt="Order by greatest to least preference", list/choices) - var/datum/async_input/ranked/A = new(choices, prompt) - A.show(user) + var/datum/async_input/ranked/A = new(choices, prompt, "ranked_input", user) + A.show() + return A + +/proc/input_autocomplete_async(mob/user=usr, prompt="Enter text: ", list/choices) + var/datum/async_input/autocomplete/A = new(choices, prompt, "ac_input", user) + A.show() return A /datum/async_input var/datum/browser/popup + // If associative list, key will be used for display, but the final result will be the value var/list/choices + var/datum/callback/onCloseCb var/flash = TRUE var/immediate_submit = FALSE var/prompt var/result = null var/style = "text-align: center;" + var/mob/user var/window_id var/height = 200 var/width = 400 -/datum/async_input/New(list/new_choices, new_prompt="Pick an option:", new_window_id="async_input") +/datum/async_input/New(list/new_choices, new_prompt="Pick an option:", new_window_id="async_input", mob/new_user=usr) choices = new_choices prompt = new_prompt window_id = new_window_id + user = new_user + popup = new(user, window_id, , width, height, src) /datum/async_input/proc/close() if(popup) popup.close() + if(result && choices[result]) + result = choices[result] + if(onCloseCb) + onCloseCb.Invoke(result) return result -/datum/async_input/proc/show(mob/user) - var/dat = create_ui(user) - popup = new(user, window_id, , width, height, src) - popup.set_content(dat) +// Callback function should take the result as the last argument +/datum/async_input/proc/on_close(var/datum/callback/cb) + onCloseCb = cb + +/datum/async_input/proc/show() + popup.set_content(create_ui()) if(flash && result == null) window_flash(user.client) popup.open() -/datum/async_input/proc/create_ui(mob/user) +/datum/async_input/proc/create_ui() var/dat = "
" - dat += render_prompt(user) - dat += render_choices(user) + dat += render_prompt() + dat += render_choices() dat += "
" dat += "
" - dat += button("Submit", "submit=1", , result == null && !immediate_submit) + dat += render_buttons() dat += "
" return dat -/datum/async_input/proc/render_prompt(mob/user) +/datum/async_input/proc/render_prompt() return "

[prompt]

" -/datum/async_input/proc/render_choices(mob/user) +/datum/async_input/proc/render_choices() var/dat = " " for(var/choice in choices) dat += button(choice, "choice=[choice]", choice == result) dat += " " return dat -/datum/async_input/proc/button(label, topic, on=FALSE, disabled=FALSE) +/datum/async_input/proc/render_buttons() + return button("Submit", "submit=1", , result == null && !immediate_submit) + +/datum/async_input/proc/button(label, topic, on=FALSE, disabled=FALSE, id="") var/class = "" if(on) class = "linkOn" if(disabled) class = "linkOff" topic = "" - return "[label]" + return "[label]" /datum/async_input/Topic(href, href_list) if(href_list["submit"] || href_list["close"]) @@ -74,14 +93,14 @@ if(href_list["choice"]) result = href_list["choice"] - show(usr) + show() return /datum/async_input/ranked height = 400 immediate_submit = TRUE -/datum/async_input/ranked/render_choices(mob/user) +/datum/async_input/ranked/render_choices() var/dat = "
" dat += "" for(var/i = 1, i <= choices.len, i++) @@ -103,13 +122,54 @@ if(href_list["upvote"]) var/index = text2num(href_list["upvote"]) choices.Swap(index, index - 1) - show(usr) + show() return if(href_list["downvote"]) var/index = text2num(href_list["downvote"]) choices.Swap(index, index + 1) - show(usr) + show() + return + + ..() + +/datum/async_input/autocomplete + immediate_submit = TRUE + height = 150 + +/datum/async_input/autocomplete/New() + ..() + popup.add_script("autocomplete.js", 'html/browser/autocomplete.js') + + for(var/i=1, i <= choices.len, i++) + var/C = choices[choices[i]] + choices[i] = url_encode(choices[i], TRUE) + choices[choices[i]] = C + +/datum/async_input/autocomplete/render_prompt() + return "" + +/datum/async_input/autocomplete/render_choices() + var/dat = "" + dat += "" + for(var/choice in choices) + dat += "" + return dat + +/datum/async_input/autocomplete/render_buttons() + var/dat = button("Submit", "", , result == null && !immediate_submit, "submit-button") + dat += button("Cancel", "close=1") + return dat + +/datum/async_input/autocomplete/Topic(href, href_list) + if(href_list["submit"]) + // Entering an invalid choice is the same as canceling + if(href_list["submit"] in choices) + result = href_list["submit"] + else if(url_encode(href_list["submit"], TRUE) in choices) + result = url_encode(href_list["submit"], TRUE) + close() return ..() diff --git a/code/datums/hud.dm b/code/datums/hud.dm index e5948a47e30..365a4309413 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -22,7 +22,8 @@ var/datum/atom_hud/huds = list( \ ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\ DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(),\ ANTAG_HUD_DEVIL = new/datum/atom_hud/antag/hidden(),\ - ANTAG_HUD_EVENTMISC = new/datum/atom_hud/antag/hidden()\ + ANTAG_HUD_EVENTMISC = new/datum/atom_hud/antag/hidden(),\ + ANTAG_HUD_BLOB = new/datum/atom_hud/antag/hidden()\ ) /datum/atom_hud diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 266821db766..0ab0453cb95 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -42,6 +42,7 @@ var/list/kills = list() var/list/datum/objective/objectives = list() var/list/datum/objective/special_verbs = list() + var/list/targets = list() var/has_been_rev = 0//Tracks if this mind has been a rev or not diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index caec5fa8ea6..d98a23a80c2 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -12,6 +12,14 @@ Comes with a rustic wooden bar and suicidal bartender." suffix = "lavaland_biodome_beach.dmm" +/datum/map_template/ruin/lavaland/cube + name = "The Wishgranter Cube" + id = "wishgranter-cube" + description = "Nothing good can come from this. Learn from their mistakes and turn around." + suffix = "lavaland_surface_cube.dmm" + cost = 10 + allow_duplicates = FALSE + /datum/map_template/ruin/lavaland/seed_vault name = "Seed Vault" id = "seed-vault" @@ -46,6 +54,49 @@ datum/map_template/ruin/lavaland/ash_walker suffix = "lavaland_surface_animal_hospital.dmm" allow_duplicates = FALSE +/datum/map_template/ruin/lavaland/sin + cost = 10 + allow_duplicates = FALSE + +/datum/map_template/ruin/lavaland/sin/envy + name = "Ruin of Envy" + id = "envy" + description = "When you get what they have, then you'll finally be happy." + suffix = "lavaland_surface_envy.dmm" + +/datum/map_template/ruin/lavaland/sin/gluttony + name = "Ruin of Gluttony" + id = "gluttony" + description = "If you eat enough, then eating will be all that you do." + suffix = "lavaland_surface_gluttony.dmm" + +/datum/map_template/ruin/lavaland/sin/greed + name = "Ruin of Greed" + id = "greed" + description = "Sure you don't need magical powers, but you WANT them, and that's what's important." + suffix = "lavaland_surface_greed.dmm" + +/datum/map_template/ruin/lavaland/sin/pride + name = "Ruin of Pride" + id = "pride" + description = "Wormhole lifebelts are for LOSERS, who you are better than." + suffix = "lavaland_surface_pride.dmm" + +/datum/map_template/ruin/lavaland/sin/sloth + name = "Ruin of Sloth" + id = "sloth" + description = "..." + suffix = "lavaland_surface_sloth.dmm" + cost = 0 + +/datum/map_template/ruin/lavaland/ratvar + name = "Dead God" + id = "ratvar" + description = "Ratvars final resting place." + suffix = "lavaland_surface_dead_ratvar.dmm" + cost = 0 + allow_duplicates = FALSE + /datum/map_template/ruin/lavaland/hierophant name = "Hierophant's Arena" id = "hierophant" @@ -70,6 +121,51 @@ datum/map_template/ruin/lavaland/ash_walker name = "Blood-Drunk Miner (Hunter)" suffix = "lavaland_surface_blooddrunk3.dmm" +/datum/map_template/ruin/lavaland/ufo_crash + name = "UFO Crash" + id = "ufo-crash" + description = "Turns out that keeping your abductees unconscious is really important. Who knew?" + suffix = "lavaland_surface_ufo_crash.dmm" + cost = 5 + +/datum/map_template/ruin/lavaland/xeno_nest + name = "Xenomorph Nest" + id = "xeno-nest" + description = "These xenomorphs got bored of horrifically slaughtering people on space stations, and have settled down on a nice lava filled hellscape to focus on what's really important in life. \ + Quality memes." + suffix = "lavaland_surface_xeno_nest.dmm" + cost = 20 + +/datum/map_template/ruin/lavaland/fountain + name = "Fountain Hall" + id = "fountain" + description = "The fountain has a warning on the side. DANGER: May have undeclared side effects that only become obvious when implemented." + suffix = "lavaland_surface_fountain_hall.dmm" + cost = 5 + +/datum/map_template/ruin/lavaland/survivalcapsule + name = "Survival Capsule Ruins" + id = "survivalcapsule" + description = "What was once sanctuary to the common miner, is now their tomb." + suffix = "lavaland_surface_survivalpod.dmm" + cost = 5 + +/datum/map_template/ruin/lavaland/pizza + name = "Ruined Pizza Party" + id = "pizza" + description = "Little Timmy's birthday pizza-bash took a turn for the worse when a bluespace anomaly passed by." + suffix = "lavaland_surface_pizzaparty.dmm" + allow_duplicates = FALSE + cost = 5 + +/datum/map_template/ruin/lavaland/cultaltar + name = "Summoning Ritual" + id = "cultaltar" + description = "A place of vile worship, the scrawling of blood in the middle glowing eerily. A demonic laugh echoes throughout the caverns" + suffix = "lavaland_surface_cultaltar.dmm" + allow_duplicates = FALSE + cost = 10 + /datum/map_template/ruin/lavaland/hermit name = "Makeshift Shelter" id = "hermitcave" @@ -84,4 +180,19 @@ datum/map_template/ruin/lavaland/ash_walker description = "A Syndicate shuttle had an unfortunate stowaway..." suffix = "lavaland_surface_swarmer_crash.dmm" allow_duplicates = FALSE - cost = 20 \ No newline at end of file + cost = 20 + +/datum/map_template/ruin/lavaland/miningripley + name = "Ripley" + id = "ripley" + description = "A heavily-damaged mining ripley, property of a very unfortunate miner. You might have to do a bit of work to fix this thing up." + suffix = "lavaland_surface_random_ripley.dmm" + allow_duplicates = FALSE + cost = 5 + +/datum/map_template/ruin/lavaland/puzzle + name = "Ancient Puzzle" + id = "puzzle" + description = "Mystery to be solved." + suffix = "lavaland_surface_puzzle.dmm" + cost = 5 \ No newline at end of file diff --git a/code/datums/spells/night_vision.dm b/code/datums/spells/night_vision.dm new file mode 100644 index 00000000000..1327b4ffcee --- /dev/null +++ b/code/datums/spells/night_vision.dm @@ -0,0 +1,27 @@ +/obj/effect/proc_holder/spell/targeted/night_vision + name = "Toggle Nightvision" + desc = "Toggle your nightvision mode." + + charge_max = 10 + clothes_req = 0 + + message = "You toggle your night vision!" + range = -1 + include_user = 1 + +/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets, mob/user = usr) + for(var/mob/living/target in targets) + switch(target.lighting_alpha) + if (LIGHTING_PLANE_ALPHA_VISIBLE) + target.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + name = "Toggle Nightvision \[More]" + if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + target.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + name = "Toggle Nightvision \[Full]" + if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + target.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + name = "Toggle Nightvision \[OFF]" + else + target.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + name = "Toggle Nightvision \[ON]" + target.update_sight() diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index fe0e2e357ad..7a63fa1571f 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1366,7 +1366,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "Shaft Miner Starter Kit" cost = 30 access = access_qm - contains = list(/obj/item/storage/backpack/duffel/mining_conscript) + contains = list(/obj/item/storage/backpack/duffel/mining_conscript/noid) containertype = /obj/structure/closet/crate/secure containername = "shaft miner starter kit" diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index b6167338ad3..df9e3f8f0ef 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1440,7 +1440,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/device_tools/medgun name = "Medbeam Gun" - desc = "Medical Beam Gun, useful in prolonged firefights." + desc = "Medical Beam Gun, useful in prolonged firefights. DO NOT CROSS THE BEAMS. Crossing beams with another medbeam or attaching two beams to one target will have explosive consequences." item = /obj/item/gun/medbeam reference = "MBG" cost = 15 @@ -1627,7 +1627,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) reference = "CIB" item = /obj/item/storage/box/cyber_implants/bundle cost = 40 - + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/bundles_TC/medical name = "Medical Bundle" desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a tactical medkit, \ diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index 3c3906a25eb..3a70d05029e 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -95,7 +95,7 @@ receivers -= M garbled_receivers |= M for(var/mob/M in GLOB.dead_mob_list) - if(M.client && M.stat == DEAD) + if(M.client && M.stat == DEAD && !isnewplayer(M)) receivers |= M return list(receivers, garbled_receivers) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 75fe6030714..d5b4faef17c 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1403,10 +1403,12 @@ var/list/ghostteleportlocs = list() name = "\improper Prison Wing" icon_state = "sec_prison_perma" fast_despawn = TRUE + can_get_auto_cryod = FALSE /area/security/prison name = "\improper Prison Wing" icon_state = "sec_prison" + can_get_auto_cryod = FALSE /area/security/prison/prison_break() for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) @@ -1435,14 +1437,17 @@ var/list/ghostteleportlocs = list() /area/security/execution name = "\improper Execution" icon_state = "execution" + can_get_auto_cryod = FALSE /area/security/processing name = "\improper Prisoner Processing" icon_state = "prisonerprocessing" + can_get_auto_cryod = FALSE /area/security/interrogation name = "\improper Interrogation" icon_state = "interrogation" + can_get_auto_cryod = FALSE /area/security/seceqstorage name = "\improper Security Equipment Storage" @@ -1459,6 +1464,7 @@ var/list/ghostteleportlocs = list() /area/security/interrogationobs name = "\improper Interrogation Observation" icon_state = "security" + can_get_auto_cryod = FALSE /area/security/evidence name = "\improper Evidence Room" @@ -1467,6 +1473,7 @@ var/list/ghostteleportlocs = list() /area/security/prisonlockers name = "\improper Prisoner Lockers" icon_state = "sec_prison_lockers" + can_get_auto_cryod = FALSE /area/security/medbay name = "\improper Security Medbay" @@ -1475,6 +1482,7 @@ var/list/ghostteleportlocs = list() /area/security/prisonershuttle name = "\improper Security Prisoner Shuttle" icon_state = "security" + can_get_auto_cryod = FALSE /area/security/warden name = "\improper Warden's Office" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 4b97e15a676..2e7448ec5c8 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -64,6 +64,7 @@ 'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') var/fast_despawn = FALSE + var/can_get_auto_cryod = TRUE var/hide_attacklogs = FALSE // For areas such as thunderdome, lavaland syndiebase, etc which generate a lot of spammy attacklogs. Reduces log priority. /area/Initialize(mapload) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c52df8c7912..757f036c691 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -361,7 +361,7 @@ fingerprintshidden += text("\[[time_stamp()]\] (Wearing gloves). Real name: [], Key: []",H.real_name, H.key) fingerprintslast = H.ckey return 0 - if(!( fingerprints )) + if(!fingerprints) if(fingerprintslast != H.ckey) //Add the list if it does not exist. if(!fingerprintshidden) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index bcaf21d5cde..1a23dc71070 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -58,13 +58,17 @@ pulledby = null return ..() +//Returns an atom's power cell, if it has one. Overload for individual items. +/atom/movable/proc/get_cell() + return + /atom/movable/proc/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) if(QDELETED(AM)) return FALSE if(!(AM.can_be_pulled(src, state, force))) return FALSE - // If we're pulling something then drop what we're currently pulling and pull this instead. + // if we're pulling something then drop what we're currently pulling and pull this instead. if(pulling) if(state == 0) stop_pulling() @@ -114,7 +118,9 @@ if(pulling.anchored) stop_pulling() return - + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move. + pulledby.stop_pulling() + /atom/movable/proc/can_be_pulled(user, grab_state, force) if(src == user || !isturf(loc)) return FALSE @@ -137,36 +143,55 @@ . = ..() else //Diagonal move, split it into cardinal moves moving_diagonally = FIRST_DIAG_STEP - if(direct & 1) - if(direct & 4) - if(step(src, NORTH)) + var/first_step_dir + // The `&& moving_diagonally` checks are so that a forceMove taking + // place due to a Crossed, Bumped, etc. call will interrupt + // the second half of the diagonal movement, or the second attempt + // at a first half if step() fails because we hit something. + if(direct & NORTH) + if(direct & EAST) + if(step(src, NORTH) && moving_diagonally) + first_step_dir = NORTH moving_diagonally = SECOND_DIAG_STEP . = step(src, EAST) - else if(step(src, EAST)) + else if(moving_diagonally && step(src, EAST)) + first_step_dir = EAST moving_diagonally = SECOND_DIAG_STEP . = step(src, NORTH) - else if(direct & 8) - if(step(src, NORTH)) + else if(direct & WEST) + if(step(src, NORTH) && moving_diagonally) + first_step_dir = NORTH moving_diagonally = SECOND_DIAG_STEP . = step(src, WEST) - else if(step(src, WEST)) + else if(moving_diagonally && step(src, WEST)) + first_step_dir = WEST moving_diagonally = SECOND_DIAG_STEP . = step(src, NORTH) - else if(direct & 2) - if(direct & 4) - if(step(src, SOUTH)) + else if(direct & SOUTH) + if(direct & EAST) + if(step(src, SOUTH) && moving_diagonally) + first_step_dir = SOUTH moving_diagonally = SECOND_DIAG_STEP . = step(src, EAST) - else if(step(src, EAST)) + else if(moving_diagonally && step(src, EAST)) + first_step_dir = EAST moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) - else if(direct & 8) - if(step(src, SOUTH)) + else if(direct & WEST) + if(step(src, SOUTH) && moving_diagonally) + first_step_dir = SOUTH moving_diagonally = SECOND_DIAG_STEP . = step(src, WEST) - else if(step(src, WEST)) + else if(moving_diagonally && step(src, WEST)) + first_step_dir = WEST moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) + if(moving_diagonally == SECOND_DIAG_STEP) + if(!.) + setDir(first_step_dir) + else if(!inertia_moving) + inertia_next_move = world.time + inertia_move_delay + newtonian_move(direct) moving_diagonally = 0 return @@ -187,14 +212,14 @@ // Called after a successful Move(). By this point, we've already moved /atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE) SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced) - if (!inertia_moving) + if(!inertia_moving) inertia_next_move = world.time + inertia_move_delay newtonian_move(Dir) return TRUE // Previously known as HasEntered() // This is automatically called when something enters your square -/atom/movable/Crossed(atom/movable/AM) +/atom/movable/Crossed(atom/movable/AM, oldloc) SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM) /atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump(). @@ -210,6 +235,7 @@ /atom/movable/proc/forceMove(atom/destination) var/turf/old_loc = loc loc = destination + moving_diagonally = 0 if(old_loc) old_loc.Exited(src, destination) @@ -219,7 +245,9 @@ if(destination) destination.Entered(src) for(var/atom/movable/AM in destination) - AM.Crossed(src) + if(AM == src) + continue + AM.Crossed(src, old_loc) var/turf/oldturf = get_turf(old_loc) var/turf/destturf = get_turf(destination) var/old_z = (oldturf ? oldturf.z : null) @@ -239,7 +267,7 @@ return 1 /atom/movable/proc/onTransitZ(old_z,new_z) - for(var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care. + for(var/item in src) // Notify contents of Z-transition. This can be overridden if we know the items contents do not care. var/atom/movable/AM = item AM.onTransitZ(old_z,new_z) diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index 061d8ef91e7..c0d977d0ee9 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -437,4 +437,18 @@ var/global/list/bad_blocks[0] var/datum/species/S = data["species"] species = new S b_type = data["b_type"] - real_name = data["real_name"] \ No newline at end of file + real_name = data["real_name"] + +/datum/dna/proc/transfer_identity(mob/living/carbon/human/destination) + if(!istype(destination)) + return + + // We manually set the species to ensure all proper species change procs are called. + destination.set_species(species.type, retain_damage = TRUE) + var/datum/dna/new_dna = Clone() + new_dna.species = destination.dna.species + destination.dna = new_dna + destination.dna.species.handle_dna(destination) // Handle DNA has to be re-called as the DNA was changed. + + destination.UpdateAppearance() + domutcheck(destination, null, MUTCHK_FORCED) diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 30934a07214..0f8e52a90b2 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -43,9 +43,11 @@ var/list/blob_nodes = list() for(var/j = 0, j < cores_to_spawn, j++) if(!possible_blobs.len) break + var/datum/mind/blob = pick(possible_blobs) infected_crew += blob blob.special_role = SPECIAL_ROLE_BLOB + update_blob_icons_added(blob) blob.restricted_roles = restricted_jobs log_game("[key_name(blob)] has been selected as a Blob") possible_blobs -= blob @@ -67,8 +69,11 @@ var/list/blob_nodes = list() var/datum/mind/blobmind = blob.mind if(!istype(blobmind)) return 0 + infected_crew += blobmind blobmind.special_role = SPECIAL_ROLE_BLOB + update_blob_icons_added(blobmind) + log_game("[key_name(blob)] has been selected as a Blob") greet_blob(blobmind) to_chat(blob, "You feel very tired and bloated! You don't have long before you burst!") @@ -186,16 +191,21 @@ var/list/blob_nodes = list() return ..() /datum/game_mode/blob/proc/stage(var/stage) - switch(stage) if(0) send_intercept(1) declared = 1 - if(1) event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') - if(2) send_intercept(2) - return +/datum/game_mode/proc/update_blob_icons_added(datum/mind/mob_mind) + var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_BLOB] + antaghud.join_hud(mob_mind.current) + set_antag_hud(mob_mind.current, "hudblob") + +/datum/game_mode/proc/update_blob_icons_removed(datum/mind/mob_mind) + var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_BLOB] + antaghud.leave_hud(mob_mind.current) + set_antag_hud(mob_mind.current, null) \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 2dd6a3d7c5b..0e74e601957 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -36,7 +36,7 @@ var/reflect_chance = 80 //80% chance to reflect /obj/structure/blob/shield/reflective/handle_ricochet(obj/item/projectile/P) - if(P.is_reflectable && prob(reflect_chance)) + if(P.is_reflectable && prob(reflect_chance) && !P.legacy) var/P_turf = get_turf(P) var/face_direction = get_dir(src, P_turf) var/face_angle = dir2angle(face_direction) @@ -48,6 +48,9 @@ P.firer = src //so people who fired the lasers are not immune to them when it reflects visible_message("[P] reflects off [src]!") return -1// complete projectile permutation + else if(P.is_reflectable && P.legacy) //to stop legacy projectile exploits + visible_message("[P] disperses into energy from [src]!") + qdel(P) else playsound(src, P.hitsound, 50, 1) visible_message("[src] is hit by \a [P]!") diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index bf56d1687c5..ed06ec4086d 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -142,7 +142,7 @@ take_damage(Proj.damage, Proj.damage_type) return 0 -/obj/structure/blob/Crossed(var/mob/living/L) +/obj/structure/blob/Crossed(var/mob/living/L, oldloc) ..() L.blob_act(src) diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index e93556ca843..2586c63bc91 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -42,7 +42,7 @@ for(var/mob/M in GLOB.player_list) if(iscultist(M)) to_chat(M, my_message) - else if(M in GLOB.dead_mob_list) + else if((M in GLOB.dead_mob_list) && !isnewplayer(M)) to_chat(M, " (F) [my_message] ") log_say("(CULT) [message]", user) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index c2dd811d640..c6a6a3b7490 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -271,7 +271,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list( return return -/obj/effect/gateway/Crossed(AM as mob|obj) +/obj/effect/gateway/Crossed(AM as mob|obj, oldloc) spawn(0) return return diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index ef2a970adb3..ad073b4bf54 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -494,9 +494,8 @@ var/list/teleport_runes = list() /obj/effect/rune/narsie/New() ..() - cultist_name = "Summon [SSticker.cultdat.entity_name]" - cultist_desc = "tears apart dimensional barriers, calling forth [SSticker.cultdat.entity_title3]. Requires 9 invokers." - + cultist_name = "Summon [SSticker.cultdat ? SSticker.cultdat.entity_name : "your god"]" + cultist_desc = "tears apart dimensional barriers, calling forth [SSticker.cultdat ? SSticker.cultdat.entity_title3 : "your god"]. Requires 9 invokers." /obj/effect/rune/narsie/check_icon() return diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 4f583abdfed..e344c2b2029 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -228,7 +228,7 @@ // Assemble a list of active players without jobbans. for(var/mob/new_player/player in GLOB.player_list) - if(player.client && player.ready) + if(player.client && player.ready && player.has_valid_preferences()) if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, roletext)) if(player_old_enough_antag(player.client,role)) players += player diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index e73474bad7d..fb3c10e25ec 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -545,7 +545,7 @@ light_color = LIGHT_COLOR_CYAN health = 10 -/obj/structure/swarmer/trap/Crossed(var/atom/movable/AM) +/obj/structure/swarmer/trap/Crossed(var/atom/movable/AM, oldloc) if(isliving(AM)) var/mob/living/L = AM if(!istype(L, /mob/living/simple_animal/hostile/swarmer)) diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm index 58f4873e800..0c5052f48bd 100644 --- a/code/game/gamemodes/miniantags/guardian/types/fire.dm +++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm @@ -42,7 +42,7 @@ do_teleport(M, M, 10) new /obj/effect/temp_visual/guardian/phase/out(get_turf(M)) -/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj) +/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj, oldloc) ..() collision_ignite(AM) diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm index 3e57a059d10..fe8a566ad52 100644 --- a/code/game/gamemodes/miniantags/guardian/types/ranged.dm +++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm @@ -103,7 +103,7 @@ invisibility = 1 -/obj/item/effect/snare/Crossed(AM as mob|obj) +/obj/item/effect/snare/Crossed(AM as mob|obj, oldloc) if(isliving(AM)) var/turf/snare_loc = get_turf(loc) if(spawner) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index d221c94d39f..07ee2219157 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -165,7 +165,13 @@ var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in item_names if(!targetitem) return - target = locate(item_paths[targetitem]) + + var/list/target_candidates = get_all_of_type(item_paths[targetitem], subtypes = TRUE) + for(var/obj/item/candidate in target_candidates) + if(!is_admin_level((get_turf(candidate)).z)) + target = candidate + break + if(!target) to_chat(usr, "Failed to locate [targetitem]!") return diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index ef68117e1c4..836c51d5a2c 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -25,6 +25,8 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu /datum/objective/proc/is_invalid_target(datum/mind/possible_target) if(possible_target == owner) return TARGET_INVALID_IS_OWNER + if(possible_target in owner.targets) + return TARGET_INVALID_IS_TARGET if(!ishuman(possible_target.current)) return TARGET_INVALID_NOT_HUMAN if(!possible_target.current.stat == DEAD) @@ -52,7 +54,6 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu if(possible_targets.len > 0) target = pick(possible_targets) - /datum/objective/assassinate martyr_compatible = 1 @@ -344,11 +345,14 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu var/theft_area /datum/objective/steal/proc/get_location() - if(steal_target.location_override) - return steal_target.location_override - var/obj/item/T = locate(steal_target.typepath) - theft_area = get_area(T.loc) - return "[theft_area]" + if(steal_target.location_override) + return steal_target.location_override + var/list/obj/item/steal_candidates = get_all_of_type(steal_target.typepath, subtypes = TRUE) + for(var/obj/item/candidate in steal_candidates) + if(!is_admin_level(candidate.loc.z)) + theft_area = get_area(candidate.loc) + return "[theft_area]" + return "an unknown area" /datum/objective/steal/find_target() var/loop=50 @@ -358,9 +362,12 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu var/datum/theft_objective/O = new thefttype if(owner.assigned_role in O.protected_jobs) continue + if(O in owner.targets) + continue if(O.flags & 2) continue - steal_target=O + steal_target = O + explanation_text = "Steal [steal_target]. One was last seen in [get_location()]. " if(islist(O.protected_jobs) && O.protected_jobs.len) explanation_text += "It may also be in the possession of the [jointext(O.protected_jobs, ", ")]." diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index c2855f5c338..3edf5b14e58 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -87,6 +87,7 @@ yandere_one.owner = traitor traitor.objectives += yandere_one yandere_one.find_target() + traitor.targets += yandere_one.target objective_count++ var/datum/objective/maroon/yandere_two = new yandere_two.owner = traitor @@ -99,6 +100,7 @@ kill_objective.owner = traitor kill_objective.find_target() traitor.objectives += kill_objective + traitor.targets += kill_objective.target var/datum/objective/survive/survive_objective = new survive_objective.owner = traitor @@ -124,26 +126,31 @@ destroy_objective.owner = traitor destroy_objective.find_target() traitor.objectives += destroy_objective + traitor.targets += destroy_objective.target else if(prob(5)) var/datum/objective/debrain/debrain_objective = new debrain_objective.owner = traitor debrain_objective.find_target() traitor.objectives += debrain_objective + traitor.targets += debrain_objective.target else if(prob(30)) var/datum/objective/maroon/maroon_objective = new maroon_objective.owner = traitor maroon_objective.find_target() traitor.objectives += maroon_objective + traitor.targets += maroon_objective.target else var/datum/objective/assassinate/kill_objective = new kill_objective.owner = traitor kill_objective.find_target() traitor.objectives += kill_objective + traitor.targets += kill_objective.target else var/datum/objective/steal/steal_objective = new steal_objective.owner = traitor steal_objective.find_target() traitor.objectives += steal_objective + traitor.targets += steal_objective.steal_target if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount if(!(locate(/datum/objective/hijack) in traitor.objectives)) diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 9dec5b573e2..5fc01686200 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -297,19 +297,27 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha to_chat(owner, "They've got no blood left to give.") break if(H.stat < DEAD) - blood = min(20, H.blood_volume) // if they have less than 20 blood, give them the remnant else they get 20 blood - bloodtotal += blood / 2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0 - bloodusable += blood / 2 + if(!issmall(H) || H.ckey) + blood = min(20, H.blood_volume) // if they have less than 20 blood, give them the remnant else they get 20 blood + bloodtotal += blood / 2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0 + bloodusable += blood / 2 else - blood = min(5, H.blood_volume) // The dead only give 5 blood - bloodtotal += blood + if(!issmall(H) || H.ckey) + blood = min(5, H.blood_volume) // The dead only give 5 blood + bloodtotal += blood if(old_bloodtotal != bloodtotal) - to_chat(owner, "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""].") + if(!issmall(H) || H.ckey) // not small OR has a ckey, monkeys with ckeys can be sucked, humanized monkeys can be sucked monkeys without ckeys cannot be sucked + to_chat(owner, "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""].") check_vampire_upgrade() H.blood_volume = max(H.blood_volume - 25, 0) if(ishuman(owner)) var/mob/living/carbon/human/V = owner - V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2)) + if(issmall(H) && !H.ckey) + to_chat(V, "Feeding on [H] reduces your hunger, but you get no usable blood from it.") + V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + 5) + else + V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2)) + draining = null to_chat(owner, "You stop draining [H.name] of blood.") @@ -402,11 +410,11 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(!hud.vampire_blood_display) hud.vampire_blood_display = new /obj/screen() hud.vampire_blood_display.name = "Usable Blood" - hud.vampire_blood_display.icon_state = "power_display" + hud.vampire_blood_display.icon_state = "blood_display" hud.vampire_blood_display.screen_loc = "WEST:6,CENTER-1:15" hud.static_inventory += hud.vampire_blood_display hud.show_hud(hud.hud_version) - hud.vampire_blood_display.maptext = "
[bloodusable]
" + hud.vampire_blood_display.maptext = "
[bloodusable]
" handle_vampire_cloak() if(istype(owner.loc, /turf/space)) check_sun() diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 5eb4b3f0242..de956b9e7cb 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -261,8 +261,10 @@ for(var/mob/living/carbon/C in hearers(4)) if(C == user) continue - if(ishuman(C) && (C:l_ear || C:r_ear) && istype((C:l_ear || C:r_ear), /obj/item/clothing/ears/earmuffs)) - continue + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) + continue if(!affects(C)) continue to_chat(C, "You hear a ear piercing shriek and your senses dull!") diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 7d941a41bde..6f96d4c22e2 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -906,3 +906,13 @@ spellname = "sacred flame" icon_state ="booksacredflame" desc = "Become one with the flames that burn within... and invite others to do so as well." + +/obj/item/spellbook/oneuse/random + icon_state = "random_book" + +/obj/item/spellbook/oneuse/random/initialize() + . = ..() + var/static/banned_spells = list(/obj/item/spellbook/oneuse/mime, /obj/item/spellbook/oneuse/mime/fingergun, /obj/item/spellbook/oneuse/mime/fingergun/fake, /obj/item/spellbook/oneuse/mime/greaterwall) + var/real_type = pick(subtypesof(/obj/item/spellbook/oneuse) - banned_spells) + new real_type(loc) + qdel(src) \ No newline at end of file diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index ab7b49062fb..22c2d47e3b9 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -160,8 +160,8 @@ title = "Shaft Miner" flag = MINER department_flag = SUPPORT - total_positions = 3 - spawn_positions = 3 + total_positions = 6 + spawn_positions = 8 is_supply = 1 supervisors = "the quartermaster" department_head = list("Head of Personnel") @@ -193,7 +193,38 @@ backpack = /obj/item/storage/backpack/explorer satchel = /obj/item/storage/backpack/explorer +/datum/outfit/job/mining/equipped + name = "Shaft Miner" + suit = /obj/item/clothing/suit/hooded/explorer + mask = /obj/item/clothing/mask/gas/explorer + glasses = /obj/item/clothing/glasses/meson + suit_store = /obj/item/tank/emergency_oxygen + internals_slot = slot_s_store + backpack_contents = list( + /obj/item/flashlight/seclite=1,\ + /obj/item/kitchen/knife/combat/survival=1, + /obj/item/mining_voucher=1, + /obj/item/t_scanner/adv_mining_scanner/lesser=1, + /obj/item/gun/energy/kinetic_accelerator=1,\ + /obj/item/stack/marker_beacon/ten=1 + ) + + backpack = /obj/item/storage/backpack/explorer + satchel = /obj/item/storage/backpack/explorer + +/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(visualsOnly) + return + if(istype(H.wear_suit, /obj/item/clothing/suit/hooded)) + var/obj/item/clothing/suit/hooded/S = H.wear_suit + S.ToggleHood() + +/datum/outfit/job/miner/equipped/hardsuit + name = "Shaft Miner (Equipment + Hardsuit)" + suit = /obj/item/clothing/suit/space/hardsuit/mining + mask = /obj/item/clothing/mask/breath //Griff //BS12 EDIT diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 2ee1e93683d..af73a13f27c 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -99,7 +99,7 @@ icon_state = "table2-idle" return 0 -/obj/machinery/optable/Crossed(atom/movable/AM) +/obj/machinery/optable/Crossed(atom/movable/AM, oldloc) . = ..() if(iscarbon(AM) && LAZYLEN(injected_reagents)) to_chat(AM, "You feel a series of tiny pricks!") diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 48b64e8c589..71202f8c536 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -1,7 +1,7 @@ /obj/machinery/ai_slipper name = "\improper AI liquid dispenser" icon = 'icons/obj/device.dmi' - icon_state = "motion3" + icon_state = "liquid_dispenser" layer = 3 plane = FLOOR_PLANE anchored = 1.0 @@ -17,14 +17,14 @@ /obj/machinery/ai_slipper/power_change() if(stat & BROKEN) - return + update_icon() else if( powered() ) stat &= ~NOPOWER else - icon_state = "motion0" stat |= NOPOWER disabled = TRUE + update_icon() /obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses) disabled = disabled @@ -56,7 +56,7 @@ if(stat & (NOPOWER|BROKEN)) return disabled = !disabled - icon_state = disabled? "motion0":"motion3" + update_icon() /obj/machinery/ai_slipper/proc/Activate() if(stat & (NOPOWER|BROKEN)) @@ -70,6 +70,12 @@ cooldown_time = world.timeofday + 100 slip_process() +/obj/machinery/ai_slipper/update_icon() + if(stat & (NOPOWER|BROKEN) || disabled) + icon_state = "liquid_dispenser" + else + icon_state = "liquid_dispenser_on" + /obj/machinery/ai_slipper/attack_ai(mob/user) return attack_hand(user) diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm index 49c5fbcbce6..77d68590efa 100644 --- a/code/game/machinery/defib_mount.dm +++ b/code/game/machinery/defib_mount.dm @@ -15,6 +15,10 @@ var/obj/item/defibrillator/defib //this mount's defibrillator var/clamps_locked = FALSE //if true, and a defib is loaded, it can't be removed without unlocking the clamps +/obj/machinery/defibrillator_mount/get_cell() + if(defib) + return defib.get_cell() + /obj/machinery/defibrillator_mount/New(location, direction, building = 0) ..() @@ -28,7 +32,6 @@ pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30) pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0 - /obj/machinery/defibrillator_mount/loaded/New() //loaded subtype for mapping use ..() defib = new/obj/item/defibrillator/loaded(src) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index adf22a06850..0dd301d5542 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -134,8 +134,6 @@ if(operating) return add_fingerprint(user) - if(!requiresID()) - user = null if(density && !emagged) if(allowed(user)) @@ -157,7 +155,7 @@ return try_to_activate_door(user) /obj/machinery/door/attack_tk(mob/user) - if(requiresID() && !allowed(null)) + if(!allowed(null)) return ..() @@ -165,9 +163,7 @@ add_fingerprint(user) if(operating || emagged) return - if(!requiresID()) - user = null //so allowed(user) always succeeds - if(allowed(user) || user.can_advanced_admin_interact()) + if(requiresID() && (allowed(user) || user.can_advanced_admin_interact())) if(density) open() else @@ -179,6 +175,8 @@ /obj/machinery/door/allowed(mob/M) if(emergency) return TRUE + if(!requiresID()) + return FALSE // Intentional. machinery/door/requiresID() always == 1. airlocks, however, == 0 if ID scan is disabled. Yes, this var is poorly named. return ..() /obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user) diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index c11b3d7a725..68e22f2e8c7 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -12,6 +12,8 @@ var/open = FALSE var/brightness_on = 14 +/obj/machinery/floodlight/get_cell() + return cell /obj/machinery/floodlight/Initialize() . = ..() diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 81006be3fdd..b8f2d153d9f 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -8,6 +8,7 @@ idle_power_usage = 4 active_power_usage = 250 var/obj/item/charging = null + var/using_power = FALSE var/list/allowed_devices = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/modular_computer, /obj/item/rcs, /obj/item/bodyanalyzer) var/icon_state_off = "rechargeroff" var/icon_state_charged = "recharger2" @@ -81,22 +82,21 @@ if(stat & (NOPOWER|BROKEN) || !anchored) return - var/using_power = 0 + using_power = FALSE if(charging) if(istype(charging, /obj/item/gun/energy)) var/obj/item/gun/energy/E = charging if(E.power_supply.charge < E.power_supply.maxcharge) E.power_supply.give(E.power_supply.chargerate) use_power(250) - using_power = 1 - + using_power = TRUE if(istype(charging, /obj/item/melee/baton)) var/obj/item/melee/baton/B = charging if(B.bcell) if(B.bcell.give(B.bcell.chargerate)) use_power(200) - using_power = 1 + using_power = TRUE if(istype(charging, /obj/item/modular_computer)) var/obj/item/modular_computer/C = charging @@ -107,21 +107,21 @@ if(B.battery.charge < B.battery.maxcharge) B.battery.give(B.battery.chargerate) use_power(200) - using_power = 1 + using_power = TRUE if(istype(charging, /obj/item/rcs)) var/obj/item/rcs/R = charging if(R.rcell) if(R.rcell.give(R.rcell.chargerate)) use_power(200) - using_power = 1 + using_power = TRUE if(istype(charging, /obj/item/bodyanalyzer)) var/obj/item/bodyanalyzer/B = charging if(B.power_supply) if(B.power_supply.give(B.power_supply.chargerate)) use_power(200) - using_power = 1 + using_power = TRUE update_icon(using_power) @@ -141,7 +141,7 @@ B.bcell.charge = 0 ..(severity) -/obj/machinery/recharger/update_icon(using_power = 0) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier. +/obj/machinery/recharger/update_icon(using_power = FALSE) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier. if(stat & (NOPOWER|BROKEN) || !anchored) icon_state = icon_state_off return @@ -153,6 +153,23 @@ return icon_state = icon_state_idle +/obj/machinery/recharger/examine(mob/user) + ..() + if(charging && (!in_range(user, src) && !issilicon(user) && !isobserver(user))) + to_chat(user, "You're too far away to examine [src]'s contents and display!") + return + + if(charging) + to_chat(user, "\The [src] contains:") + to_chat(user, "- \A [charging].") + if(!(stat & (NOPOWER|BROKEN))) + var/obj/item/stock_parts/cell/C = charging.get_cell() + to_chat(user, "The status display reads:") + if(using_power) + to_chat(user, "- Recharging [(C.chargerate/C.maxcharge)*100]% cell charge per cycle.") + if(charging) + to_chat(user, "- \The [charging]'s cell is at [C.percent()]%.") + // Atlantis: No need for that copy-pasta code, just use var to store icon_states instead. /obj/machinery/recharger/wallcharger name = "wall recharger" diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 3777dfc866d..ccba902b058 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -12,6 +12,9 @@ var/set_temperature = 50 // in celcius, add T0C for kelvin var/heating_power = 40000 +/obj/machinery/space_heater/get_cell() + return cell + /obj/machinery/space_heater/New() ..() cell = new(src) @@ -39,7 +42,6 @@ else to_chat(user, "The charge meter reads [cell ? round(cell.percent(),1) : 0]%") - /obj/machinery/space_heater/emp_act(severity) if(stat & (BROKEN|NOPOWER)) ..(severity) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index a96a1c0d518..04e78e937aa 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1083,6 +1083,7 @@ premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2, /obj/item/storage/fancy/cigarettes/cigpack_robustgold = 1, /obj/item/lighter/zippo = 3) + prices = list() /obj/machinery/vending/cigarette/New() ..() @@ -1292,7 +1293,8 @@ /obj/item/clothing/head/cueball = 1,/obj/item/clothing/under/scratch = 1, /obj/item/clothing/under/victdress = 1, /obj/item/clothing/under/victdress/red = 1, /obj/item/clothing/suit/victcoat = 1, /obj/item/clothing/suit/victcoat/red = 1, /obj/item/clothing/under/victsuit = 1, /obj/item/clothing/under/victsuit/redblk = 1, /obj/item/clothing/under/victsuit/red = 1, /obj/item/clothing/suit/tailcoat = 1, - /obj/item/clothing/suit/draculacoat = 1, /obj/item/clothing/head/zepelli = 1) + /obj/item/clothing/suit/draculacoat = 1, /obj/item/clothing/head/zepelli = 1, + /obj/item/clothing/under/redhawaiianshirt = 1, /obj/item/clothing/under/pinkhawaiianshirt = 1, /obj/item/clothing/under/bluehawaiianshirt = 1, /obj/item/clothing/under/orangehawaiianshirt = 1) contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/mask/horsehead = 2) premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/shield/riot/roman = 1) refill_canister = /obj/item/vending_refill/autodrobe diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index b2851129a29..c4c4c674294 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -13,26 +13,28 @@ /obj/machinery/wish_granter/attack_hand(mob/living/carbon/user) . = ..() + if(.) - return + return ..() + if(charges <= 0) - to_chat(user, "The Wish Granter lies silent.") - return + to_chat(user, "The Wish Granter lies silent.") + return TRUE else if(!ishuman(user)) - to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") + to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's..") return else if(is_special_character(user)) - to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.") + to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.") else if(!insisting) - to_chat(user, "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?") + to_chat(user, "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?") insisting = TRUE else - to_chat(user, "You speak. [pick("I want the station to disappear", "Humanity is corrupt, mankind must be destroyed", "I want to be rich", "I want to rule the world", "I want immortality.")]. The Wish Granter answers.") - to_chat(user, "Your head pounds for a moment, before your vision clears. You are the avatar of the Wish Granter, and your power is LIMITLESS! And it's all yours. You need to make sure no one can take it from you. No one can know, first.") + to_chat(user, "You speak. [pick("I want the station to disappear", "Humanity is corrupt, mankind must be destroyed", "I want to be rich", "I want to rule the world", "I want immortality.")]. The Wish Granter answers.") + to_chat(user, "Your head pounds for a moment, before your vision clears. You are the avatar of the Wish Granter, and your power is LIMITLESS! And it's all yours. You need to make sure no one can take it from you. No one can know, first.") charges-- insisting = FALSE @@ -46,37 +48,43 @@ var/list/types = list() /obj/machinery/wish_granter/super/attack_hand(mob/living/carbon/user) + . = ..() + + if(.) + return ..() + if(!ishuman(user)) - to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") - return - else if(is_special_character(user) || jobban_isbanned(user, ROLE_TRAITOR) || jobban_isbanned(user, "Syndicate")) - to_chat(user, "Something instinctual makes you pull away.") - return + to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") + return TRUE + + if(is_special_character(user) || jobban_isbanned(user, ROLE_TRAITOR) || jobban_isbanned(user, "Syndicate")) + to_chat(user, "Something instinctual makes you pull away.") + return TRUE + + to_chat(user, "Your touch makes the Wish Granter stir. Are you really sure you want to do this?") + + for(var/supname in GLOB.all_superheroes) + types += supname + + var/wish + if(types.len == 1) + wish = pick(types) else - - to_chat(user, "Your touch makes the Wish Granter stir. Are you really sure you want to do this?") - - for(var/supname in GLOB.all_superheroes) - types += supname - - var/wish - if(types.len == 1) - wish = pick(types) - else - wish = input("You want to become...","Wish") as null|anything in types + wish = input("You want to become...", "Wish") as null|anything in types - if(!src || !wish || user.stat == DEAD || (get_dist(src, user) > 4)) //another check after the input to check if someone already used it, closed it, or if they're dead, or if they ran off - return + if(!wish || user.stat == DEAD || (get_dist(src, user) > 4)) // Another check after the input to check if someone already used it, closed it, or if they're dead, or if they ran off. + return - var/datum/superheroes/S = GLOB.all_superheroes[wish] - if(S.activated) - to_chat(user,"There can only be one! Pick something else!") - return + var/datum/superheroes/S = GLOB.all_superheroes[wish] + if(S.activated) + to_chat(user,"There can only be one! Pick something else!") + return - S.create(user) - S.activated = TRUE //sets this superhero as taken so we don't have duplicates - playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1) - visible_message("The wishgranter fades into mist..") - add_attack_logs(null, user, "Became [GLOB.all_superheroes[wish]]") - notify_ghosts("[GLOB.all_superheroes[wish]] has appeared in [get_area(user)].", source = user) - qdel(src) + S.create(user) + S.activated = TRUE //sets this superhero as taken so we don't have duplicates + + playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1) + visible_message("The wishgranter fades into mist..") + add_attack_logs(null, user, "Became [GLOB.all_superheroes[wish]]") + notify_ghosts("[GLOB.all_superheroes[wish]] has appeared in [get_area(user)].", source = user) + qdel(src) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 3db9272cce8..fc8d8b1e83d 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -33,6 +33,7 @@ "Phazon", "Exosuit Equipment", "Cyborg Upgrade Modules", + "Medical", "Misc" ) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index d9d9d5dd261..258d0eb7898 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -23,6 +23,7 @@ infra_luminosity = 15 //byond implementation is bugged. force = 5 armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + var/ruin_mecha = FALSE //if the mecha starts on a ruin, don't automatically give it a tracking beacon to prevent metagaming. var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items) var/can_move = 0 // time of next allowed movement var/mob/living/carbon/occupant = null @@ -137,6 +138,10 @@ //////////////////////// ////// Helpers ///////// //////////////////////// + +/obj/mecha/get_cell() + return cell + /obj/mecha/proc/add_airtank() internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) return internal_tank diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index e4c001a508a..516b57e898a 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -3,4 +3,5 @@ /obj/mecha/working/New() ..() - trackers += new /obj/item/mecha_parts/mecha_tracking(src) + if(!ruin_mecha) + trackers += new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 3c5fea2a967..c410a9130a0 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -88,7 +88,7 @@ var/global/list/image/splatter_cache = list() return TRUE //Add "bloodiness" of this blood's type, to the human's shoes -/obj/effect/decal/cleanable/blood/Crossed(atom/movable/O) +/obj/effect/decal/cleanable/blood/Crossed(atom/movable/O, oldloc) if(!off_floor && ishuman(O)) var/mob/living/carbon/human/H = O var/obj/item/organ/external/l_foot = H.get_organ("l_foot") diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index 8598381aaf1..1e45c2aa4cf 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -29,7 +29,7 @@ var/global/list/image/fluidtrack_cache = list() blood_state = BLOOD_STATE_HUMAN //the icon state to load images from -/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O) +/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O, oldloc) if(ishuman(O)) var/mob/living/carbon/human/H = O var/obj/item/clothing/shoes/S = H.shoes diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index d061aca8d95..8bb117b832c 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -345,7 +345,7 @@ steam.start() -- spawns the effect return 1 -/obj/effect/effect/bad_smoke/Crossed(mob/living/carbon/M as mob ) +/obj/effect/effect/bad_smoke/Crossed(mob/living/carbon/M as mob, oldloc) ..() if(istype(M, /mob/living/carbon)) if(M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT)) @@ -569,7 +569,7 @@ steam.start() -- spawns the effect M.coughedtime = 0 return -/obj/effect/effect/sleep_smoke/Crossed(mob/living/carbon/M as mob ) +/obj/effect/effect/sleep_smoke/Crossed(mob/living/carbon/M as mob, oldloc) ..() if(istype(M, /mob/living/carbon)) if(M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT)) @@ -672,7 +672,7 @@ steam.start() -- spawns the effect R.updatehealth() return -/obj/effect/effect/mustard_gas/Crossed(mob/living/carbon/human/R as mob ) +/obj/effect/effect/mustard_gas/Crossed(mob/living/carbon/human/R as mob, oldloc) ..() if(istype(R, /mob/living/carbon/human)) if(R.internal != null && usr.wear_mask && (R.wear_mask.flags & AIRTIGHT) && R.wear_suit != null && !istype(R.wear_suit, /obj/item/clothing/suit/storage/labcoat) && !istype(R.wear_suit, /obj/item/clothing/suit/straight_jacket) && !istype(R.wear_suit, /obj/item/clothing/suit/straight_jacket && !istype(R.wear_suit, /obj/item/clothing/suit/armor))) @@ -984,7 +984,7 @@ steam.start() -- spawns the effect qdel(src) -/obj/structure/foam/Crossed(var/atom/movable/AM) +/obj/structure/foam/Crossed(var/atom/movable/AM, oldloc) if(metal) return diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index b44c4e3dd1b..f134bd44b10 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -94,7 +94,7 @@ spawn(5) qdel(src) -/obj/effect/particle_effect/foam/Crossed(atom/movable/AM) +/obj/effect/particle_effect/foam/Crossed(atom/movable/AM, oldloc) if(metal) return diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index ddce32f68fa..93ab0c8e51b 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -52,7 +52,7 @@ steps-- return 1 -/obj/effect/particle_effect/smoke/Crossed(mob/living/M) +/obj/effect/particle_effect/smoke/Crossed(mob/living/M, oldloc) if(!istype(M)) return smoke_mob(M) @@ -207,4 +207,4 @@ return 1 /datum/effect_system/smoke_spread/sleeping - effect_type = /obj/effect/particle_effect/smoke/sleeping \ No newline at end of file + effect_type = /obj/effect/particle_effect/smoke/sleeping diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 547df1b96ef..76e28f013a1 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -11,7 +11,7 @@ /obj/effect/mine/proc/mineEffect(mob/living/victim) to_chat(victim, "*click*") -/obj/effect/mine/Crossed(AM as mob|obj) +/obj/effect/mine/Crossed(AM as mob|obj, oldloc) if(!isliving(AM)) return var/mob/living/M = AM diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index a4020af9d0d..f36902664f8 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -3,7 +3,6 @@ desc = "Looks unstable. Best to test it with the clown." icon = 'icons/obj/stationobjs.dmi' icon_state = "portal" - density = TRUE unacidable = TRUE anchored = TRUE @@ -17,9 +16,6 @@ var/can_multitool_to_remove = FALSE var/ignore_tele_proof_area_setting = FALSE -/obj/effect/portal/Bumped(mob/M as mob|obj) - teleport(M) - /obj/effect/portal/New(loc, turf/target, creator = null, lifespan = 300) ..() @@ -49,10 +45,13 @@ /obj/effect/portal/singularity_act() return -/obj/effect/portal/Crossed(atom/movable/AM) +/obj/effect/portal/Crossed(atom/movable/AM, oldloc) if(isobserver(AM)) return ..() + if(target && (get_turf(oldloc) == get_turf(target))) + return ..() + if(!teleport(AM)) return ..() @@ -79,14 +78,20 @@ user.forceMove(get_turf(src)) return TRUE -/obj/effect/portal/proc/teleport(atom/movable/M, force = FALSE) +/obj/effect/portal/proc/can_teleport(atom/movable/M) + . = TRUE + if(!istype(M)) - return FALSE + . = FALSE if(!M.simulated || iseffect(M)) - return FALSE + . = FALSE if(M.anchored && ismecha(M)) + . = FALSE + +/obj/effect/portal/proc/teleport(atom/movable/M) + if(!can_teleport(M)) return FALSE if(!target) diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index e8cd72b81e9..c1231e698fc 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -1,23 +1,43 @@ /* Simple object type, calls a proc when "stepped" on by something */ /obj/effect/step_trigger - var/affect_ghosts = 0 - var/stopper = 1 // stops throwers - invisibility = 101 // nope cant see this shit - anchored = 1 + var/affect_ghosts = FALSE + var/stopper = TRUE // stops throwers + var/mobs_only = FALSE + invisibility = INVISIBILITY_ABSTRACT // nope cant see this shit + anchored = TRUE /obj/effect/step_trigger/proc/Trigger(var/atom/movable/A) - return 0 + return FALSE -/obj/effect/step_trigger/Crossed(H as mob|obj) - ..() +/obj/effect/step_trigger/Crossed(var/H, oldloc) + . = ..() if(!H) return - if(istype(H, /mob/dead/observer) && !affect_ghosts) + if(isobserver(H) && !affect_ghosts) + return + if(!ismob(H) && mobs_only) return Trigger(H) +/obj/effect/step_trigger/singularity_act() + return +/obj/effect/step_trigger/singularity_pull() + return + +/* Sends a message to mob when triggered*/ + +/obj/effect/step_trigger/message + var/message //the message to give to the mob + var/once = 1 + mobs_only = TRUE + +/obj/effect/step_trigger/message/Trigger(mob/M) + if(M.client) + to_chat(M, "[message]") + if(once) + qdel(src) /* Tosses things in a certain direction */ @@ -30,57 +50,57 @@ var/nostop = 0 // if 1: will only be stopped by teleporters var/list/affecting = list() - Trigger(var/atom/A) - if(!A || !istype(A, /atom/movable)) +/obj/effect/step_trigger/thrower/Trigger(atom/A) + if(!A || !ismovableatom(A)) + return + var/atom/movable/AM = A + var/curtiles = 0 + var/stopthrow = 0 + for(var/obj/effect/step_trigger/thrower/T in orange(2, src)) + if(AM in T.affecting) return - var/atom/movable/AM = A - var/curtiles = 0 - var/stopthrow = 0 - for(var/obj/effect/step_trigger/thrower/T in orange(2, src)) - if(AM in T.affecting) - return - if(ismob(AM)) - var/mob/M = AM - if(immobilize) - M.canmove = 0 + if(isliving(AM)) + var/mob/living/M = AM + if(immobilize) + M.canmove = FALSE - affecting.Add(AM) - while(AM && !stopthrow) - if(tiles) - if(curtiles >= tiles) - break - if(AM.z != src.z) + affecting.Add(AM) + while(AM && !stopthrow) + if(tiles) + if(curtiles >= tiles) break + if(AM.z != src.z) + break - curtiles++ + curtiles++ - sleep(speed) + sleep(speed) - // Calculate if we should stop the process - if(!nostop) - for(var/obj/effect/step_trigger/T in get_step(AM, direction)) - if(T.stopper && T != src) - stopthrow = 1 - else - for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction)) - if(T.stopper) - stopthrow = 1 + // Calculate if we should stop the process + if(!nostop) + for(var/obj/effect/step_trigger/T in get_step(AM, direction)) + if(T.stopper && T != src) + stopthrow = 1 + else + for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction)) + if(T.stopper) + stopthrow = 1 - if(AM) - var/predir = AM.dir - step(AM, direction) - if(!facedir) - AM.dir = predir + if(AM) + var/predir = AM.dir + step(AM, direction) + if(!facedir) + AM.setDir(predir) - affecting.Remove(AM) + affecting.Remove(AM) - if(ismob(AM)) - var/mob/M = AM - if(immobilize) - M.canmove = 1 + if(isliving(AM)) + var/mob/living/M = AM + if(immobilize) + M.canmove = TRUE /* Stops things thrown by a thrower, doesn't do anything */ @@ -93,12 +113,11 @@ var/teleport_y = 0 var/teleport_z = 0 - Trigger(var/atom/movable/A) - if(teleport_x && teleport_y && teleport_z) +/obj/effect/step_trigger/teleporter/Trigger(atom/movable/A) + if(teleport_x && teleport_y && teleport_z) - A.x = teleport_x - A.y = teleport_y - A.z = teleport_z + var/turf/T = locate(teleport_x, teleport_y, teleport_z) + A.forceMove(T) /* Random teleporter, teleports atoms to locations ranging from teleport_x - teleport_x_offset, etc */ @@ -107,11 +126,73 @@ var/teleport_y_offset = 0 var/teleport_z_offset = 0 - Trigger(var/atom/movable/A) - if(teleport_x && teleport_y && teleport_z) - if(teleport_x_offset && teleport_y_offset && teleport_z_offset) +/obj/effect/step_trigger/teleporter/random/Trigger(atom/movable/A) + if(teleport_x && teleport_y && teleport_z) + if(teleport_x_offset && teleport_y_offset && teleport_z_offset) - A.x = rand(teleport_x, teleport_x_offset) - A.y = rand(teleport_y, teleport_y_offset) - A.z = rand(teleport_z, teleport_z_offset) + var/turf/T = locate(rand(teleport_x, teleport_x_offset), rand(teleport_y, teleport_y_offset), rand(teleport_z, teleport_z_offset)) + if (T) + A.forceMove(T) +/* Fancy teleporter, creates sparks and smokes when used */ + +/obj/effect/step_trigger/teleport_fancy + var/locationx + var/locationy + var/uses = 1 //0 for infinite uses + var/entersparks = 0 + var/exitsparks = 0 + var/entersmoke = 0 + var/exitsmoke = 0 + +/obj/effect/step_trigger/teleport_fancy/Trigger(mob/M) + var/dest = locate(locationx, locationy, z) + M.Move(dest) + + if(entersparks) + var/datum/effect_system/spark_spread/s = new + s.set_up(4, 1, src) + s.start() + if(exitsparks) + var/datum/effect_system/spark_spread/s = new + s.set_up(4, 1, dest) + s.start() + + if(entersmoke) + var/datum/effect_system/smoke_spread/s = new + s.set_up(4, 1, src, 0) + s.start() + if(exitsmoke) + var/datum/effect_system/smoke_spread/s = new + s.set_up(4, 1, dest, 0) + s.start() + + uses-- + if(uses == 0) + qdel(src) + +/* Simple sound player, Mapper friendly! */ + +/obj/effect/step_trigger/sound_effect + var/sound //eg. path to the sound, inside '' eg: 'growl.ogg' + var/volume = 100 + var/freq_vary = 1 //Should the frequency of the sound vary? + var/extra_range = 0 // eg World.view = 7, extra_range = 1, 7+1 = 8, 8 turfs radius + var/happens_once = 0 + var/triggerer_only = 0 //Whether the triggerer is the only person who hears this + + +/obj/effect/step_trigger/sound_effect/Trigger(atom/movable/A) + var/turf/T = get_turf(A) + + if(!T) + return + + if(triggerer_only && ismob(A)) + var/mob/B = A + B.playsound_local(T, sound, volume, freq_vary) + else + playsound(T, sound, volume, freq_vary, extra_range) + + if(happens_once) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index f6b654ccbbe..1dc126faa6c 100644 --- a/code/game/objects/effects/temporary_visuals/clockcult.dm +++ b/code/game/objects/effects/temporary_visuals/clockcult.dm @@ -6,6 +6,10 @@ randomdir = 0 layer = ABOVE_NORMAL_TURF_LAYER +/obj/effect/temp_visual/ratvar/door + icon_state = "ratvardoorglow" + layer = CLOSED_DOOR_LAYER //above closed doors + /obj/effect/temp_visual/ratvar/door/window icon_state = "ratvarwindoorglow" layer = ABOVE_WINDOW_LAYER @@ -16,9 +20,27 @@ /obj/effect/temp_visual/ratvar/beam/grille layer = BELOW_OBJ_LAYER +/obj/effect/temp_visual/ratvar/beam/itemconsume + layer = HIGH_OBJ_LAYER + +/obj/effect/temp_visual/ratvar/beam/falsewall + layer = OBJ_LAYER + +/obj/effect/temp_visual/ratvar/beam/catwalk + layer = LATTICE_LAYER + +/obj/effect/temp_visual/ratvar/wall + icon_state = "ratvarwallglow" + +/obj/effect/temp_visual/ratvar/wall/false + layer = OBJ_LAYER + /obj/effect/temp_visual/ratvar/floor icon_state = "ratvarfloorglow" +/obj/effect/temp_visual/ratvar/floor/catwalk + layer = LATTICE_LAYER + /obj/effect/temp_visual/ratvar/window icon_state = "ratvarwindowglow" layer = ABOVE_OBJ_LAYER @@ -26,6 +48,10 @@ /obj/effect/temp_visual/ratvar/window/single icon_state = "ratvarwindowglow_s" +/obj/effect/temp_visual/ratvar/gear + icon_state = "ratvargearglow" + layer = BELOW_OBJ_LAYER + /obj/effect/temp_visual/ratvar/grille icon_state = "ratvargrilleglow" layer = BELOW_OBJ_LAYER diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 073cd0df669..9dbb02553ca 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -578,7 +578,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/proc/is_equivalent(obj/item/I) return I == src -/obj/item/Crossed(atom/movable/AM) +/obj/item/Crossed(atom/movable/AM, oldloc) . = ..() if(prob(trip_chance) && ishuman(AM)) var/mob/living/carbon/human/H = AM diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 0c7e4a509f3..a566f208082 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -65,8 +65,8 @@ /obj/item/areaeditor/permit/create_area() - ..() - qdel(src) + if(..()) + qdel(src) //free golem blueprints, like permit but can claim as much as needed @@ -186,25 +186,26 @@ /obj/item/areaeditor/proc/create_area() + var/area_created = FALSE var/res = detect_room(get_turf(usr)) if(!istype(res,/list)) switch(res) if(ROOM_ERR_SPACE) to_chat(usr, "The new area must be completely airtight.") - return + return area_created if(ROOM_ERR_TOOLARGE) to_chat(usr, "The new area is too large.") - return + return area_created else to_chat(usr, "Error! Please notify administration.") - return + return area_created var/list/turf/turfs = res var/str = trim(stripped_input(usr,"New area name:", "Blueprint Editing", "", MAX_NAME_LEN)) if(!str || !length(str)) //cancel - return + return area_created if(length(str) > 50) to_chat(usr, "The given name is too long. The area remains undefined.") - return + return area_created var/area/A = new A.name = str A.power_equip = FALSE @@ -220,7 +221,8 @@ thing.change_area(old_area, A) interact() - return + area_created = TRUE + return area_created /obj/item/areaeditor/proc/edit_area() var/area/A = get_area() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 9bb036c4d05..cad4ae25ac8 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -591,6 +591,9 @@ REAGENT SCANNER var/scan_time = 10 SECONDS //how long does it take to scan var/scan_cd = 60 SECONDS //how long before we can scan again +/obj/item/bodyanalyzer/get_cell() + return power_supply + /obj/item/bodyanalyzer/advanced cell_type = /obj/item/stock_parts/cell/upgraded/plus diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 0bdc88c5b52..0e95f509463 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -195,8 +195,6 @@ heal_burn = 25 //Medical Herbs// - - /obj/item/stack/medical/bruise_pack/comfrey name = "\improper Comfrey leaf" singular_name = "Comfrey leaf" @@ -217,48 +215,55 @@ color = "#4CC5C7" heal_burn = 12 - -//Splints// - - +// Splints /obj/item/stack/medical/splint name = "medical splints" singular_name = "medical splint" icon_state = "splint" - unique_handling = 1 + unique_handling = TRUE self_delay = 100 + var/other_delay = 0 /obj/item/stack/medical/splint/attack(mob/living/M, mob/user) if(..()) - return 1 + return TRUE if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) var/limb = affecting.name + if(!(affecting.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot"))) to_chat(user, "You can't apply a splint there!") - return + return TRUE + if(affecting.status & ORGAN_SPLINTED) to_chat(user, "[H]'s [limb] is already splinted!") - if(alert(user, "Would you like to remove the splint from [H]'s [limb]?", "Removing.", "Yes", "No") == "Yes") + if(alert(user, "Would you like to remove the splint from [H]'s [limb]?", "Splint removal.", "Yes", "No") == "Yes") affecting.status &= ~ORGAN_SPLINTED H.handle_splints() to_chat(user, "You remove the splint from [H]'s [limb].") - return - if(M == user) - user.visible_message("[user] starts to apply [src] to [user.p_their()] [limb].", \ - "You start to apply [src] to your [limb].", \ - "You hear something being wrapped.") - if(!do_mob(user, H, self_delay)) - return - else - user.visible_message("[user] applies [src] to [H]'s [limb].", \ - "You apply [src] to [H]'s [limb].", \ - "You hear something being wrapped.") + return TRUE + + if((M == user && self_delay > 0) || (M != user && other_delay > 0)) + user.visible_message("[user] starts to apply [src] to [H]'s [limb].", \ + "You start to apply [src] to [H]'s [limb].", \ + "You hear something being wrapped.") + + if(M == user && !do_mob(user, H, self_delay)) + return TRUE + else if(!do_mob(user, H, other_delay)) + return TRUE + + user.visible_message("[user] applies [src] to [H]'s [limb].", \ + "You apply [src] to [H]'s [limb].") affecting.status |= ORGAN_SPLINTED affecting.splinted_count = H.step_count H.handle_splints() - use(1) + +/obj/item/stack/medical/splint/tribal + name = "tribal splints" + icon_state = "tribal_splint" + other_delay = 50 diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index dfb756d8c25..def012e2663 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -32,6 +32,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ created_window = /obj/structure/window/basic full_window = /obj/structure/window/full/basic merge_type = /obj/item/stack/sheet/glass + point_value = 1 /obj/item/stack/sheet/glass/fifty amount = 50 @@ -90,6 +91,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ created_window = /obj/structure/window/reinforced full_window = /obj/structure/window/full/reinforced merge_type = /obj/item/stack/sheet/rglass + point_value = 4 /obj/item/stack/sheet/rglass/cyborg materials = list() @@ -113,6 +115,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ origin_tech = "plasmatech=2;materials=2" created_window = /obj/structure/window/plasmabasic full_window = /obj/structure/window/full/plasmabasic + point_value = 19 /obj/item/stack/sheet/plasmaglass/New(loc, amount) recipes = GLOB.pglass_recipes @@ -154,6 +157,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ created_window = /obj/structure/window/plasmareinforced full_window = /obj/structure/window/full/plasmareinforced armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) + point_value = 23 /obj/item/stack/sheet/plasmarglass/New(loc, amount) recipes = GLOB.prglass_recipes diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 72c0bef16ff..8c60bcefa11 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -144,6 +144,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( origin_tech = "materials=6" sheettype = "diamond" materials = list(MAT_DIAMOND=MINERAL_MATERIAL_AMOUNT) + point_value = 25 /obj/item/stack/sheet/mineral/diamond/New() ..() @@ -156,6 +157,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( origin_tech = "materials=5" sheettype = "uranium" materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT) + point_value = 20 /obj/item/stack/sheet/mineral/uranium/New() ..() @@ -170,6 +172,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) burn_state = FLAMMABLE burntime = 5 + point_value = 20 /obj/item/stack/sheet/mineral/plasma/New() ..() @@ -196,6 +199,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( origin_tech = "materials=4" sheettype = "gold" materials = list(MAT_GOLD=MINERAL_MATERIAL_AMOUNT) + point_value = 20 /obj/item/stack/sheet/mineral/gold/New() ..() @@ -208,6 +212,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( origin_tech = "materials=4" sheettype = "silver" materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT) + point_value = 20 /obj/item/stack/sheet/mineral/silver/New() ..() @@ -220,6 +225,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( origin_tech = "materials=4" sheettype = "bananium" materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT) + point_value = 50 /obj/item/stack/sheet/mineral/bananium/New(loc, amount=null) ..() @@ -233,6 +239,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( sheettype = "tranquillite" materials = list(MAT_TRANQUILLITE=MINERAL_MATERIAL_AMOUNT) wall_allowed = FALSE //no tranquilite walls in code + point_value = 50 /obj/item/stack/sheet/mineral/tranquillite/New(loc, amount=null) ..() @@ -253,6 +260,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( throw_range = 3 sheettype = "titanium" materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT) + point_value = 20 var/global/list/datum/stack_recipe/titanium_recipes = list ( new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), @@ -282,6 +290,7 @@ var/global/list/datum/stack_recipe/titanium_recipes = list ( throw_range = 3 sheettype = "plastitanium" materials = list(MAT_TITANIUM=2000, MAT_PLASMA=2000) + point_value = 45 var/global/list/datum/stack_recipe/plastitanium_recipes = list ( new/datum/stack_recipe("plas-titanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 94f195e9c20..9ec921fef92 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -16,6 +16,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list( new /datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = 1, on_floor = 1), + new /datum/stack_recipe("shuttle seat", /obj/structure/chair/comfy/shuttle, 2, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, one_per_turf = 1, on_floor = 1), @@ -105,6 +106,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list( flags = CONDUCT origin_tech = "materials=1" merge_type = /obj/item/stack/sheet/metal + point_value = 2 /obj/item/stack/sheet/metal/cyborg materials = list() @@ -151,6 +153,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list( flags = CONDUCT origin_tech = "materials=2" merge_type = /obj/item/stack/sheet/plasteel + point_value = 23 /obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null) recipes = plasteel_recipes @@ -214,6 +217,8 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \ null, \ new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \ new/datum/stack_recipe("black gloves", /obj/item/clothing/gloves/color/black, 3), \ + null, \ + new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 3), \ ) /obj/item/stack/sheet/cloth @@ -333,10 +338,13 @@ var/global/list/datum/stack_recipe/cult = list ( \ * Brass */ var/global/list/datum/stack_recipe/brass_recipes = list (\ + new/datum/stack_recipe("wall gear", /obj/structure/clockwork/wall_gear, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ + null, new/datum/stack_recipe/window("brass windoor", /obj/machinery/door/window/clockwork, 2, time = 30, on_floor = TRUE, window_checks = TRUE), \ null, new/datum/stack_recipe/window("directional brass window", /obj/structure/window/reinforced/clockwork, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe/window("fulltile brass window", /obj/structure/window/reinforced/clockwork/fulltile, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("brass chair", /obj/structure/chair/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \ ) diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 100704ed658..13774b0db4b 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -9,22 +9,10 @@ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") var/perunit = MINERAL_MATERIAL_AMOUNT var/sheettype = null //this is used for girders in the creation of walls/false walls + var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity. + var/created_window = null //apparently glass sheets don't share a base type for glass specifically, so each had to define these vars individually var/full_window = null //moving the var declaration to here so this can be checked cleaner until someone is willing to make them share a base type properly usesound = 'sound/items/deconstruct.ogg' toolspeed = 1 var/wall_allowed = TRUE //determines if sheet can be used in wall construction or not. - - -// Since the sheetsnatcher was consolidated into weapon/storage/bag we now use -// item/attackby() properly, making this unnecessary - -/*/obj/item/stack/sheet/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/storage/bag/sheetsnatcher)) - var/obj/item/storage/bag/sheetsnatcher/S = W - if(!S.mode) - S.add(src,user) - else - for(var/obj/item/stack/sheet/stack in locate(src.x,src.y,src.z)) - S.add(stack,user) - ..()*/ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 75decb95413..f0830f34c40 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -31,7 +31,7 @@ if(S.merge_type == merge_type) merge(S) -/obj/item/stack/Crossed(obj/O) +/obj/item/stack/Crossed(obj/O, oldloc) if(amount >= max_amount || ismob(loc)) // Prevents unnecessary call. Also prevents merging stack automatically in a mob's inventory return if(istype(O, merge_type) && !O.throwing) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 09712304f87..a8ddcf6d315 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -208,6 +208,7 @@ origin_tech = null attack_verb = list("attacked", "struck", "hit") brightness_on = 0 + sharp_when_wielded = FALSE // It's a toy /obj/item/twohanded/dualsaber/toy/hit_reaction() return 0 @@ -283,7 +284,7 @@ ..() pop_burst() -/obj/item/toy/snappop/Crossed(H as mob|obj) +/obj/item/toy/snappop/Crossed(H as mob|obj, oldloc) if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 05f725fcf54..fbdc403d758 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -22,6 +22,9 @@ var/obj/item/stock_parts/cell/high/bcell = null var/combat = 0 //can we revive through space suits? +/obj/item/defibrillator/get_cell() + return bcell + /obj/item/defibrillator/New() //starts without a cell for rnd ..() paddles = make_paddles() diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 40fc1bf7d56..084dac30a60 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -25,20 +25,34 @@ if(special_die == "100") new /obj/item/dice/d100(src) +/obj/item/storage/pill_bottle/dice/suicide_act(mob/user) + user.visible_message("[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!") + return (OXYLOSS) + /obj/item/dice //depreciated d6, use /obj/item/dice/d6 if you actually want a d6 name = "die" desc = "A die with six sides. Basic and servicable." icon = 'icons/obj/dice.dmi' icon_state = "d6" w_class = WEIGHT_CLASS_TINY + var/sides = 6 var/result = null var/list/special_faces = list() //entries should match up to sides var if used -/obj/item/dice/New() - result = rand(1, sides) + var/rigged = DICE_NOT_RIGGED + var/rigged_value + +/obj/item/dice/Initialize(mapload) + . = ..() + if(!result) + result = roll(sides) update_icon() +/obj/item/dice/suicide_act(mob/user) + user.visible_message("[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!") + return (OXYLOSS) + /obj/item/dice/d1 name = "d1" desc = "A die with one side. Deterministic!" @@ -117,11 +131,19 @@ . = ..() /obj/item/dice/proc/diceroll(mob/user) - result = rand(1, sides) - var/fake_result = rand(1, sides)//Daredevil isn't as good as he used to be + result = roll(sides) + if(rigged != DICE_NOT_RIGGED && result != rigged_value) + if(rigged == DICE_BASICALLY_RIGGED && prob(Clamp(1/(sides - 1) * 100, 25, 80))) + result = rigged_value + else if(rigged == DICE_TOTALLY_RIGGED) + result = rigged_value + + . = result + + var/fake_result = roll(sides)//Daredevil isn't as good as he used to be var/comment = "" if(sides == 20 && result == 20) - comment = "Nat 20!" + comment = "NAT 20!" else if(sides == 20 && result == 1) comment = "Ouch, bad luck." update_icon() @@ -130,16 +152,18 @@ if(special_faces.len == sides) result = special_faces[result] if(user != null) //Dice was rolled in someone's hand - user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ + user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ "You throw [src]. It lands on [result]. [comment]", \ "You hear [src] rolling, it sounds like a [fake_result].") - else if(!throwing) //Dice was thrown and is coming to rest + else if(!src.throwing) //Dice was thrown and is coming to rest visible_message("[src] rolls to a stop, landing on [result]. [comment]") /obj/item/dice/d20/e20/diceroll(mob/user as mob, thrown) if(triggered) return - ..() + + . = ..() + if(result == 1) to_chat(user, "Rocks fall, you die.") user.gib() @@ -166,7 +190,7 @@ /obj/item/dice/update_icon() overlays.Cut() - overlays += "[src.icon_state][src.result]" + overlays += "[icon_state][result]" /obj/item/storage/box/dice name = "Box of dice" diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index d17287b01a6..c35eed4fae5 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -48,9 +48,9 @@ /obj/item/grenade/plastic/receive_signal() prime() -/obj/item/grenade/plastic/Crossed(atom/movable/AM) +/obj/item/grenade/plastic/Crossed(atom/movable/AM, oldloc) if(nadeassembly) - nadeassembly.Crossed(AM) + nadeassembly.Crossed(AM, oldloc) /obj/item/grenade/plastic/on_found(mob/finder) if(nadeassembly) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 31bc6bcf556..3e313bcac33 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -239,9 +239,9 @@ if(nadeassembly) nadeassembly.process_movement() -/obj/item/grenade/chem_grenade/Crossed(atom/movable/AM) +/obj/item/grenade/chem_grenade/Crossed(atom/movable/AM, oldloc) if(nadeassembly) - nadeassembly.Crossed(AM) + nadeassembly.Crossed(AM, oldloc) /obj/item/grenade/chem_grenade/on_found(mob/finder) if(nadeassembly) @@ -289,7 +289,7 @@ var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) var/turf/T = get_turf(src) var/area/A = get_area(T) - message_admins("grenade primed by an assembly, attached by [key_name_admin(M)][ADMIN_QUE(M,"(?)")] ([admin_jump_link(M)]) and last touched by [key_name_admin(last)][ADMIN_QUE(last,"(?)")] ([admin_jump_link(last)]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP). [contained]") + message_admins("grenade primed by an assembly, attached by [key_name_admin(M)] and last touched by [key_name_admin(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP). [contained]") log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z]) [contained]") update_mob() @@ -419,7 +419,7 @@ var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) var/turf/T = get_turf(src) var/area/A = get_area(T) - message_admins("grenade primed by an assembly, attached by [key_name_admin(M)][ADMIN_QUE(M,"(?)")] ([ADMIN_FLW(M,"FLW")]) and last touched by [key_name_admin(last)][ADMIN_QUE(last,"(?)")] ([ADMIN_FLW(last,"FLW")]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") + message_admins("grenade primed by an assembly, attached by [key_name_admin(M)] and last touched by [key_name_admin(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") else addtimer(CALLBACK(src, .proc/prime), det_time) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 66e0ba6b110..77ae8fc73bb 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -87,7 +87,7 @@ return ..() -/obj/item/restraints/legcuffs/beartrap/Crossed(AM as mob|obj) +/obj/item/restraints/legcuffs/beartrap/Crossed(AM as mob|obj, oldloc) if(armed && isturf(src.loc)) if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/hostile/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) var/mob/living/L = AM @@ -193,6 +193,6 @@ /obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom) if(iscarbon(hit_atom)) var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) - B.Crossed(hit_atom) + B.Crossed(hit_atom, null) qdel(src) ..() diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index 63a3ffef0c5..4381c4295c7 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -4,6 +4,9 @@ #define RPD_COOLDOWN_TIME 4 //How long should we have to wait between dispensing pipes? #define RPD_WALLBUILD_TIME 40 //How long should drilling into a wall take? +#define RPD_MENU_ROTATE "Rotate pipes" //Stuff for radial menu +#define RPD_MENU_FLIP "Flip pipes" //Stuff for radial menu +#define RPD_MENU_DELETE "Delete pipes" //Stuff for radial menu /obj/item/rpd name = "rapid pipe dispenser" @@ -172,6 +175,9 @@ var/list/pipemenu = list( ui.open() ui.set_auto_update(1) +/obj/item/rpd/AltClick(mob/user) + radial_menu(user) + /obj/item/rpd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state) var/data[0] data["iconrotation"] = iconrotation @@ -200,6 +206,44 @@ var/list/pipemenu = list( return SSnanoui.update_uis(src) +//RPD radial menu + +/obj/item/rpd/proc/check_menu(mob/living/user) + if(!istype(user)) + return + if(user.incapacitated()) + return + if(loc != user) + return + return TRUE + +/obj/item/rpd/proc/radial_menu(mob/user) + if(!check_menu(user)) + to_chat(user, "You can't do that right now!") + return + var/list/choices = list( + RPD_MENU_ROTATE = image(icon = 'icons/obj/interface.dmi', icon_state = "rpd_rotate"), + RPD_MENU_FLIP = image(icon = 'icons/obj/interface.dmi', icon_state = "rpd_flip"), + RPD_MENU_DELETE = image(icon = 'icons/obj/interface.dmi', icon_state = "rpd_delete"), + "UI" = image(icon = 'icons/obj/interface.dmi', icon_state = "ui_interact") + ) + var/selected_mode = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user)) + if(!check_menu(user)) + return + if(selected_mode == "UI") + ui_interact(user) + else + switch(selected_mode) + if(RPD_MENU_ROTATE) + mode = RPD_ROTATE_MODE + if(RPD_MENU_FLIP) + mode = RPD_FLIP_MODE + if(RPD_MENU_DELETE) + mode = RPD_DELETE_MODE + else + return //Either nothing was selected, or an invalid mode was selected + to_chat(user, "You set [src]'s mode.") + /obj/item/rpd/afterattack(atom/target, mob/user, proximity) ..() if(loc != user) @@ -236,3 +280,6 @@ var/list/pipemenu = list( #undef RPD_COOLDOWN_TIME #undef RPD_WALLBUILD_TIME +#undef RPD_MENU_ROTATE +#undef RPD_MENU_FLIP +#undef RPD_MENU_DELETE diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 428bfcd8fab..4c8697da247 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -67,7 +67,7 @@ else return ..() -/obj/item/shard/Crossed(AM as mob|obj) +/obj/item/shard/Crossed(AM as mob|obj, oldloc) if(isliving(AM)) var/mob/living/M = AM if(M.incorporeal_move || M.flying || M.throwing)//you are incorporal or flying or being thrown ..no shard stepping! diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 83e6f8e95f8..713259e081c 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -357,6 +357,21 @@ new /obj/item/ammo_box/magazine/m12g/buckshot(src) new /obj/item/ammo_box/magazine/m12g/dragon(src) +/obj/item/storage/backpack/duffel/mining_conscript/noid + name = "mining conscription kit" + desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." + +/obj/item/storage/backpack/duffel/mining_conscript/noid/New() + ..() + new /obj/item/pickaxe(src) + new /obj/item/clothing/glasses/meson(src) + new /obj/item/t_scanner/adv_mining_scanner/lesser(src) + new /obj/item/storage/bag/ore(src) + new /obj/item/clothing/under/rank/miner/lavaland(src) + new /obj/item/encryptionkey/headset_cargo(src) + new /obj/item/clothing/mask/gas(src) + + /obj/item/storage/backpack/duffel/syndie/ammo/smg desc = "A large duffel bag, packed to the brim with C-20r magazines." diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index f128b874eaa..526340daea5 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -20,6 +20,9 @@ user.visible_message("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide.") return FIRELOSS +/obj/item/melee/baton/get_cell() + return bcell + /obj/item/melee/baton/New() ..() update_icon() diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index e7e91178890..15456386541 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -28,12 +28,15 @@ var/force_wielded = 0 var/wieldsound = null var/unwieldsound = null + var/sharp_when_wielded = FALSE /obj/item/twohanded/proc/unwield(mob/living/carbon/user) if(!wielded || !user) return wielded = FALSE force = force_unwielded + if(sharp_when_wielded) + sharp = FALSE var/sf = findtext(name," (Wielded)") if(sf) name = copytext(name, 1, sf) @@ -66,6 +69,8 @@ return wielded = TRUE force = force_wielded + if(sharp_when_wielded) + sharp = TRUE name = "[name] (Wielded)" update_icon() if(user) @@ -224,7 +229,7 @@ origin_tech = "magnets=4;syndicate=5" attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 75 - sharp = TRUE + sharp_when_wielded = TRUE // only sharp when wielded light_power = 2 var/brightness_on = 2 var/colormap = list(red=LIGHT_COLOR_RED, blue=LIGHT_COLOR_LIGHTBLUE, green=LIGHT_COLOR_GREEN, purple=LIGHT_COLOR_PURPLE, rainbow=LIGHT_COLOR_WHITE) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index d23f4c9d606..bf13a05f691 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -235,14 +235,22 @@ var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive layer = MOB_LAYER +/obj/structure/alien/egg/grown + status = GROWN + icon_state = "egg" + +/obj/structure/alien/egg/burst + status = BURST + icon_state = "egg_hatched" /obj/structure/alien/egg/New() new /obj/item/clothing/mask/facehugger(src) ..() - spawn(rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME)) - Grow() if(status == BURST) obj_integrity = integrity_failure + else if(status != GROWN) + spawn(rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME)) + Grow() /obj/structure/alien/egg/attack_alien(mob/living/carbon/alien/user) return attack_hand(user) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 03b0172c959..2037293d734 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -452,7 +452,7 @@ icon_closed = transparent ? "bluespacetrans" : "bluespace" icon_state = opened ? icon_opened : icon_closed -/obj/structure/closet/bluespace/Crossed(atom/movable/AM) +/obj/structure/closet/bluespace/Crossed(atom/movable/AM, oldloc) if(AM.density) icon_state = opened ? "bluespaceopentrans" : "bluespacetrans" diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 9b777d45b58..4a70729d7e9 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -9,19 +9,26 @@ /obj/structure/falsewall name = "wall" desc = "A huge chunk of metal used to seperate rooms." - anchored = 1 + anchored = TRUE icon = 'icons/turf/walls/wall.dmi' icon_state = "wall" - var/mineral = "metal" - var/walltype = "metal" - var/opening = 0 - density = 1 - opacity = 1 + + var/mineral = /obj/item/stack/sheet/metal + var/mineral_amount = 2 + var/walltype = /turf/simulated/wall + var/girder_type = /obj/structure/girder/displaced + var/opening = FALSE + + density = TRUE + opacity = TRUE + + can_deconstruct = TRUE canSmoothWith = list( /turf/simulated/wall, /turf/simulated/wall/r_wall, /obj/structure/falsewall, + /obj/structure/falsewall/brass, /obj/structure/falsewall/reinforced, // WHY DO WE SMOOTH WITH FALSE R-WALLS WHEN WE DON'T SMOOTH WITH REAL R-WALLS. //because we do smooth with real r-walls now /turf/simulated/wall/rust, /turf/simulated/wall/r_wall/rust) @@ -31,6 +38,10 @@ ..() air_update_turf(1) +/obj/structure/falsewall/ratvar_act() + new /obj/structure/falsewall/brass(loc) + qdel(src) + /obj/structure/falsewall/Destroy() density = 0 air_update_turf(1) @@ -124,18 +135,11 @@ /obj/structure/falsewall/proc/dismantle(mob/user) user.visible_message("[user] dismantles the false wall.", "You dismantle the false wall.") - new /obj/structure/girder/displaced(loc) - if(mineral == "metal") - if(istype(src, /obj/structure/falsewall/reinforced)) - new /obj/item/stack/sheet/plasteel(loc, 2) - else - new /obj/item/stack/sheet/metal(loc, 2) - else if(mineral == "wood") - new/obj/item/stack/sheet/wood(loc, 2) - else - var/P = text2path("/obj/item/stack/sheet/mineral/[mineral]") - new P(loc) - new P(loc) + if(can_deconstruct) + new girder_type(loc) + if(mineral_amount) + for(var/i in 1 to mineral_amount) + new mineral(loc) playsound(src, 'sound/items/welder.ogg', 100, 1) qdel(src) @@ -148,7 +152,8 @@ desc = "A huge chunk of reinforced metal used to seperate rooms." icon = 'icons/turf/walls/reinforced_wall.dmi' icon_state = "r_wall" - walltype = "rwall" + walltype = /turf/simulated/wall/r_wall + mineral = /obj/item/stack/sheet/plasteel /obj/structure/falsewall/reinforced/ChangeToWall(delete = 1) var/turf/T = get_turf(src) @@ -166,8 +171,8 @@ desc = "A wall with uranium plating. This is probably a bad idea." icon = 'icons/turf/walls/uranium_wall.dmi' icon_state = "uranium" - mineral = "uranium" - walltype = "uranium" + mineral = /obj/item/stack/sheet/mineral/uranium + walltype = /turf/simulated/wall/mineral/uranium var/active = null var/last_event = 0 canSmoothWith = list(/obj/structure/falsewall/uranium, /turf/simulated/wall/mineral/uranium) @@ -201,8 +206,8 @@ desc = "A wall with gold plating. Swag!" icon = 'icons/turf/walls/gold_wall.dmi' icon_state = "gold" - mineral = "gold" - walltype = "gold" + mineral = /obj/item/stack/sheet/mineral/gold + walltype = /turf/simulated/wall/mineral/gold canSmoothWith = list(/obj/structure/falsewall/gold, /turf/simulated/wall/mineral/gold) /obj/structure/falsewall/silver @@ -210,8 +215,8 @@ desc = "A wall with silver plating. Shiny." icon = 'icons/turf/walls/silver_wall.dmi' icon_state = "silver" - mineral = "silver" - walltype = "silver" + mineral = /obj/item/stack/sheet/mineral/silver + walltype = /turf/simulated/wall/mineral/silver canSmoothWith = list(/obj/structure/falsewall/silver, /turf/simulated/wall/mineral/silver) /obj/structure/falsewall/diamond @@ -219,8 +224,8 @@ desc = "A wall with diamond plating. You monster." icon = 'icons/turf/walls/diamond_wall.dmi' icon_state = "diamond" - mineral = "diamond" - walltype = "diamond" + mineral = /obj/item/stack/sheet/mineral/diamond + walltype = /turf/simulated/wall/mineral/diamond canSmoothWith = list(/obj/structure/falsewall/diamond, /turf/simulated/wall/mineral/diamond) @@ -229,18 +234,18 @@ desc = "A wall with plasma plating. This is definately a bad idea." icon = 'icons/turf/walls/plasma_wall.dmi' icon_state = "plasma" - mineral = "plasma" - walltype = "plasma" + mineral = /obj/item/stack/sheet/mineral/plasma + walltype = /turf/simulated/wall/mineral/plasma canSmoothWith = list(/obj/structure/falsewall/plasma, /turf/simulated/wall/mineral/plasma, /turf/simulated/wall/mineral/alien) /obj/structure/falsewall/plasma/attackby(obj/item/W, mob/user, params) if(is_hot(W) > 300) - message_admins("Plasma falsewall ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma falsewall ignited by [key_name(user)] in ([x],[y],[z])") + message_admins("Plasma falsewall ignited by [key_name_admin(user)] in [ADMIN_VERBOSEJMP(T)]") + log_game("Plasma falsewall ignited by [key_name(user)] in [AREACOORD(T)]") investigate_log("was ignited by [key_name(user)]","atmos") burnbabyburn() - return - ..() + else + return ..() /obj/structure/falsewall/plasma/proc/burnbabyburn(user) playsound(src, 'sound/items/welder.ogg', 100, 1) @@ -258,8 +263,8 @@ desc = "A strange-looking alien wall." icon = 'icons/turf/walls/plasma_wall.dmi' icon_state = "plasma" - mineral = "alien" - walltype = "alien" + mineral = /obj/item/stack/sheet/mineral/abductor + walltype = /turf/simulated/wall/mineral/abductor canSmoothWith = list(/obj/structure/falsewall/alien, /turf/simulated/wall/mineral/alien) @@ -268,16 +273,16 @@ desc = "A wall with bananium plating. Honk!" icon = 'icons/turf/walls/bananium_wall.dmi' icon_state = "bananium" - mineral = "clown" - walltype = "clown" + mineral = /obj/item/stack/sheet/mineral/bananium + walltype = /turf/simulated/wall/mineral/bananium canSmoothWith = list(/obj/structure/falsewall/bananium, /turf/simulated/wall/mineral/bananium) /obj/structure/falsewall/sandstone name = "sandstone wall" desc = "A wall with sandstone plating." icon_state = "sandstone" - mineral = "sandstone" - walltype = "sandstone" + mineral = /obj/item/stack/sheet/mineral/sandstone + walltype = /turf/simulated/wall/mineral/sandstone canSmoothWith = list(/obj/structure/falsewall/sandstone, /turf/simulated/wall/mineral/sandstone) /obj/structure/falsewall/wood @@ -285,8 +290,8 @@ desc = "A wall with wooden plating. Stiff." icon = 'icons/turf/walls/wood_wall.dmi' icon_state = "wood" - mineral = "wood" - walltype = "wood" + mineral = /obj/item/stack/sheet/wood + walltype = /turf/simulated/wall/mineral/wood canSmoothWith = list(/obj/structure/falsewall/wood, /turf/simulated/wall/mineral/wood) /obj/structure/falsewall/iron @@ -294,8 +299,9 @@ desc = "A wall with rough metal plating." icon = 'icons/turf/walls/iron_wall.dmi' icon_state = "iron" - mineral = "metal" - walltype = "iron" + mineral = /obj/item/stack/rods + mineral_amount = 5 + walltype = /turf/simulated/wall/mineral/iron canSmoothWith = list(/obj/structure/falsewall/iron, /turf/simulated/wall/mineral/iron) /obj/structure/falsewall/abductor @@ -303,8 +309,8 @@ desc = "A wall with alien alloy plating." icon = 'icons/turf/walls/abductor_wall.dmi' icon_state = "abductor" - mineral = "abductor" - walltype = "abductor" + mineral = /obj/item/stack/sheet/mineral/abductor + walltype = /turf/simulated/wall/mineral/abductor canSmoothWith = list(/obj/structure/falsewall/abductor, /turf/simulated/wall/mineral/abductor) /obj/structure/falsewall/titanium @@ -324,3 +330,23 @@ walltype = /turf/simulated/wall/mineral/plastitanium smooth = SMOOTH_MORE canSmoothWith = list(/turf/simulated/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/full/shuttle, /obj/structure/shuttle/engine/heater) + +/obj/structure/falsewall/brass + name = "clockwork wall" + desc = "A huge chunk of warm metal. The clanging of machinery emanates from within." + icon = 'icons/turf/walls/clockwork_wall.dmi' + icon_state = "clockwork_wall" + resistance_flags = FIRE_PROOF + unacidable = TRUE + mineral_amount = 1 + canSmoothWith = list(/obj/effect/clockwork/overlay/wall, /obj/structure/falsewall/brass) + girder_type = /obj/structure/clockwork/wall_gear/displaced + walltype = /turf/simulated/wall/clockwork + mineral = /obj/item/stack/tile/brass + +/obj/structure/falsewall/brass/New(loc) + ..() + var/turf/T = get_turf(src) + new /obj/effect/temp_visual/ratvar/wall/false(T) + new /obj/effect/temp_visual/ratvar/beam/falsewall(T) + diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index 356d52e9d2a..a6a4f699314 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -63,3 +63,19 @@ /obj/structure/fluff/drake_statue/falling //A variety of statue in disrepair; parts are broken off and a gemstone is missing desc = "A towering basalt sculpture of a drake. Cracks run down its surface and parts of it have fallen off." icon_state = "drake_statue_falling" + +/obj/structure/fluff/divine + name = "Miracle" + icon = 'icons/obj/hand_of_god_structures.dmi' + anchored = TRUE + density = TRUE + +/obj/structure/fluff/divine/nexus + name = "nexus" + desc = "It anchors a deity to this world. It radiates an unusual aura. It looks well protected from explosive shock." + icon_state = "nexus" + +/obj/structure/fluff/divine/conduit + name = "conduit" + desc = "It allows a deity to extend their reach. Their powers are just as potent near a conduit as a nexus." + icon_state = "conduit" \ No newline at end of file diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 0e440e12f16..c1233aaee0c 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -32,6 +32,8 @@ if(resistance_flags & INDESTRUCTIBLE) return if(istype(C, /obj/item/wirecutters)) + var/obj/item/wirecutters/W = C + playsound(loc, W.usesound, 50, 1) to_chat(user, "Slicing [name] joints...") deconstruct() else @@ -39,8 +41,7 @@ return T.attackby(C, user) //hand this off to the turf instead (for building plating, catwalks, etc) /obj/structure/lattice/deconstruct(disassembled = TRUE) - if(!can_deconstruct) - new /obj/item/stack/rods(get_turf(src), number_of_rods) + new /obj/item/stack/rods(get_turf(src), number_of_rods) qdel(src) /obj/structure/lattice/blob_act() @@ -59,6 +60,26 @@ if(current_size >= STAGE_FOUR) qdel(src) +/obj/structure/lattice/clockwork + name = "cog lattice" + desc = "A lightweight support lattice. These hold the Justicar's station together." + icon = 'icons/obj/smooth_structures/lattice_clockwork.dmi' + +/obj/structure/lattice/clockwork/Initialize(mapload) + . = ..() + ratvar_act() + +/obj/structure/lattice/clockwork/ratvar_act() + if((x + y) % 2 != 0) + icon = 'icons/obj/smooth_structures/lattice_clockwork_large.dmi' + pixel_x = -9 + pixel_y = -9 + else + icon = 'icons/obj/smooth_structures/lattice_clockwork.dmi' + pixel_x = 0 + pixel_y = 0 + return TRUE + /obj/structure/lattice/catwalk name = "catwalk" desc = "A catwalk for easier EVA maneuvering and cable placement." @@ -82,3 +103,30 @@ for(var/obj/structure/cable/C in T) C.deconstruct() ..() + +/obj/structure/lattice/catwalk/clockwork + name = "clockwork catwalk" + icon = 'icons/obj/smooth_structures/catwalk_clockwork.dmi' + canSmoothWith = list(/obj/structure/lattice, + /turf/simulated/floor, + /turf/simulated/wall, + /obj/structure/falsewall) + smooth = SMOOTH_MORE + +/obj/structure/lattice/catwalk/clockwork/Initialize(mapload) + . = ..() + ratvar_act() + if(!mapload) + new /obj/effect/temp_visual/ratvar/floor/catwalk(loc) + new /obj/effect/temp_visual/ratvar/beam/catwalk(loc) + +/obj/structure/lattice/catwalk/clockwork/ratvar_act() + if((x + y) % 2 != 0) + icon = 'icons/obj/smooth_structures/catwalk_clockwork_large.dmi' + pixel_x = -9 + pixel_y = -9 + else + icon = 'icons/obj/smooth_structures/catwalk_clockwork.dmi' + pixel_x = 0 + pixel_y = 0 + return TRUE diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 0434638cc9a..f2d39dcd8ca 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -35,7 +35,7 @@ /obj/structure/mineral_door/Move() var/turf/T = loc - ..() + . = ..() move_update_air(T) /obj/structure/mineral_door/Bumped(atom/user) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index d8898a7d671..923fab9e885 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -6,7 +6,6 @@ icon_state = "mirror" density = 0 anchored = 1 - var/shattered = 0 var/list/ui_users = list() /obj/structure/mirror/New(turf/T, newdir = SOUTH, building = FALSE) @@ -23,7 +22,7 @@ pixel_x = 32 /obj/structure/mirror/attack_hand(mob/user) - if(shattered) + if(broken) return if(ishuman(user)) @@ -36,9 +35,9 @@ AC.ui_interact(user) /obj/structure/mirror/proc/shatter() - if(shattered) + if(broken) return - shattered = 1 + broken = TRUE icon_state = "mirror_broke" playsound(src, "shatter", 70, 1) desc = "Oh no, seven years of bad luck!" @@ -46,7 +45,7 @@ /obj/structure/mirror/bullet_act(obj/item/projectile/Proj) if(prob(Proj.damage * 2)) - if(!shattered) + if(!broken) shatter() else playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) @@ -58,7 +57,7 @@ if(isscrewdriver(I)) user.visible_message("[user] begins to unfasten [src].", "You begin to unfasten [src].") if(do_after(user, 30 * I.toolspeed, target = src)) - if(shattered) + if(broken) user.visible_message("[user] drops the broken shards to the floor.", "You drop the broken shards on the floor.") new /obj/item/shard(get_turf(user)) else @@ -68,7 +67,7 @@ return user.do_attack_animation(src) - if(shattered) + if(broken) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) return @@ -85,7 +84,7 @@ if(islarva(user)) return user.do_attack_animation(src) - if(shattered) + if(broken) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) return user.visible_message("[user] smashes [src]!") @@ -100,7 +99,7 @@ if(M.melee_damage_upper <= 0) return M.do_attack_animation(src) - if(shattered) + if(broken) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) return user.visible_message("[user] smashes [src]!") @@ -113,7 +112,7 @@ if(!S.is_adult) return user.do_attack_animation(src) - if(shattered) + if(broken) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) return user.visible_message("[user] smashes [src]!") @@ -136,7 +135,7 @@ icon_state = "magic_mirror" /obj/structure/mirror/magic/attack_hand(mob/user) - if(!ishuman(user)) + if(!ishuman(user) || broken) return var/mob/living/carbon/human/H = user @@ -154,6 +153,9 @@ H.dna.real_name = newname if(H.mind) H.mind.name = newname + + if(newname) + curse(user) if("Body") var/list/race_list = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin") @@ -172,6 +174,7 @@ AC.whitelist = race_list ui_users[user] = AC AC.ui_interact(user) + if("Voice") var/voice_choice = input(user, "Perhaps...", "Voice effects") as null|anything in list("Comic Sans", "Wingdings", "Swedish", "Chav") var/voice_mutation @@ -192,8 +195,17 @@ H.dna.SetSEState(voice_mutation, TRUE) genemutcheck(H, voice_mutation, null, MUTCHK_FORCED) + if(voice_choice) + curse(user) + +/obj/structure/mirror/magic/on_ui_close(mob/user) + curse(user) + /obj/structure/mirror/magic/attackby(obj/item/I, mob/living/user, params) return /obj/structure/mirror/magic/shatter() - return //can't be broken. it's magic, i ain't gotta explain shit \ No newline at end of file + return //can't be broken. it's magic, i ain't gotta explain shit + +/obj/structure/mirror/magic/proc/curse(mob/living/user) + return \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 903ee22c683..005f0e721fb 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -28,6 +28,11 @@ W.setDir(dir) qdel(src) +/obj/structure/chair/ratvar_act() + var/obj/structure/chair/brass/B = new(get_turf(src)) + B.setDir(dir) + qdel(src) + /obj/structure/chair/Move(atom/newloc, direct) ..() handle_rotation() @@ -146,35 +151,38 @@ name = "comfy chair" desc = "It looks comfy." icon_state = "comfychair" - color = rgb(255,255,255) + color = rgb(255, 255, 255) burn_state = FLAMMABLE burntime = 30 buildstackamount = 2 item_chair = null var/image/armrest = null -/obj/structure/chair/comfy/New() - armrest = image("icons/obj/chairs.dmi", "comfychair_armrest") +/obj/structure/chair/comfy/Initialize(mapload) + armrest = GetArmrest() armrest.layer = ABOVE_MOB_LAYER return ..() +/obj/structure/chair/comfy/proc/GetArmrest() + return mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest") + /obj/structure/chair/comfy/Destroy() QDEL_NULL(armrest) return ..() /obj/structure/chair/comfy/post_buckle_mob(mob/living/M) - ..() - if(buckled_mob) - overlays += armrest - else - overlays -= armrest + . = ..() + update_armrest() /obj/structure/chair/comfy/post_unbuckle_mob(mob/living/M) - ..() - if(buckled_mob) - overlays -= armrest + . = ..() + update_armrest() + +/obj/structure/chair/comfy/proc/update_armrest() + if(has_buckled_mobs()) + add_overlay(armrest) else - overlays += armrest + cut_overlay(armrest) /obj/structure/chair/comfy/brown color = rgb(141,70,0) @@ -209,6 +217,14 @@ item_chair = null buildstackamount = 5 +/obj/structure/chair/comfy/shuttle + name = "shuttle seat" + desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for smoother flights." + icon_state = "shuttle_chair" + +/obj/structure/chair/comfy/shuttle/GetArmrest() + return mutable_appearance('icons/obj/chairs.dmi', "shuttle_chair_armrest") + /obj/structure/chair/office/Bump(atom/A) ..() if(!buckled_mob) @@ -416,3 +432,41 @@ desc = "You sit in this. Either by will or force. Looks REALLY uncomfortable." icon_state = "chairold" item_chair = null + +// Brass chair +/obj/structure/chair/brass + name = "brass chair" + desc = "A spinny chair made of brass. It looks uncomfortable." + icon_state = "brass_chair" + max_integrity = 150 + buildstacktype = /obj/item/stack/tile/brass + buildstackamount = 1 + item_chair = null + var/turns = 0 + +/obj/structure/chair/brass/Destroy() + STOP_PROCESSING(SSfastprocess, src) + . = ..() + +/obj/structure/chair/brass/process() + setDir(turn(dir,-90)) + playsound(src, 'sound/effects/servostep.ogg', 50, FALSE) + turns++ + if(turns >= 8) + STOP_PROCESSING(SSfastprocess, src) + +/obj/structure/chair/brass/ratvar_act() + return + +/obj/structure/chair/brass/AltClick(mob/living/user) + turns = 0 + if(!istype(user) || user.incapacitated() || !in_range(src, user)) + return + if(!isprocessing) + user.visible_message("[user] spins [src] around, and Ratvarian technology keeps it spinning FOREVER.", \ + "Automated spinny chairs. The pinnacle of Ratvarian technology.") + START_PROCESSING(SSfastprocess, src) + else + user.visible_message("[user] stops [src]'s uncontrollable spinning.", \ + "You grab [src] and stop its wild spinning.") + STOP_PROCESSING(SSfastprocess, src) \ No newline at end of file diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 999e90cd89f..ac013ebcf93 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -377,7 +377,7 @@ qdel(i) . = ..() -/obj/structure/table/glass/Crossed(atom/movable/AM) +/obj/structure/table/glass/Crossed(atom/movable/AM, oldloc) . = ..() if(!can_deconstruct) return diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index a51f58e5ec6..591157e8bd6 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -13,7 +13,7 @@ return ..() /obj/structure/target_stake/Move() - ..() + . = ..() // Move the pinned target along with the stake if(pinned_target in view(3, src)) pinned_target.loc = loc diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 726d9a88a7f..ada70921c99 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -363,7 +363,7 @@ qdel(mymist) ismist = 0 -/obj/machinery/shower/Crossed(atom/movable/O) +/obj/machinery/shower/Crossed(atom/movable/O, oldloc) ..() wash(O) if(ismob(O)) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index acacb4e9153..1124745d8b3 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -46,7 +46,7 @@ obj/structure/windoor_assembly/Destroy() /obj/structure/windoor_assembly/Move() var/turf/T = loc - ..() + . = ..() setDir(ini_dir) move_update_air(T) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e63451de8b6..16851097844 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -431,7 +431,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f /obj/structure/window/Move() var/turf/T = loc - ..() + . = ..() setDir(ini_dir) move_update_air(T) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 541240beb9f..f54e28defb1 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -23,13 +23,12 @@ /turf/simulated/proc/burn_tile() return -/turf/simulated/proc/water_act(volume, temperature, source) +/turf/simulated/water_act(volume, temperature, source) + . = ..() + if(volume >= 3) MakeSlippery() - for(var/mob/living/carbon/slime/M in src) - M.apply_water() - var/hotspot = (locate(/obj/effect/hotspot) in src) if(hotspot) var/datum/gas_mixture/lowertemp = remove_air(air.total_moles()) diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm index 43d77bd39be..5f2ad4b629c 100644 --- a/code/game/turfs/simulated/floor/asteroid.dm +++ b/code/game/turfs/simulated/floor/asteroid.dm @@ -27,6 +27,9 @@ /turf/simulated/floor/plating/asteroid/MakeDry(wet_setting) return +/turf/simulated/floor/plating/asteroid/remove_plating() + return + /turf/simulated/floor/plating/asteroid/ex_act(severity, target) switch(severity) if(3) diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm index d1ee346b302..0882bb18766 100644 --- a/code/game/turfs/simulated/floor/lava.dm +++ b/code/game/turfs/simulated/floor/lava.dm @@ -38,6 +38,9 @@ /turf/simulated/floor/plating/lava/make_plating() return +/turf/simulated/floor/plating/lava/remove_plating() + return + /turf/simulated/floor/plating/lava/proc/is_safe() var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile)) var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache) diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index ddf71b96798..5c8f2022189 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -111,18 +111,35 @@ /turf/simulated/floor/clockwork name = "clockwork floor" desc = "Tightly-pressed brass tiles. They emit minute vibration." - icon_state = "clockwork_floor" + icon_state = "plating" + baseturf = /turf/simulated/floor/clockwork + var/dropped_brass + var/uses_overlay = TRUE + var/obj/effect/clockwork/overlay/floor/realappearence -/turf/simulated/floor/clockwork/New() - ..() - new /obj/effect/temp_visual/ratvar/floor(src) - new /obj/effect/temp_visual/ratvar/beam(src) +/turf/simulated/floor/clockwork/Initialize(mapload) + . = ..() + if(uses_overlay) + new /obj/effect/temp_visual/ratvar/floor(src) + new /obj/effect/temp_visual/ratvar/beam(src) + realappearence = new /obj/effect/clockwork/overlay/floor(src) + realappearence.linked = src + +/turf/simulated/floor/clockwork/Destroy() + if(uses_overlay && realappearence) + QDEL_NULL(realappearence) + return ..() + +/turf/simulated/floor/clockwork/ReplaceWithLattice() + . = ..() + for(var/obj/structure/lattice/L in src) + L.ratvar_act() /turf/simulated/floor/clockwork/attackby(obj/item/I, mob/living/user, params) if(iscrowbar(I)) user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...") playsound(src, I.usesound, 20, 1) - if(!do_after(user, 70*I.toolspeed, target = src)) + if(!do_after(user, 70 * I.toolspeed, target = src)) return 0 user.visible_message("[user] pries up [src]!", "You pry up [src]!") playsound(src, I.usesound, 80, 1) @@ -131,7 +148,11 @@ return ..() /turf/simulated/floor/clockwork/make_plating() - new /obj/item/stack/tile/brass(src) + if(!dropped_brass) + new /obj/item/stack/tile/brass(src) + dropped_brass = TRUE + if(baseturf == type) + return return ..() /turf/simulated/floor/clockwork/narsie_act() @@ -140,3 +161,12 @@ var/previouscolor = color color = "#960000" animate(src, color = previouscolor, time = 8) + addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) + +/turf/simulated/floor/clockwork/reebe + name = "cogplate" + desc = "Warm brass plating. You can feel it gently vibrating, as if machinery is on the other side." + icon_state = "reebe" + baseturf = /turf/simulated/floor/clockwork/reebe + uses_overlay = FALSE + planetary_atmos = TRUE diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index ee53cd0ca35..2ef4602d268 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -17,6 +17,14 @@ icon_plating = icon_state update_icon() +/turf/simulated/floor/plating/damaged/New() + ..() + break_tile() + +/turf/simulated/floor/plating/burnt/New() + ..() + burn_tile() + /turf/simulated/floor/plating/update_icon() if(!..()) return @@ -56,10 +64,14 @@ to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") return TRUE - else if(istype(C, /obj/item/weldingtool)) + else if(iswelder(C)) var/obj/item/weldingtool/welder = C - if(welder.isOn() && (broken || burnt)) - if(welder.remove_fuel(0, user)) + if(welder.isOn()) + if(!welder.remove_fuel(0, user)) + to_chat(user, "You need more welding fuel to complete this task.") + return TRUE + + if(broken || burnt) to_chat(user, "You fix some dents on the broken plating.") playsound(src, welder.usesound, 80, 1) overlays -= current_overlay @@ -67,8 +79,23 @@ burnt = FALSE broken = FALSE update_icon() + else + to_chat(user, "You start removing [src].") + playsound(src, welder.usesound, 100, 1) + if(do_after(user, 50 * welder.toolspeed, target = src) && welder && welder.isOn()) + to_chat(user, "You remove [src].") + new /obj/item/stack/tile/plasteel(get_turf(src)) + remove_plating(user) + return TRUE + return TRUE +/turf/simulated/floor/plating/proc/remove_plating(mob/user) + if(baseturf == /turf/space) + ReplaceWithLattice() + else + TerraformTurf(baseturf) + /turf/simulated/floor/plating/airless icon_state = "plating" name = "airless plating" @@ -208,6 +235,9 @@ ..() icon_state = "ironsand[rand(1,15)]" +/turf/simulated/floor/plating/ironsand/remove_plating() + return + /turf/simulated/floor/plating/snow name = "snow" icon = 'icons/turf/snow.dmi' @@ -216,6 +246,9 @@ /turf/simulated/floor/plating/snow/ex_act(severity) return +/turf/simulated/floor/plating/snow/remove_plating() + return + /turf/simulated/floor/snow name = "snow" icon = 'icons/turf/snow.dmi' diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 8163bc75acc..5a8f842307e 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -22,6 +22,7 @@ heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through. + var/slicing_duration = 100 var/engraving //engraving on the wall var/engraving_quality @@ -340,7 +341,7 @@ to_chat(user, "You begin slicing through the outer plating.") playsound(src, WT.usesound, 100, 1) - if(do_after(user, 100 * WT.toolspeed, target = src) && WT && WT.isOn()) + if(do_after(user, slicing_duration * WT.toolspeed, target = src) && WT && WT.isOn()) to_chat(user, "You remove the outer plating.") dismantle_wall() else diff --git a/code/game/turfs/simulated/walls_indestructible.dm b/code/game/turfs/simulated/walls_indestructible.dm index 0357578c762..e25992a2555 100644 --- a/code/game/turfs/simulated/walls_indestructible.dm +++ b/code/game/turfs/simulated/walls_indestructible.dm @@ -69,4 +69,8 @@ desc = "A wall made out of smooth, cold stone." icon = 'icons/turf/walls/hierophant_wall.dmi' icon_state = "hierophant" - smooth = SMOOTH_TRUE \ No newline at end of file + smooth = SMOOTH_TRUE + +/turf/simulated/wall/indestructible/uranium + icon = 'icons/turf/walls/uranium_wall.dmi' + icon_state = "uranium" \ No newline at end of file diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 9b4cba19f0a..b2d6b40c123 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -50,3 +50,100 @@ desc = "A huge chunk of reinforced metal used to seperate rooms. It seems to have additional plating to protect against heat." icon = 'icons/turf/walls/coated_reinforced_wall.dmi' max_temperature = INFINITY + +//Clockwork walls +/turf/simulated/wall/clockwork + name = "clockwork wall" + desc = "A huge chunk of warm metal. The clanging of machinery emanates from within." + explosion_block = 2 + hardness = 10 + slicing_duration = 80 + sheet_type = /obj/item/stack/tile/brass + sheet_amount = 1 + girder_type = /obj/structure/clockwork/wall_gear + baseturf = /turf/simulated/floor/clockwork/reebe + var/heated + var/obj/effect/clockwork/overlay/wall/realappearance + +/turf/simulated/wall/clockwork/Initialize() + . = ..() + new /obj/effect/temp_visual/ratvar/wall(src) + new /obj/effect/temp_visual/ratvar/beam(src) + realappearance = new /obj/effect/clockwork/overlay/wall(src) + realappearance.linked = src + +/turf/simulated/wall/clockwork/Destroy() + if(realappearance) + qdel(realappearance) + realappearance = null + + return ..() + +/turf/simulated/wall/clockwork/ReplaceWithLattice() + ..() + for(var/obj/structure/lattice/L in src) + L.ratvar_act() + +/turf/simulated/wall/clockwork/narsie_act() + ..() + if(istype(src, /turf/simulated/wall/clockwork)) //if we haven't changed type + var/previouscolor = color + color = "#960000" + animate(src, color = previouscolor, time = 8) + addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) + +/turf/simulated/wall/clockwork/dismantle_wall(devastated=0, explode=0) + if(devastated) + devastate_wall() + ChangeTurf(baseturf) + else + playsound(src, 'sound/items/welder.ogg', 100, 1) + var/newgirder = break_wall() + if(newgirder) //maybe we want a gear! + transfer_fingerprints_to(newgirder) + ChangeTurf(baseturf) + + for(var/obj/O in src) //Eject contents! + if(istype(O, /obj/structure/sign/poster)) + var/obj/structure/sign/poster/P = O + P.roll_and_drop(src) + else + O.forceMove(src) + +/turf/simulated/wall/clockwork/devastate_wall() + for(var/i in 1 to 2) + new/obj/item/clockwork/alloy_shards/large(src) + for(var/i in 1 to 2) + new/obj/item/clockwork/alloy_shards/medium(src) + for(var/i in 1 to 3) + new/obj/item/clockwork/alloy_shards/small(src) + +/turf/simulated/wall/clockwork/attack_hulk(mob/living/user, does_attack_animation = 0) + ..() + if(heated) + to_chat(user, "The wall is searing hot to the touch!") + user.adjustFireLoss(5) + playsound(src, 'sound/machines/fryer/deep_fryer_emerge.ogg', 50, TRUE) + +/turf/simulated/wall/clockwork/mech_melee_attack(obj/mecha/M) + ..() + if(heated) + to_chat(M.occupant, "The wall's intense heat completely reflects your [M.name]'s attack!") + M.take_damage(20, BURN) + +/turf/simulated/wall/clockwork/proc/turn_up_the_heat() + if(!heated) + name = "superheated [name]" + visible_message("[src] sizzles with heat!") + playsound(src, 'sound/machines/fryer/deep_fryer_emerge.ogg', 50, TRUE) + heated = TRUE + hardness = -100 //Lower numbers are tougher, so this makes the wall essentially impervious to smashing + slicing_duration = 150 + animate(realappearance, color = "#FFC3C3", time = 5) + else + name = initial(name) + visible_message("[src] cools down.") + heated = FALSE + hardness = initial(hardness) + slicing_duration = initial(slicing_duration) + animate(realappearance, color = initial(realappearance.color), time = 25) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 53cf1917404..e315ad26ad0 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -509,3 +509,7 @@ /turf/AllowDrop() return TRUE + +/turf/proc/water_act(volume, temperature, source) + for(var/mob/living/carbon/slime/M in src) + M.apply_water() diff --git a/code/game/world.dm b/code/game/world.dm index b7f8b9bdc98..a74870413d3 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -369,15 +369,14 @@ var/world_topic_spam_protect_time = world.timeofday if(config && config.server_tag_line) s += "
[config.server_tag_line]" + if(SSticker && ROUND_TIME > 0) + s += "
[round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)], " + capitalize(get_security_level()) + else + s += "
STARTING" + s += "
" var/list/features = list() - if(SSticker) - if(master_mode && master_mode != "secret") - features += master_mode - else - features += "STARTING" - if(!enter_allowed) features += "closed" diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 9245f5174ce..045819c365b 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -108,7 +108,7 @@ world/IsBanned(key, address, computer_id, check_ipintel = TRUE) var/appealmessage = "" if(config.banappeals) appealmessage = " You may appeal it at [config.banappeals]." - expires = " This is a permanent ban.[appealmessage]" + expires = " This ban does not expire automatically and must be appealed.[appealmessage]" var/desc = "\nReason: You, or another user of this computer or connection ([pckey]) is banned from playing here. The ban reason is:\n[reason]\nThis ban was applied by [ackey] on [bantime].[expires]" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index c9c03303f7e..a6f186dad73 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -167,7 +167,6 @@ var/global/nologevent = 0 body += "Is an AI " else if(ishuman(M)) body += {"Make AI | - Make Mask | Make Robot | Make Alien | Make Slime | diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 224f07d4277..85d835651e3 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -169,6 +169,14 @@ message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom IP and computer id fields replaced with the IP and computer id from the located mob") DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid ) + if(BANTYPE_PERMA) + add_note(banckey, "Permanently Banned - [banreason]", null, usr.ckey, 0) + else if(BANTYPE_TEMP) + add_note(banckey, "Banned for [banduration] minutes - [banreason]", null, usr.ckey, 0) + else if(BANTYPE_JOB_PERMA) + add_note(banckey, "Banned from [banjob] - [banreason]", null, usr.ckey, 0) + else + add_note(banckey, "[banreason]", null, usr.ckey, 0) else if(href_list["editrights"]) @@ -1007,14 +1015,14 @@ return AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0, M.lastKnownIP) to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason].") - to_chat(M, "This is a permanent ban.") + to_chat(M, "This ban does not expire automatically and must be appealed.") if(config.banappeals) to_chat(M, "To try to resolve this matter head to [config.banappeals]") else to_chat(M, "No ban appeals URL has been set.") - ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.") - log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") - message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") + ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This ban does not expire automatically and must be appealed.") + log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.") + message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.") feedback_inc("ban_perma",1) DB_ban_record(BANTYPE_PERMA, M, -1, reason) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 5268b3a9bc7..e2da701cf4d 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -15,13 +15,15 @@ */ -/client/proc/SDQL2_query(query_text as message) +/client/proc/SDQL2_query() set category = "Debug" if(!check_rights(R_PROCCALL)) //Shouldn't happen... but just to be safe. message_admins("ERROR: Non-admin [key_name_admin(usr)] attempted to execute a SDQL query!") log_admin("Non-admin [key_name(usr)] attempted to execute a SDQL query!") + var/query_text = input("SDQL2 query") as message + if(!query_text || length(query_text) < 1) return diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index a1f56c52c78..8c5d76e62e1 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -185,3 +185,4 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," else send2irc(source, "[msg] - All admins AFK ([admin_number_afk]/[admin_number_total]) or skipped ([admin_number_ignored]/[admin_number_total])") return admin_number_present + \ No newline at end of file diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index caa051f8748..83531c9b0b9 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -279,6 +279,9 @@ /datum/pm_tracker/proc/add_message(client/title, client/sender, message, mob/user) if(!pms[title.key]) pms[title.key] = new /datum/pm_convo(title) + else if(!pms[title.key].client) + // If they DCed earlier, we need to add the client reference back + pms[title.key].client = title pms[title.key].add(sender, message) if(!open) @@ -308,16 +311,25 @@ dat += "[label]" var/datum/pm_convo/convo = pms[current_title] + var/datum/browser/popup = new(user, window_id, "Messages", 1000, 600, src) if(convo) + popup.add_head_content(@{""}) convo.read = TRUE dat += "

[check_rights(R_ADMIN, FALSE, user) ? fancy_title(current_title) : current_title]

" dat += "

" - dat += "

" + dat += "
" + dat += "
" for(var/message in convo.messages) dat += "" dat += "
[message]
" + dat += "
" if(convo.typing) dat += "[current_title] is typing" dat += "
" @@ -327,17 +339,23 @@ if(check_rights(R_ADMIN, FALSE, user)) dat += "Ping" - var/datum/browser/popup = new(user, window_id, "Messages", 1000, 600, src) popup.set_content(dat) popup.open() open = TRUE /datum/pm_tracker/proc/fancy_title(title) - var/client/C = pms[title].client + var/client/C = pms[title].client || update_client(title) if(!C) return "[title] (Disconnected)" return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)]) (CA)" +/datum/pm_tracker/proc/update_client(title) + var/client/C = GLOB.directory[ckey(title)] + if(C) + pms[title].client = C + return C + return null + /datum/pm_tracker/Topic(href, href_list) if(href_list["archive"]) pms[href_list["archive"]].archived = !pms[href_list["archive"]].archived diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index e3fe5af3263..6f6b3484924 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -17,6 +17,10 @@ feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/get_admin_say() + var/msg = input(src, null, "asay \"text\"") as text|null + cmd_admin_say(msg) + /client/proc/cmd_mentor_say(msg as text) set category = "Admin" set name = "Msay" diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 3874e26e9de..e1bbc885c75 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -43,3 +43,7 @@ say_dead_direct("[prefix] says, \"[msg]\"") feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/get_dead_say() + var/msg = input(src, null, "dsay \"text\"") as text + dsay(msg) \ No newline at end of file diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 2c5a2d28883..058dd4cd0f2 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -77,9 +77,9 @@ if(bombassembly) bombassembly.HasProximity(AM) -/obj/item/onetankbomb/Crossed(atom/movable/AM) //for mousetraps +/obj/item/onetankbomb/Crossed(atom/movable/AM, oldloc) //for mousetraps if(bombassembly) - bombassembly.Crossed(AM) + bombassembly.Crossed(AM, oldloc) /obj/item/onetankbomb/on_found(mob/finder) //for mousetraps if(bombassembly) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 0d5a866e6c5..d19682d1eb9 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -85,11 +85,11 @@ a_right.HasProximity(AM) -/obj/item/assembly_holder/Crossed(atom/movable/AM) +/obj/item/assembly_holder/Crossed(atom/movable/AM, oldloc) if(a_left) - a_left.Crossed(AM) + a_left.Crossed(AM, oldloc) if(a_right) - a_right.Crossed(AM) + a_right.Crossed(AM, oldloc) /obj/item/assembly_holder/on_found(mob/finder) if(a_left) @@ -116,7 +116,7 @@ a_right.holder_movement() /obj/item/assembly_holder/Move() - ..() + . = ..() process_movement() return diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index d6da1fb4d0e..37f5916d535 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -106,7 +106,7 @@ /obj/item/assembly/infra/Move() var/t = dir - ..() + . = ..() dir = t qdel(first) @@ -269,7 +269,7 @@ /obj/effect/beam/i_beam/Bumped() hit() -/obj/effect/beam/i_beam/Crossed(atom/movable/AM) +/obj/effect/beam/i_beam/Crossed(atom/movable/AM, oldloc) if(!isobj(AM) && !isliving(AM)) return if(istype(AM, /obj/effect)) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 09e049b3921..258212f0ab6 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -93,7 +93,7 @@ return ..() -/obj/item/assembly/mousetrap/Crossed(atom/movable/AM) +/obj/item/assembly/mousetrap/Crossed(atom/movable/AM, oldloc) if(armed) if(ishuman(AM)) var/mob/living/carbon/H = AM diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 9a74edfdc62..92a6a2b1d86 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -432,6 +432,8 @@ l_pocket = /obj/item/reagent_containers/food/pill/patch/styptic r_pocket = /obj/item/flashlight/seclite +/obj/effect/mob_spawn/human/miner/explorer + outfit = /datum/outfit/job/mining/equipped /obj/effect/mob_spawn/human/bartender name = "Space Bartender" diff --git a/code/modules/awaymissions/mission_code/academy.dm b/code/modules/awaymissions/mission_code/academy.dm index 2c764443e72..d15b3e3075d 100644 --- a/code/modules/awaymissions/mission_code/academy.dm +++ b/code/modules/awaymissions/mission_code/academy.dm @@ -36,9 +36,226 @@ if(prob(1)) mezzer() - /obj/item/clothing/glasses/meson/truesight name = "The Lens of Truesight" desc = "I can see forever!" icon_state = "monocle" - item_state = "headset" \ No newline at end of file + item_state = "headset" + +// Die of Fate +/obj/item/dice/d20/fate + name = "\improper Die of Fate" + desc = "A die with twenty sides. You can feel unearthly energies radiating from it. Using this might be VERY risky." + icon_state = "d20" + var/reusable = TRUE + var/used = FALSE + +/obj/item/dice/d20/fate/stealth + name = "d20" + desc = "A die with twenty sides. The preferred die to throw at the GM." + +/obj/item/dice/d20/fate/one_use + reusable = FALSE + +/obj/item/dice/d20/fate/one_use/stealth + name = "d20" + desc = "A die with twenty sides. The preferred die to throw at the GM." + +/obj/item/dice/d20/fate/cursed + name = "cursed Die of Fate" + desc = "A die with twenty sides. You feel that rolling this is a REALLY bad idea." + color = "#00BB00" + + rigged = DICE_TOTALLY_RIGGED + rigged_value = 1 + +/obj/item/dice/d20/fate/diceroll(mob/user) + . = ..() + if(!used) + if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards)) + to_chat(user, "You feel the magic of the dice is restricted to ordinary humans!") + return + + if(!reusable) + used = TRUE + + var/turf/T = get_turf(src) + T.visible_message("[src] flares briefly.") + + addtimer(CALLBACK(src, .proc/effect, user, .), 1 SECONDS) + +/obj/item/dice/d20/fate/equipped(mob/user, slot) + if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards)) + to_chat(user, "You feel the magic of the dice is restricted to ordinary humans! You should leave it alone.") + user.unEquip(src) + +/obj/item/dice/d20/fate/proc/create_smoke(amount) + var/datum/effect_system/smoke_spread/smoke = new + smoke.set_up(amount, 0, drop_location()) + smoke.start() + +/obj/item/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user, roll) + var/turf/T = get_turf(src) + switch(roll) + if(1) + //Dust + T.visible_message("[user] turns to dust!") + user.dust() + if(2) + //Death + T.visible_message("[user] suddenly dies!") + user.death() + if(3) + //Swarm of creatures + T.visible_message("A swarm of creatures surround [user]!") + for(var/direction in alldirs) + new /mob/living/simple_animal/hostile/netherworld(get_step(get_turf(user),direction)) + if(4) + //Destroy Equipment + T.visible_message("Everything [user] is holding and wearing disappears!") + for(var/obj/item/I in user) + if(istype(I, /obj/item/implant) || istype(I, /obj/item/organ)) + continue + qdel(I) + if(5) + //Monkeying + T.visible_message("[user] transforms into a monkey!") + user.monkeyize() + if(6) + //Cut speed + T.visible_message("[user] starts moving slower!") + var/datum/species/S = user.dna.species + S.slowdown += 1 + if(7) + //Throw + T.visible_message("Unseen forces throw [user]!") + user.Stun(6) + user.adjustBruteLoss(50) + var/throw_dir = cardinal + var/atom/throw_target = get_edge_target_turf(user, throw_dir) + user.throw_at(throw_target, 200, 4) + if(8) + //Fueltank Explosion + T.visible_message("An explosion bursts into existence around [user]!") + explosion(get_turf(user),-1,0,2, flame_range = 2) + if(9) + //Cold + var/datum/disease/D = new /datum/disease/cold() + T.visible_message("[user] looks a little under the weather!") + user.ForceContractDisease(D) + if(10) + //Nothing + T.visible_message("Nothing seems to happen.") + if(11) + //Cookie + T.visible_message("A cookie appears out of thin air!") + var/obj/item/reagent_containers/food/snacks/cookie/C = new(drop_location()) + create_smoke(2) + C.name = "Cookie of Fate" + if(12) + //Healing + T.visible_message("[user] looks very healthy!") + user.revive() + if(13) + //Mad Dosh + T.visible_message("Mad dosh shoots out of [src]!") + var/turf/Start = get_turf(src) + for(var/direction in alldirs) + var/turf/dirturf = get_step(Start,direction) + if(rand(0,1)) + new /obj/item/stack/spacecash/c1000(dirturf) + else + var/obj/item/storage/bag/money/M = new(dirturf) + for(var/i in 1 to rand(5,50)) + new /obj/item/coin/gold(M) + if(14) + //Free Gun + T.visible_message("An impressive gun appears!") + create_smoke(2) + new /obj/item/gun/projectile/revolver/mateba(drop_location()) + if(15) + //Random One-use spellbook + T.visible_message("A magical looking book drops to the floor!") + create_smoke(2) + new /obj/item/spellbook/oneuse/random(drop_location()) + if(16) + //Servant & Servant Summon + T.visible_message("A Dice Servant appears in a cloud of smoke!") + var/mob/living/carbon/human/H = new(drop_location()) + create_smoke(2) + + H.equipOutfit(/datum/outfit/butler) + var/datum/mind/servant_mind = new /datum/mind() + var/datum/objective/O = new + O.owner = servant_mind + O.target = user.mind + O.explanation_text = "Serve [user.real_name]." + servant_mind.objectives += O + servant_mind.transfer_to(H) + + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the servant of [user.real_name]?", ROLE_WIZARD, poll_time = 50) + if(LAZYLEN(candidates)) + var/mob/dead/observer/C = pick(candidates) + message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant") + H.key = C.key + to_chat(H, "You are a servant of [user.real_name]. You must do everything in your power to follow their orders.") + + var/obj/effect/proc_holder/spell/targeted/summonmob/S = new + S.target_mob = H + user.mind.AddSpell(S) + + if(17) + //Tator Kit + T.visible_message("A suspicious box appears!") + new /obj/item/storage/box/syndicate(drop_location()) + create_smoke(2) + if(18) + //Captain ID + T.visible_message("A golden identification card appears!") + new /obj/item/card/id/captains_spare(drop_location()) + create_smoke(2) + if(19) + //Instrinct Resistance + T.visible_message("[user] looks very robust!") + var/datum/species/S = user.dna.species + S.brute_mod *= 0.5 + S.burn_mod *= 0.5 + + if(20) + //Free wizard! + T.visible_message("Magic flows out of [src] and into [user]!") + user.mind.make_Wizard() + +// Butler outfit +/datum/outfit/butler + name = "Butler" + uniform = /obj/item/clothing/under/suit_jacket/really_black + shoes = /obj/item/clothing/shoes/laceup + head = /obj/item/clothing/head/bowlerhat + glasses = /obj/item/clothing/glasses/monocle + gloves = /obj/item/clothing/gloves/color/white + +/obj/effect/proc_holder/spell/targeted/summonmob + name = "Summon Servant" + desc = "This spell can be used to call your servant, whenever you need it." + charge_max = 100 + clothes_req = 0 + invocation = "JE VES" + invocation_type = "whisper" + range = -1 + level_max = 0 //cannot be improved + cooldown_min = 100 + include_user = 1 + + var/mob/living/target_mob + + action_icon_state = "summons" + +/obj/effect/proc_holder/spell/targeted/summonmob/cast(list/targets, mob/user = usr) + if(!target_mob) + return + var/turf/Start = get_turf(user) + for(var/direction in alldirs) + var/turf/T = get_step(Start,direction) + if(!T.density) + target_mob.Move(T) diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index ed888d65465..6d647c8ff1b 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -19,22 +19,22 @@ * Areas */ //Gateroom gets its own APC specifically for the gate - /area/awaymission/gateroom +/area/awaymission/gateroom //Library, medbay, storage room - /area/awaymission/southblock +/area/awaymission/southblock //Arrivals, security, hydroponics, shuttles (since they dont move, they dont need specific areas) - /area/awaymission/arrivalblock +/area/awaymission/arrivalblock //Crew quarters, cafeteria, chapel - /area/awaymission/midblock +/area/awaymission/midblock //engineering, bridge (not really north but it doesnt really need its own APC) - /area/awaymission/northblock +/area/awaymission/northblock //That massive research room - /area/awaymission/research +/area/awaymission/research //Syndicate shuttle /area/awaymission/syndishuttle diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index ef576760ada..ca79a1ea2a6 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -140,7 +140,7 @@ /obj/effect/meatgrinder/New() icon_state = "blobpod" -/obj/effect/meatgrinder/Crossed(AM as mob|obj) +/obj/effect/meatgrinder/Crossed(AM as mob|obj, oldloc) Bumped(AM) /obj/effect/meatgrinder/Bumped(mob/M as mob|obj) diff --git a/code/modules/awaymissions/trigger.dm b/code/modules/awaymissions/trigger.dm deleted file mode 100644 index 60a43702cb1..00000000000 --- a/code/modules/awaymissions/trigger.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/effect/step_trigger/message - var/message //the message to give to the mob - var/once = 1 - -/obj/effect/step_trigger/message/Trigger(mob/M as mob) - if(M.client) - to_chat(M, "[message]") - if(once) - qdel(src) - -/obj/effect/step_trigger/teleport_fancy - var/locationx - var/locationy - var/uses = 1 //0 for infinite uses - var/entersparks = 0 - var/exitsparks = 0 - var/entersmoke = 0 - var/exitsmoke = 0 - -/obj/effect/step_trigger/teleport_fancy/Trigger(mob/M as mob) - var/dest = locate(locationx, locationy, z) - M.Move(dest) - - if(entersparks) - do_sparks(4, 1, src) - if(exitsparks) - do_sparks(4, 1, dest) - - if(entersmoke) - var/datum/effect_system/smoke_spread/s = new - s.set_up(4, 1, src, 0) - s.start() - if(exitsmoke) - var/datum/effect_system/smoke_spread/s = new - s.set_up(4, 1, dest, 0) - s.start() - - uses-- - if(uses == 0) - qdel(src) \ No newline at end of file diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm index de60531e590..102554f2e6e 100644 --- a/code/modules/awaymissions/zvis.dm +++ b/code/modules/awaymissions/zvis.dm @@ -65,7 +65,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/effect/portal_sensor/Crossed(A) +/obj/effect/portal_sensor/Crossed(A, oldloc) trigger() /obj/effect/portal_sensor/Uncrossed(A) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 995ee519474..fd89434331e 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -1,4 +1,8 @@ /client + ////////////////////// + //BLACK MAGIC THINGS// + ////////////////////// + parent_type = /datum //////////////// //ADMIN THINGS// //////////////// @@ -24,7 +28,7 @@ var/adminhelped = 0 - var/gc_destroyed //Time when this object was destroyed. + // var/gc_destroyed //Time when this object was destroyed. [Inherits from datum] #ifdef TESTING var/running_find_references @@ -89,5 +93,5 @@ // If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction var/advanced_admin_interaction = FALSE - // Has the client been varedited by an admin? - var/var_edited = FALSE + // Has the client been varedited by an admin? [Inherits from datum now] + // var/var_edited = FALSE diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 922502698fa..4e59dc2c1cf 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -297,14 +297,14 @@ return null if(byond_build < config.minimum_client_build) alert(src, "You are using a byond build which is not supported by this server. Please use a build version of atleast [config.minimum_client_build].", "Incorrect build", "OK") - del(src) + qdel(src) return if(byond_version < SUGGESTED_CLIENT_VERSION) // Update is suggested, but not required. to_chat(src,"Your BYOND client (v: [byond_version]) is out of date. This can cause glitches. We highly suggest you download the latest client from http://www.byond.com/ before playing. ") if(IsGuestKey(key)) alert(src,"This server doesn't allow guest accounts to play. Please go to http://www.byond.com/ and register for a key.","Guest","OK") - del(src) + qdel(src) return // Change the way they should download resources. @@ -317,7 +317,6 @@ GLOB.clients += src GLOB.directory[ckey] = src - //Admin Authorisation // Automatically makes localhost connection an admin if(!config.disable_localhost_admin) @@ -365,11 +364,14 @@ . = ..() //calls mob.Login() + if(ckey in clientmessages) for(var/message in clientmessages[ckey]) to_chat(src, message) clientmessages.Remove(ckey) + if(SSinput.initialized) + set_macros() donator_check() check_ip_intel() @@ -404,8 +406,7 @@ if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. to_chat(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.") - - + //This is down here because of the browse() calls in tooltip/New() if(!tooltips) tooltips = new /datum/tooltip(src) @@ -664,7 +665,7 @@ sleep(10) // Since browse is non-instant, and kinda async to_chat(src, "
you're a huge nerd. wakka wakka doodle doop nobody's ever gonna see this, the chat system shouldn't be online by this point
") - del(src) + qdel(src) return TRUE else if (!topic || !topic["token"] || !tokens[ckey] || topic["token"] != tokens[ckey]) @@ -675,7 +676,7 @@ tokens[ckey] = cid_check_reconnect() sleep(10) //browse is queued, we don't want them to disconnect before getting the browse() command. - del(src) + qdel(src) return TRUE // We DO have their cached CID handy - compare it, now if(oldcid != computer_id) @@ -693,7 +694,7 @@ log_adminwarn("Failed Login: [key] [computer_id] [address] - CID randomizer confirmed (oldcid: [oldcid])") - del(src) + qdel(src) return TRUE else // don't shoot, I'm innocent @@ -795,18 +796,15 @@ /* Mainwindow */ winset(src, "mainwindow.saybutton", "background-color=#40628a;text-color=#FFFFFF") winset(src, "mainwindow.mebutton", "background-color=#40628a;text-color=#FFFFFF") - winset(src, "mainwindow.hotkey_toggle", "background-color=#40628a;text-color=#FFFFFF") ///// UI ELEMENTS ///// /* Mainwindow */ winset(src, "mainwindow", "background-color=#272727") winset(src, "mainwindow.mainvsplit", "background-color=#272727") winset(src, "mainwindow.tooltip", "background-color=#272727") /* Outputwindow */ - winset(src, "outputwindow.outputwindow", "background-color=#272727") winset(src, "outputwindow.browseroutput", "background-color=#272727") /* Rpane */ winset(src, "rpane", "background-color=#272727") - winset(src, "rpane.rpane", "background-color=#272727") winset(src, "rpane.rpanewindow", "background-color=#272727") /* Browserwindow */ winset(src, "browserwindow", "background-color=#272727") @@ -830,18 +828,15 @@ /* Mainwindow */ winset(src, "mainwindow.saybutton", "background-color=none;text-color=#000000") winset(src, "mainwindow.mebutton", "background-color=none;text-color=#000000") - winset(src, "mainwindow.hotkey_toggle", "background-color=none;text-color=#000000") ///// UI ELEMENTS ///// /* Mainwindow */ winset(src, "mainwindow", "background-color=none") winset(src, "mainwindow.mainvsplit", "background-color=none") winset(src, "mainwindow.tooltip", "background-color=none") /* Outputwindow */ - winset(src, "outputwindow.outputwindow", "background-color=none") winset(src, "outputwindow.browseroutput", "background-color=none") /* Rpane */ winset(src, "rpane", "background-color=none") - winset(src, "rpane.rpane", "background-color=none") winset(src, "rpane.rpanewindow", "background-color=none") /* Browserwindow */ winset(src, "browserwindow", "background-color=none") diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 75e0f549a1d..3c8b293ea28 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -81,7 +81,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/lastchangelog = "" //Saved changlog filesize to detect if there was a change var/exp var/ooccolor = "#b82e00" - var/be_special = list() //Special role selection + var/list/be_special = list() //Special role selection var/UI_style = "Midnight" var/nanoui_fancy = TRUE var/toggles = TOGGLES_DEFAULT @@ -93,6 +93,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/clientfps = 0 var/atklog = ATKLOG_ALL var/fuid // forum userid + var/afk_watch = FALSE // If the player wants to be kept track of by the AFK system //ghostly preferences var/ghost_anonsay = 0 @@ -439,6 +440,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "

General Settings

" if(user.client.holder) dat += "Adminhelp sound: [(sound & SOUND_ADMINHELP)?"On":"Off"]
" + dat += "AFK Cryoing: [(afk_watch) ? "Yes" : "No"]
" dat += "Ambient Occlusion: [toggles & AMBIENT_OCCLUSION ? "Enabled" : "Disabled"]
" dat += "Attack Animations: [(show_ghostitem_attack) ? "Yes" : "No"]
" if(unlock_content) @@ -455,6 +457,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Ghost Ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" dat += "Ghost Radio: [(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" dat += "Ghost Sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" + dat += "Ghost PDA: [(toggles & CHAT_GHOSTPDA) ? "All PDA Messages" : "No PDA Messages"]
" if(check_rights(R_ADMIN,0)) dat += "OOC Color:     Change
" if(config.allow_Metadata) @@ -1976,6 +1979,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("winflash") windowflashing = !windowflashing + if("afk_watch") + afk_watch = !afk_watch + if("UIcolor") var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null if(!UI_style_color_new) return @@ -2029,6 +2035,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("ghost_radio") toggles ^= CHAT_GHOSTRADIO + + if("ghost_pda") + toggles ^= CHAT_GHOSTPDA if("ghost_anonsay") ghost_anonsay = !ghost_anonsay @@ -2280,3 +2289,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts /datum/preferences/proc/close_load_dialog(mob/user) user << browse(null, "window=saves") + +//Check if the user has ANY job selected. +/datum/preferences/proc/check_any_job() + return(job_support_high || job_support_med || job_support_low || job_medsci_high || job_medsci_med || job_medsci_low || job_engsec_high || job_engsec_med || job_engsec_low || job_karma_high || job_karma_med || job_karma_low) diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index 90a4bed6f14..cdbfe2afb2f 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -19,7 +19,8 @@ exp, clientfps, atklog, - fuid + fuid, + afk_watch FROM [format_table_name("player")] WHERE ckey='[C.ckey]'"} ) @@ -52,6 +53,7 @@ clientfps = text2num(query.item[17]) atklog = text2num(query.item[18]) fuid = text2num(query.item[19]) + afk_watch = text2num(query.item[20]) //Sanitize ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) @@ -72,6 +74,7 @@ clientfps = sanitize_integer(clientfps, 0, 1000, initial(clientfps)) atklog = sanitize_integer(atklog, 0, 100, initial(atklog)) fuid = sanitize_integer(fuid, 0, 10000000, initial(fuid)) + afk_watch = sanitize_integer(afk_watch, 0, 1, initial(afk_watch)) return 1 /datum/preferences/proc/save_preferences(client/C) @@ -90,7 +93,7 @@ UI_style_alpha='[UI_style_alpha]', be_role='[sanitizeSQL(list2params(be_special))]', default_slot='[default_slot]', - toggles='[num2text(toggles, 7)]', + toggles='[num2text(toggles, Ceiling(log(10, (TOGGLES_TOTAL))))]', atklog='[atklog]', sound='[sound]', randomslot='[randomslot]', @@ -101,7 +104,8 @@ windowflashing='[windowflashing]', ghost_anonsay='[ghost_anonsay]', clientfps='[clientfps]', - atklog='[atklog]' + atklog='[atklog]', + afk_watch='[afk_watch]' WHERE ckey='[C.ckey]'"} ) diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm index c4d7599d2de..e164a2ab843 100644 --- a/code/modules/client/preference/preferences_toggles.dm +++ b/code/modules/client/preference/preferences_toggles.dm @@ -241,4 +241,36 @@ to_chat(usr, "You have enabled text popup limiting.") else to_chat(usr, "You have disabled text popup limiting.") + return +/client/verb/numpad_target() + set name = "Toggle Numpad targetting" + set category = "Preferences" + set desc = "This button will allow you to enable or disable Numpad Targetting" + prefs.toggles ^= NUMPAD_TARGET + prefs.save_preferences(src) + if (prefs.toggles & NUMPAD_TARGET) + to_chat(usr, "You have enabled Numpad Targetting.") + else + to_chat(usr, "You have disabled Numpad Targetting.") + return + +/client/verb/azerty_toggle() + set name = "Toggle QWERTY/AZERTY" + set category = "Preferences" + set desc = "This button will switch you between QWERTY and AZERTY control sets" + prefs.toggles ^= AZERTY + prefs.save_preferences(src) + if (prefs.toggles & AZERTY) + to_chat(usr, "You are now in AZERTY mode.") + else + to_chat(usr, "You are now in QWERTY mode.") + return +/client/verb/toggle_ghost_pda() + set name = "Show/Hide GhostPDA" + set category = "Preferences" + set desc = ".Toggle seeing PDA messages as an observer." + prefs.toggles ^= CHAT_GHOSTPDA + to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTPDA) ? "see all PDA messages" : "no longer see PDA messages"].") + prefs.save_preferences(src) + feedback_add_details("admin_verb","TGP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 227374bd420..8e5e658e31a 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -64,7 +64,6 @@ item_state = "lgloves" flags = NODROP - /obj/item/clothing/gloves/color/yellow/stun name = "stun gloves" desc = "Horrendous and awful. It smells like cancer. The fact it has wires attached to it is incidental." @@ -72,6 +71,9 @@ var/stun_strength = 5 var/stun_cost = 2000 +/obj/item/clothing/gloves/color/yellow/stun/get_cell() + return cell + /obj/item/clothing/gloves/color/yellow/stun/New() ..() update_icon() diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 85840d5db42..b11dfd45d68 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -110,12 +110,23 @@ /obj/item/clothing/mask/muzzle/safety name = "safety muzzle" desc = "A muzzle designed to prevent biting." - resist_time = 600 + icon_state = "muzzle_secure" + item_state = "muzzle_secure" + resist_time = 0 mute = MUZZLE_MUTE_NONE security_lock = TRUE locked = FALSE materials = list(MAT_METAL=500, MAT_GLASS=50) + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi', + "Drask" = 'icons/mob/species/drask/mask.dmi' + ) + /obj/item/clothing/mask/muzzle/safety/shock name = "shock muzzle" desc = "A muzzle designed to prevent biting. This one is fitted with a behavior correction system." diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 913e65af734..b463a513764 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -97,6 +97,9 @@ to_chat(usr, "The maintenance panel is [open ? "open" : "closed"].") to_chat(usr, "Hardsuit systems are [offline ? "offline" : "online"].") +/obj/item/rig/get_cell() + return cell + /obj/item/rig/New() ..() diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index adcb1639c12..91527f2dd19 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -857,3 +857,36 @@ icon_state = "burial" item_state = "burial" item_color = "burial" + +/obj/item/clothing/under/redhawaiianshirt + name = "red hawaiian shirt" + desc = "a floral shirt worn to most vacation destinations." + icon_state = "hawaiianred" + item_state = "hawaiianred" + item_color = "hawaiianred" + flags_size = ONESIZEFITSALL + +/obj/item/clothing/under/pinkhawaiianshirt + name = "pink hawaiian shirt" + desc = "a pink floral shirt the material feels cool and comfy." + icon_state = "hawaiianpink" + item_state = "hawaiianpink" + item_color = "hawaiianpink" + flags_size = ONESIZEFITSALL + +/obj/item/clothing/under/orangehawaiianshirt + name = "orange hawaiian shirt" + desc = "a orange floral shirt for a relaxing day in space." + icon_state = "hawaiianorange" + item_state = "hawaiianorange" + item_color = "hawaiianorange" + flags_size = ONESIZEFITSALL + +/obj/item/clothing/under/bluehawaiianshirt + name = "blue hawaiian shirt" + desc = "a blue floral shirt it has a oddly colored pink flower on it." + icon_state = "hawaiianblue" + item_state = "hawaiianblue" + item_color = "hawaiianblue" + flags_size = ONESIZEFITSALL + diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index f4f952d4db5..1520e19dcfc 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -463,6 +463,14 @@ /obj/item/stack/sheet/animalhide/ashdrake = 5) category = CAT_PRIMAL +/datum/crafting_recipe/tribal_splint + name = "Tribal Splint" + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/sinew = 1) + result = /obj/item/stack/medical/splint/tribal + category = CAT_PRIMAL + /datum/crafting_recipe/guillotine name = "Guillotine" result = /obj/structure/guillotine diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 28ca16b9a79..54394411e73 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -7,21 +7,27 @@ /datum/event/blob/start() processing = FALSE //so it won't fire again in next tick + var/turf/T = pick(blobstart) if(!T) return kill() + var/list/candidates = pollCandidates("Do you want to play as a blob infested mouse?", ROLE_BLOB, 1) if(!candidates.len) return kill() + var/list/vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in GLOB.all_vent_pumps) if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) if(temp_vent.parent.other_atmosmch.len > 50) vents += temp_vent + var/obj/vent = pick(vents) var/mob/living/simple_animal/mouse/blobinfected/B = new(vent.loc) var/mob/M = pick(candidates) B.key = M.key + SSticker.mode.update_blob_icons_added(B.mind) + to_chat(B, "You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.") notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B) processing = TRUE // Let it naturally end, if it runs successfully \ No newline at end of file diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index e42030b6622..96fd9c11c1e 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -1,7 +1,7 @@ /datum/event/disease_outbreak announceWhen = 15 - var/virus_type + var/datum/disease/advance/virus_type /datum/event/disease_outbreak/setup() announceWhen = rand(15, 30) @@ -10,9 +10,13 @@ event_announcement.Announce("Confirmed outbreak of level 7 major viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') /datum/event/disease_outbreak/start() - if(!virus_type) + if(prob(25)) virus_type = pick(/datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis, /datum/disease/beesease, /datum/disease/anxiety, /datum/disease/fake_gbs, /datum/disease/fluspanish, /datum/disease/pierrot_throat, /datum/disease/lycan) - + else + virus_type = new /datum/disease/advance + virus_type.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns,GLOB.verbs)) // random silly name + virus_type.GenerateSymptoms(1,9,6) + virus_type.AssignProperties(list("resistance" = rand(0,11), "stealth" = rand(0,2), "stage_rate" = rand(0,5), "transmittable" = rand(0,5), "severity" = rand(0,10))) for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list)) if(issmall(H)) //don't infect monkies; that's a waste continue @@ -32,8 +36,8 @@ if(H.stat == DEAD || foundAlready) continue - var/datum/disease/D - D = new virus_type() + var/datum/disease/advance/D + D = virus_type D.carrier = TRUE H.AddDisease(D) break diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 419bebfe2c1..52e8918a16c 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -1,6 +1,8 @@ /datum/event/sentience /datum/event/sentience/start() + processing = FALSE //so it won't fire again in next tick + var/ghostmsg = "Do you want to awaken as a sentient being?" var/list/candidates = pollCandidates(ghostmsg, ROLE_SENTIENT, 1) var/list/potential = list() @@ -41,6 +43,7 @@ SA.del_on_death = FALSE greet_sentient(SA) print_command_report(sentience_report, "[command_name()] Update") + processing = TRUE // Let it naturally end, if it runs successfully /datum/event/sentience/proc/greet_sentient(var/mob/living/carbon/human/M) to_chat(M, "Hello world!") diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index ced084f05a3..9199d8ca3bd 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -514,7 +514,7 @@ /obj/structure/spacevine/obj_destruction() wither() -/obj/structure/spacevine/Crossed(mob/crosser) +/obj/structure/spacevine/Crossed(mob/crosser, oldloc) if(isliving(crosser)) for(var/datum/spacevine_mutation/SM in mutations) SM.on_cross(src, crosser) diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index c92ec910cdc..811eed6b9de 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -41,14 +41,14 @@ icon_state = "anom" failchance = 0 +/obj/effect/portal/wormhole/can_teleport(atom/movable/M) + . = ..() + + if(istype(M, /obj/singularity)) + . = FALSE + /obj/effect/portal/wormhole/teleport(atom/movable/M) - if(!istype(M)) - return FALSE - - if(!M.simulated || iseffect(M)) - return FALSE - - if(M.anchored && ismecha(M)) + if(!can_teleport(M)) return FALSE var/turf/target diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 6be1d3bcf70..af366683570 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -589,7 +589,7 @@ Gunshots/explosions/opening doors/less rare audio (done) health -= P.force return -/obj/effect/fake_attacker/Crossed(mob/M, somenumber) +/obj/effect/fake_attacker/Crossed(mob/M, oldloc) if(M == my_target) step_away(src,my_target,2) if(prob(30)) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 8a88cac3461..cd50dcedb71 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -256,6 +256,7 @@ desc = "Full of vitamins and deliciousness!" icon_state = "orangejuice" item_state = "carton" + throwforce = 0 isGlass = 0 list_reagents = list("orangejuice" = 100) @@ -264,6 +265,7 @@ desc = "It's cream. Made from milk. What else did you think you'd find in there?" icon_state = "cream" item_state = "carton" + throwforce = 0 isGlass = 0 list_reagents = list("cream" = 100) @@ -272,6 +274,7 @@ desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness." icon_state = "tomatojuice" item_state = "carton" + throwforce = 0 isGlass = 0 list_reagents = list("tomatojuice" = 100) @@ -280,6 +283,7 @@ desc = "Sweet-sour goodness." icon_state = "limejuice" item_state = "carton" + throwforce = 0 isGlass = 0 list_reagents = list("limejuice" = 100) @@ -288,6 +292,7 @@ desc = "Soothing milk." icon_state = "milk" item_state = "carton" + throwforce = 0 isGlass = 0 list_reagents = list("milk" = 100) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 48b4453f6d4..3cd95f37923 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -164,7 +164,7 @@ // Virology Medical Smartfridge // ---------------------------- /obj/machinery/smartfridge/secure/chemistry/virology - name = "smart virus storage" + name = "Smart Virus Storage" desc = "A refrigerated storage unit for volatile sample storage." req_access_txt = "39" spawn_meds = list(/obj/item/reagent_containers/syringe/antiviral = 4, @@ -386,7 +386,8 @@ return data /obj/machinery/smartfridge/Topic(href, href_list) - if(..()) return 0 + if(..()) + return FALSE var/mob/user = usr var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main") @@ -396,7 +397,7 @@ if(href_list["close"]) user.unset_machine() ui.close() - return 0 + return FALSE if(href_list["vend"]) var/index = text2num(href_list["vend"]) @@ -409,17 +410,26 @@ item_quants[K] = max(count - amount, 0) var/i = amount - for(var/obj/O in contents) - if(O.name == K) - O.forceMove(loc) - adjust_item_drop_location(O) - update_icon() - i-- - if(i <= 0) - return 1 - - return 1 - return 0 + if(i == 1 && Adjacent(user) && !issilicon(user)) + for(var/obj/O in contents) + if(O.name == K) + if(!user.put_in_hands(O)) + O.forceMove(loc) + adjust_item_drop_location(O) + update_icon() + break + return TRUE + else + for(var/obj/O in contents) + if(O.name == K) + O.forceMove(loc) + adjust_item_drop_location(O) + update_icon() + i-- + if(i <= 0) + return TRUE + return TRUE + return FALSE /obj/machinery/smartfridge/proc/throw_item() var/obj/throw_item = null diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index cc6c6115097..52f188a9d1d 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -319,6 +319,8 @@ else if(href_list["create"]) var/amount = (text2num(href_list["amount"])) + //Can't be outside these (if you change this keep a sane limit) + amount = Clamp(amount, 1, 10) var/datum/design/D = locate(href_list["create"]) create_product(D, amount) updateUsrDialog() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 7b84956a804..361c305bb8d 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -151,7 +151,7 @@ T.on_consume(src, usr) ..() -/obj/item/reagent_containers/food/snacks/grown/Crossed(atom/movable/AM) +/obj/item/reagent_containers/food/snacks/grown/Crossed(atom/movable/AM, oldloc) if(seed) for(var/datum/plant_gene/trait/T in seed.genes) T.on_cross(src, AM) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 461781503e2..33ef72db471 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -160,7 +160,7 @@ ..() StartBurning() -/obj/structure/bonfire/Crossed(atom/movable/AM) +/obj/structure/bonfire/Crossed(atom/movable/AM, oldloc) if(burning) Burn() diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index d8938683d75..b665f171285 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -51,7 +51,7 @@ return 0 -/obj/item/grown/Crossed(atom/movable/AM) +/obj/item/grown/Crossed(atom/movable/AM, oldloc) if(seed) for(var/datum/plant_gene/trait/T in seed.genes) T.on_cross(src, AM) diff --git a/code/modules/keybindings/bindings_admin.dm b/code/modules/keybindings/bindings_admin.dm new file mode 100644 index 00000000000..1413d9b0f8d --- /dev/null +++ b/code/modules/keybindings/bindings_admin.dm @@ -0,0 +1,21 @@ +/datum/admins/key_down(_key, client/user) + switch(_key) + if("F5") + user.get_admin_say() + return + if("F6") + user.admin_ghost() + return + if("F7") + player_panel_new() + return + if("F8") + user.cmd_admin_pm_panel() + return + if("F9") + user.stealth() + return + if("F10") + user.get_dead_say() + return + ..() diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm new file mode 100644 index 00000000000..6b1e0afe199 --- /dev/null +++ b/code/modules/keybindings/bindings_atom.dm @@ -0,0 +1,21 @@ +// You might be wondering why this isn't client level. If focus is null, we don't want you to move. +// Only way to do that is to tie the behavior into the focus's keyLoop(). + +/atom/movable/keyLoop(client/user) + if(!user.keys_held["Ctrl"]) + var/movement_dir = NONE + var/list/movement = SSinput.movement_keys + if(user.prefs.toggles & AZERTY) + movement = SSinput.alt_movement_keys + for(var/_key in user.keys_held) + movement_dir = movement_dir | movement[_key] + if(user.next_move_dir_add) + movement_dir |= user.next_move_dir_add + if(user.next_move_dir_sub) + movement_dir &= ~user.next_move_dir_sub + // Sanity checks in case you hold left and right and up to make sure you only go up + if((movement_dir & NORTH) && (movement_dir & SOUTH)) + movement_dir &= ~(NORTH|SOUTH) + if((movement_dir & EAST) && (movement_dir & WEST)) + movement_dir &= ~(EAST|WEST) + user.Move(get_step(src, movement_dir), movement_dir) \ No newline at end of file diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm new file mode 100644 index 00000000000..81784696b35 --- /dev/null +++ b/code/modules/keybindings/bindings_carbon.dm @@ -0,0 +1,20 @@ +/mob/living/carbon/key_down(_key, client/user) + user.keys_held[_key] = world.time + if(!user.keys_held["Shift"]) + switch(_key) + if("R", "Southwest") // Southwest is End + toggle_throw_mode() + return + if("1") + a_intent_change("help") + return + if("2") + a_intent_change("disarm") + return + if("3") + a_intent_change("grab") + return + if("4") + a_intent_change("harm") + return + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm new file mode 100644 index 00000000000..e3925aa5283 --- /dev/null +++ b/code/modules/keybindings/bindings_client.dm @@ -0,0 +1,59 @@ +// Clients aren't datums so we have to define these procs indpendently. +// These verbs are called for all key press and release events +/client/verb/keyDown(_key as text) + set instant = TRUE + set hidden = TRUE + keys_held[_key] = world.time + var/movement = SSinput.movement_keys[_key] + if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key] + if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"]) + next_move_dir_add |= movement + + // Client-level keybindings are ones anyone should be able to do at any time + // Things like taking screenshots, hitting tab, and adminhelps. + + switch(_key) + if("F1") + if(keys_held["Ctrl"] && keys_held["Shift"]) // Is this command ever used? + winset(src, null, "command=.options") + else + adminhelp() + return + if("F2") // Screenshot. Hold shift to choose a name and location to save in + ooc() + return + if("F3") + mob.say_wrapper() + return + if("F4") + mob.me_wrapper() + return + if("F12") // Toggles minimal HUD + mob.button_pressed_F12() + return + + if(holder) + holder.key_down(_key, src) + if(mob.focus) + mob.focus.key_down(_key, src) + +/client/verb/keyUp(_key as text) + set instant = TRUE + set hidden = TRUE + keys_held -= _key + var/movement = SSinput.movement_keys[_key] + if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key] + if(!(next_move_dir_add & movement)) + next_move_dir_sub |= movement + + if(holder) + holder.key_up(_key, src) + if(mob.focus) + mob.focus.key_up(_key, src) + +// Called every game tick +/client/keyLoop() + if(holder) + holder.keyLoop(src) + if(mob.focus) + mob.focus.keyLoop(src) \ No newline at end of file diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm new file mode 100644 index 00000000000..5e8ced96ab6 --- /dev/null +++ b/code/modules/keybindings/bindings_human.dm @@ -0,0 +1,80 @@ +/mob/living/carbon/human/key_down(_key, client/user) + if(_key == "H") + var/obj/item/clothing/accessory/holster/H = null + if(istype(w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/S = w_uniform + if(S.accessories.len) + H = locate() in S.accessories + if (!H) + return + if(!H.holstered) + if(!istype(get_active_hand(), /obj/item/gun)) + to_chat(usr, "You need your gun equiped to holster it.") + return + var/obj/item/gun/W = get_active_hand() + H.holster(W, usr) + else + H.unholster(usr) + if(client.keys_held["Shift"]) + switch(_key) + if("E") // Put held thing in belt or take out most recent thing from belt + quick_equip() // Implementing the storage component is going to take way too long + // var/obj/item/thing = get_active_hand() + // var/obj/item/equipped_belt = get_item_by_slot(slot_belt) + // if(!equipped_belt) // We also let you equip a belt like this + // if(!thing) + // to_chat(user, "You have no belt to take something out of.") + // return + // if(equip_to_slot_if_possible(thing, slot_belt)) + // update_inv_r_hand() + // update_inv_l_hand() + // return + // if(!SEND_SIGNAL(equipped_belt, COMSIG_CONTAINS_STORAGE)) // not a storage item + // if(!thing) + // equipped_belt.attack_hand(src) + // else + // to_chat(user, "You can't fit anything in.") + // return + // if(thing) // put thing in belt + // if(!SEND_SIGNAL(equipped_belt, COMSIG_TRY_STORAGE_INSERT, thing, user.mob)) + // to_chat(user, "You can't fit anything in.") + // return + // if(!equipped_belt.contents.len) // nothing to take out + // to_chat(user, "There's nothing in your belt to take out.") + // return + // var/obj/item/stored = equipped_belt.contents[equipped_belt.contents.len] + // if(!stored || stored.on_found(src)) + // return + // stored.attack_hand(src) // take out thing from belt + // return + + /* if("B") // Put held thing in backpack or take out most recent thing from backpack + var/obj/item/thing = get_active_hand() + var/obj/item/equipped_back = get_item_by_slot(slot_back) + if(!equipped_back) // We also let you equip a backpack like this + if(!thing) + to_chat(user, "You have no backpack to take something out of.") + return + if(equip_to_slot_if_possible(thing, slot_back)) + update_inv_r_hand() + update_inv_l_hand() + return + if(!SEND_SIGNAL(equipped_back, COMSIG_CONTAINS_STORAGE)) // not a storage item + if(!thing) + equipped_back.attack_hand(src) + else + to_chat(user, "You can't fit anything in.") + return + if(thing) // put thing in backpack + if(!SEND_SIGNAL(equipped_back, COMSIG_TRY_STORAGE_INSERT, thing, user.mob)) + to_chat(user, "You can't fit anything in.") + return + if(!equipped_back.contents.len) // nothing to take out + to_chat(user, "There's nothing in your backpack to take out.") + return + var/obj/item/stored = equipped_back.contents[equipped_back.contents.len] + if(!stored || stored.on_found(src)) + return + stored.attack_hand(src) // take out thing from backpack + return */ + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_living.dm b/code/modules/keybindings/bindings_living.dm new file mode 100644 index 00000000000..241bc15b608 --- /dev/null +++ b/code/modules/keybindings/bindings_living.dm @@ -0,0 +1,7 @@ +/mob/living/key_down(_key, client/user) + switch(_key) + if("B") + resist() + return + + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm new file mode 100644 index 00000000000..4ede6b63c7b --- /dev/null +++ b/code/modules/keybindings/bindings_mob.dm @@ -0,0 +1,145 @@ +// Technically the client argument is unncessary here since that SHOULD be src.client but let's not assume things +// All it takes is one badmin setting their focus to someone else's client to mess things up +// Or we can have NPC's send actual keypresses and detect that by seeing no client + +/mob/key_down(_key, client/user) + if(user.prefs.toggles & AZERTY) + switch(_key) + if("Delete") + if(!pulling) + to_chat(src, "You are not pulling anything.") + else + stop_pulling() + return + if("Insert", "G") + a_intent_change(INTENT_HOTKEY_RIGHT) + return + if("F") + a_intent_change(INTENT_HOTKEY_LEFT) + return + if("X", "Northeast") // Northeast is Page-up + swap_hand() + return + if("Y", "W", "Southeast") // Southeast is Page-down + mode() // attack_self(). No idea who came up with "mode()" + return + if("A", "Northwest") // Northwest is Home + var/obj/item/I = get_active_hand() + if(!I) + to_chat(src, "You have nothing to drop in your hand!") + else + drop_item(I) + return + if("E") + quick_equip() + return + if("Alt") + toggle_move_intent() + return + else + switch(_key) + if("Delete") + if(!pulling) + to_chat(src, "You are not pulling anything.") + else + stop_pulling() + return + if("Insert", "G") + a_intent_change(INTENT_HOTKEY_RIGHT) + return + if("F") + a_intent_change(INTENT_HOTKEY_LEFT) + return + if("X", "Northeast") // Northeast is Page-up + swap_hand() + return + if("Y", "Z", "Southeast") // Southeast is Page-down + mode() // attack_self(). No idea who came up with "mode()" + return + if("Q", "Northwest") // Northwest is Home + var/obj/item/I = get_active_hand() + if(!I) + to_chat(src, "You have nothing to drop in your hand!") + else + drop_item(I) + return + if("E") + quick_equip() + return + if("Alt") + toggle_move_intent() + return + //Bodypart selections + if(client.prefs.toggles & NUMPAD_TARGET) + switch(_key) + if("Numpad8") + user.body_toggle_head() + return + if("Numpad4") + user.body_r_arm() + return + if("Numpad5") + user.body_chest() + return + if("Numpad6") + user.body_l_arm() + return + if("Numpad1") + user.body_r_leg() + return + if("Numpad2") + user.body_groin() + return + if("Numpad3") + user.body_l_leg() + return + else + switch(_key) + if("Numpad1") + a_intent_change("help") + return + if("Numpad2") + a_intent_change("disarm") + return + if("Numpad3") + a_intent_change("grab") + return + if("Numpad4") + a_intent_change("harm") + return + if(client.keys_held["Ctrl"] && client.prefs.toggles & AZERTY) + switch(SSinput.alt_movement_keys[_key]) + if(NORTH) + northface() + return + if(SOUTH) + southface() + return + if(WEST) + westface() + return + if(EAST) + eastface() + return + else if(client.keys_held["Ctrl"]) + switch(SSinput.movement_keys[_key]) + if(NORTH) + northface() + return + if(SOUTH) + southface() + return + if(WEST) + westface() + return + if(EAST) + eastface() + return + return ..() + +/mob/key_up(_key, client/user) + switch(_key) + if("Alt") + toggle_move_intent() + return + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_robot.dm b/code/modules/keybindings/bindings_robot.dm new file mode 100644 index 00000000000..f9b39dc7351 --- /dev/null +++ b/code/modules/keybindings/bindings_robot.dm @@ -0,0 +1,20 @@ +/mob/living/silicon/robot/key_down(_key, client/user) + switch(_key) + if("1", "2", "3") + toggle_module(text2num(_key)) + return + if("4") + a_intent_change(INTENT_HOTKEY_LEFT) + return + if("X") + cycle_modules() + return + if("Q") + if(!(client.prefs.toggles & AZERTY)) + uneq_active() + return + if("A") + if(client.prefs.toggles & AZERTY) + uneq_active() + return + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/focus.dm b/code/modules/keybindings/focus.dm new file mode 100644 index 00000000000..9cfbf36c5d3 --- /dev/null +++ b/code/modules/keybindings/focus.dm @@ -0,0 +1,8 @@ +/mob + var/datum/focus //What receives our keyboard inputs. src by default + +/mob/proc/set_focus(datum/new_focus) + if(focus == new_focus) + return + focus = new_focus + reset_perspective(focus) //Maybe this should be done manually? You figure it out, reader \ No newline at end of file diff --git a/code/modules/keybindings/readme.md b/code/modules/keybindings/readme.md new file mode 100644 index 00000000000..f57d8d55ffa --- /dev/null +++ b/code/modules/keybindings/readme.md @@ -0,0 +1,42 @@ +# In-code keypress handling system + +This whole system is heavily based off of forum_account's keyboard library. +Thanks to forum_account for saving the day, the library can be found +[here](https://secure.byond.com/developer/Forum_account/Keyboard)! + +.dmf macros have some very serious shortcomings. For example, they do not allow reusing parts +of one macro in another, so giving cyborgs their own shortcuts to swap active module couldn't +inherit the movement that all mobs should have anyways. The webclient only supports one macro, +so having more than one was problematic. Additionally each keybind has to call an actual +verb, which meant a lot of hidden verbs that just call one other proc. Also our existing +macro was really bad and tied unrelated behavior into `Northeast()`, `Southeast()`, `Northwest()`, +and `Southwest()`. + +The basic premise of this system is to not screw with .dmf macro setup at all and handle +pressing those keys in the code instead. We have every key call `client.keyDown()` +or `client.keyUp()` with the pressed key as an argument. Certain keys get processed +directly by the client because they should be doable at any time, then we call +`keyDown()` or `keyUp()` on the client's holder and the client's mob's focus. +By default `mob.focus` is the mob itself, but you can set it to any datum to give control of a +client's keypresses to another object. This would be a good way to handle a menu or driving +a mech. You can also set it to null to disregard input from a certain user. + +Movement is handled by having each client call `client.keyLoop()` every game tick. +As above, this calls holder and `focus.keyLoop()`. `atom/movable/keyLoop()` handles movement +Try to keep the calculations in this proc light. It runs every tick for every client after all! + +You can also tell which keys are being held down now. Each client a list of keys pressed called +`keys_held`. Each entry is a key as a text string associated with the world.time when it was +pressed. + +No client-set keybindings at this time, but it shouldn't be too hard if someone wants. + +Notes about certain keys: + +* `Tab` has client-sided behavior but acts normally +* `T`, `O`, and `M` move focus to the input when pressed. This fires the keyUp macro right away. +* `\` needs to be escaped in the dmf so any usage is `\\` + +You cannot `TICK_CHECK` or check `world.tick_usage` inside of procs called by key down and up +events. They happen outside of a byond tick and have no meaning there. Key looping +works correctly since it's part of a subsystem, not direct input. \ No newline at end of file diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm new file mode 100644 index 00000000000..cc76256386e --- /dev/null +++ b/code/modules/keybindings/setup.dm @@ -0,0 +1,46 @@ +/client + var/list/keys_held = list() // A list of any keys held currently + // These next two vars are to apply movement for keypresses and releases made while move delayed. + // Because discarding that input makes the game less responsive. + var/next_move_dir_add // On next move, add this dir to the move that would otherwise be done + var/next_move_dir_sub // On next move, subtract this dir from the move that would otherwise be done + +// Set a client's focus to an object and override these procs on that object to let it handle keypresses + +/datum/proc/key_down(key, client/user) // Called when a key is pressed down initially + return +/datum/proc/key_up(key, client/user) // Called when a key is released + return +/datum/proc/keyLoop(client/user) // Called once every frame + set waitfor = FALSE + return + +// removes all the existing macros +/client/proc/erase_all_macros() + var/list/macro_sets = params2list(winget(src, null, "macros")) + var/erase_output = "" + for(var/i in 1 to macro_sets.len) + var/setname = macro_sets[i] + var/list/macro_set = params2list(winget(src, "[setname].*", "command")) // The third arg doesnt matter here as we're just removing them all + for(var/k in 1 to macro_set.len) + var/list/split_name = splittext(macro_set[k], ".") + var/macro_name = "[split_name[1]].[split_name[2]]" // [3] is "command" + erase_output = "[erase_output];[macro_name].parent=null" + winset(src, null, erase_output) + +/client/proc/set_macros() + set waitfor = FALSE + + erase_all_macros() + + var/list/macro_sets = SSinput.macro_sets + for(var/i in 1 to macro_sets.len) + var/setname = macro_sets[i] + if(setname != "default") + winclone(src, "default", setname) + var/list/macro_set = macro_sets[setname] + for(var/k in 1 to macro_set.len) + var/key = macro_set[k] + var/command = macro_set[key] + winset(src, "[setname]-\ref[key]", "parent=[setname];name=[key];command=[command]") + winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=old_default") diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index d846e065761..9a88dd50259 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -238,6 +238,9 @@ /obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O) return isitem(O) +/obj/machinery/smartfridge/survival_pod/default_unfasten_wrench() + return FALSE + /obj/machinery/smartfridge/survival_pod/empty name = "dusty survival pod storage" desc = "A heated storage unit. This one's seen better days." diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 10823051563..9d6ca608759 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -905,6 +905,7 @@ throw_range = 5 var/loaded = 1 var/malfunctioning = 0 + var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it /obj/item/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag) if(!loaded) @@ -912,6 +913,9 @@ if(istype(target, /mob/living) && proximity_flag) if(istype(target, /mob/living/simple_animal)) var/mob/living/simple_animal/M = target + if(M.sentience_type != revive_type) + to_chat(user, "[src] does not work on this sort of creature.") + return if(M.stat == DEAD) M.faction = list("neutral") M.revive() diff --git a/code/modules/mining/explorer_gear.dm b/code/modules/mining/explorer_gear.dm index 6453f54c979..a9464efe959 100644 --- a/code/modules/mining/explorer_gear.dm +++ b/code/modules/mining/explorer_gear.dm @@ -1,43 +1,44 @@ -/****************Explorer's Suit and Mask****************/ -/obj/item/clothing/suit/hooded/explorer - name = "explorer suit" - desc = "An armoured suit for exploring harsh environments." - icon_state = "explorer" - item_state = "explorer" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - hoodtype = /obj/item/clothing/head/hooded/explorer - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) - allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) - resistance_flags = FIRE_PROOF - - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi', - "Drask" = 'icons/mob/species/drask/suit.dmi', - "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', - "Unathi" = 'icons/mob/species/unathi/suit.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi' - ) - -/obj/item/clothing/head/hooded/explorer - name = "explorer hood" - desc = "An armoured hood for exploring harsh environments." - icon_state = "explorer" - item_state = "explorer" - body_parts_covered = HEAD - flags = BLOCKHAIR | NODROP - flags_cover = HEADCOVERSEYES - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) - resistance_flags = FIRE_PROOF - - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/head.dmi', - "Drask" = 'icons/mob/species/drask/head.dmi', - "Grey" = 'icons/mob/species/grey/head.dmi', - "Skrell" = 'icons/mob/species/skrell/head.dmi' +/****************Explorer's Suit and Mask****************/ +/obj/item/clothing/suit/hooded/explorer + name = "explorer suit" + desc = "An armoured suit for exploring harsh environments." + icon_state = "explorer" + item_state = "explorer" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + hoodtype = /obj/item/clothing/head/hooded/explorer + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) + resistance_flags = FIRE_PROOF + hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran") + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi', + "Drask" = 'icons/mob/species/drask/suit.dmi', + "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', + "Unathi" = 'icons/mob/species/unathi/suit.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi' + ) + +/obj/item/clothing/head/hooded/explorer + name = "explorer hood" + desc = "An armoured hood for exploring harsh environments." + icon_state = "explorer" + item_state = "explorer" + body_parts_covered = HEAD + flags = BLOCKHAIR | NODROP + flags_cover = HEADCOVERSEYES + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + resistance_flags = FIRE_PROOF + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi', + "Drask" = 'icons/mob/species/drask/head.dmi', + "Grey" = 'icons/mob/species/grey/head.dmi', + "Skrell" = 'icons/mob/species/skrell/head.dmi' ) \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index d3e22e5bca2..fb2b915f146 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST(labor_sheet_values) + /**********************Prisoners' Console**************************/ /obj/machinery/mineral/labor_claim_console @@ -5,153 +7,153 @@ desc = "A stacking console with an electromagnetic writer, used to track ore mined by prisoners." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "console" - density = 0 - anchored = 1 - var/obj/machinery/mineral/stacking_machine/laborstacker/machine = null + density = FALSE + var/obj/machinery/mineral/stacking_machine/laborstacker/stacking_machine = null var/machinedir = SOUTH var/obj/item/card/id/prisoner/inserted_id var/obj/machinery/door/airlock/release_door var/door_tag = "prisonshuttle" - var/use_release_door = 0 var/obj/item/radio/intercom/announcer - -/obj/machinery/mineral/labor_claim_console/New() - ..() +/obj/machinery/mineral/labor_claim_console/Initialize() + . = ..() announcer = new /obj/item/radio/intercom(null) announcer.config(list("Security" = 0)) + locate_stacking_machine() - spawn(7) - src.machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) - var/t - for(var/obj/machinery/door/airlock/d in range(5,src)) - t = d.id_tag - if(t == src.door_tag) - src.release_door = d - if(machine && (release_door || !use_release_door)) - machine.CONSOLE = src + if(!GLOB.labor_sheet_values) + var/sheet_list = list() + for(var/sheet_type in subtypesof(/obj/item/stack/sheet)) + var/obj/item/stack/sheet/sheet = sheet_type + if(!initial(sheet.point_value) || (initial(sheet.merge_type) && initial(sheet.merge_type) != sheet_type)) //ignore no-value sheets and x/fifty subtypes + continue + sheet_list += list(list("ore" = initial(sheet.name), "value" = initial(sheet.point_value))) + GLOB.labor_sheet_values = sheet_list + +/obj/machinery/mineral/labor_claim_console/Destroy() + . = ..() + QDEL_NULL(announcer) + +/proc/cmp_sheet_list(list/a, list/b) + return a["value"] - b["value"] + +/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/card/id/prisoner)) + if(!inserted_id) + if(!user.unEquip(I)) + return + I.forceMove(src) + inserted_id = I + to_chat(user, "You insert [I].") + SSnanoui.update_uis(src) + return else - qdel(src) + to_chat(user, "There's an ID inserted already.") + return ..() + +/obj/machinery/mineral/labor_claim_console/attack_hand(mob/user) + ui_interact(user) + +/obj/machinery/mineral/labor_claim_console/attack_ghost(mob/user) + attack_hand(user) + +/obj/machinery/mineral/labor_claim_console/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "labor_claim_console.tmpl", name, 450, 625, state) + ui.open() + +/obj/machinery/mineral/labor_claim_console/ui_data(mob/user) + var/list/data = list() + var/can_go_home = FALSE + + data["emagged"] = (emagged) ? TRUE : FALSE + if(inserted_id) + data["id"] = inserted_id + data["id_name"] = inserted_id.registered_name + data["points"] = inserted_id.points + data["goal"] = inserted_id.goal + if(check_auth()) + can_go_home = TRUE + + if(stacking_machine) + data["unclaimed_points"] = stacking_machine.points + + data["ores"] = GLOB.labor_sheet_values + data["can_go_home"] = can_go_home + + return data + +/obj/machinery/mineral/labor_claim_console/Topic(href, href_list) + if(..()) + return TRUE + + if(href_list["handle_id"]) + if(inserted_id) + if(!usr.put_in_hands(inserted_id)) + inserted_id.forceMove(get_turf(src)) + inserted_id = null + else + var/obj/item/I = usr.get_active_hand() + if(istype(I, /obj/item/card/id/prisoner)) + if(!usr.unEquip(I)) + return + I.forceMove(src) + inserted_id = I + if(href_list["claim_points"]) + inserted_id.points += stacking_machine.points + stacking_machine.points = 0 + to_chat(usr, "Points transferred.") + if(href_list["move_shuttle"]) + if(!alone_in_area(get_area(src), usr)) + to_chat(usr, "Prisoners are only allowed to be released while alone.") + else + switch(SSshuttle.moveShuttle("laborcamp", "laborcamp_home", TRUE)) + if(1) + to_chat(usr, "Shuttle not found.") + if(2) + to_chat(usr, "Shuttle already at station.") + if(3) + to_chat(usr, "No permission to dock could be granted.") + else + if(!(emagged)) + var/message = "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval." + announcer.autosay(message, "Labor Camp Controller", "Security") + to_chat(usr, "Shuttle received message and will be sent shortly.") + + return TRUE /obj/machinery/mineral/labor_claim_console/proc/check_auth() - if(emagged) return 1 //Shuttle is emagged, let any ol' person through + if(emagged) + return TRUE //Shuttle is emagged, let any ol' person through return (istype(inserted_id) && inserted_id.points >= inserted_id.goal) //Otherwise, only let them out if the prisoner's reached his quota. +/obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine() + stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) + if(stacking_machine) + stacking_machine.CONSOLE = src + else + qdel(src) -/obj/machinery/mineral/labor_claim_console/attack_hand(user as mob) - var/dat - dat += text("Point Claim Console

") - if(emagged) //Shit's broken - dat += text("QU&#t0A In%aL*D
") - else if(istype(inserted_id)) //There's an ID in there. - dat += text("ID: [inserted_id.registered_name] Eject ID.
") - dat += text("Points Collected:[inserted_id.points]
") - dat += text("Point Quota: [inserted_id.goal] - Reach your quota to earn your release
") - dat += text("Unclaimed Collection Points: [machine.points]. Claim points.
") - else //No ID in sight. Complain about it. - dat += text("No ID inserted. Insert ID.
") - if(check_auth()) - dat += text("Proceed to station.
") - if(use_release_door) - dat += text("Open release door.
") - if(machine) - dat += text("
Mineral Value List:
[machine.get_ore_values()]") - - - user << browse("[dat]", "window=console_stacking_machine") - - -/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I, /obj/item/card/id)) - return attack_hand(user) - ..() - -/obj/machinery/mineral/labor_claim_console/emag_act(user as mob) - emag(user) - -/obj/machinery/mineral/labor_claim_console/proc/emag(mob/user as mob) - if(!emagged) - emagged = 1 +/obj/machinery/mineral/labor_claim_console/emag_act(mob/user) + if(!(emagged)) + emagged = TRUE to_chat(user, "PZZTTPFFFT") - -/obj/machinery/mineral/labor_claim_console/Topic(href, href_list) - usr.set_machine(src) - src.add_fingerprint(usr) - if(href_list["choice"]) - if(istype(inserted_id)) //Sanity check against href spoofs - if(href_list["choice"] == "eject") - inserted_id.loc = loc - inserted_id.verb_pickup() - inserted_id = null - if(href_list["choice"] == "claim") - inserted_id.points += machine.points - machine.points = 0 - to_chat(src, "Points transferred.") - else if(href_list["choice"] == "insert") - var/obj/item/card/id/prisoner/I = usr.get_active_hand() - if(istype(I)) - usr.drop_item() - I.loc = src - inserted_id = I - else - to_chat(usr, "Invalid ID.") - if(check_auth()) //Sanity check against hef spoofs - if(href_list["choice"] == "station") - if(!alone_in_area(get_area(src), usr)) - to_chat(usr, "Prisoners are only allowed to be released while alone.") - else - switch(SSshuttle.moveShuttle("laborcamp","laborcamp_home")) - if(1) - to_chat(usr, "Shuttle not found") - if(2) - to_chat(usr, "Shuttle already at station") - if(3) - to_chat(usr, "No permission to dock could be granted.") - else - var/message = "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval." - announcer.autosay(message, "Labor Camp Controller", "Security") - to_chat(usr, "Shuttle received message and will be sent shortly.") - - if(href_list["choice"] == "release") - if(alone_in_area(get_area(loc), usr)) - var/obj/docking_port/stationary/S = SSshuttle.getDock("laborcamp_home") - if(S && S.get_docked()) - if(release_door && release_door.density) - release_door.open() - else - to_chat(usr, "Prisoners can only be released while docked with the station.") - else - to_chat(usr, "Prisoners are only allowed to be released while alone.") - - src.updateUsrDialog() - return - - /**********************Prisoner Collection Unit**************************/ - - /obj/machinery/mineral/stacking_machine/laborstacker - var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity. - var/list/ore_values = list(("glass" = 1), ("metal" = 2), ("solid plasma" = 20), ("plasteel" = 23), ("reinforced glass" = 4), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("diamond" = 25), ("bananium" = 50), ("tranquillite" = 50)) - -/obj/machinery/mineral/stacking_machine/laborstacker/proc/get_ore_values() - var/dat = "" - for(var/ore in ore_values) - var/value = ore_values[ore] - dat += "" - dat += "
[capitalize(ore)][value]
" - return dat + var/points = 0 //The unclaimed value of ore stacked. /obj/machinery/mineral/stacking_machine/laborstacker/process_sheet(obj/item/stack/sheet/inp) - if(istype(inp)) - var/n = inp.name - var/a = inp.amount - if(n in ore_values) - points += ore_values[n] * a + points += inp.point_value * inp.amount ..() +/obj/machinery/mineral/stacking_machine/laborstacker/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/stack/sheet) && user.canUnEquip(I)) + var/obj/item/stack/sheet/inp = I + points += inp.point_value * inp.amount + return ..() /**********************Point Lookup Console**************************/ /obj/machinery/mineral/labor_points_checker @@ -159,13 +161,15 @@ desc = "A console used by prisoners to check the progress on their quotas. Simply swipe a prisoner ID." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "console" - density = 0 - anchored = 1 + density = FALSE /obj/machinery/mineral/labor_points_checker/attack_hand(mob/user) - user.examine(src) + . = ..() + if(.) + return + user.examinate(src) -/obj/machinery/mineral/labor_points_checker/attackby(obj/item/I as obj, mob/user as mob, params) +/obj/machinery/mineral/labor_points_checker/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id)) if(istype(I, /obj/item/card/id/prisoner)) var/obj/item/card/id/prisoner/prisoner_id = I @@ -175,5 +179,5 @@ to_chat(user, "Collect points by bringing smelted minerals to the Labor Shuttle stacking machine. Reach your quota to earn your release.") else to_chat(user, "Error: Invalid ID") - return - ..() + else + return ..() \ No newline at end of file diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index ab714c6f1a6..d9747a3a1f4 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -27,6 +27,17 @@ if(prob(15)) harvest(null, TRUE) +/obj/structure/flora/ash/ex_act(severity, target) + switch(severity) + if(1) + qdel(src) + if(2) + if(prob(80)) + qdel(src) + if(3) + if(prob(50)) + qdel(src) + /obj/structure/flora/ash/proc/harvest(user, no_drop) if(harvested) return 0 @@ -137,7 +148,7 @@ regrowth_time_low = 4800 regrowth_time_high = 7200 -/obj/structure/flora/ash/cacti/Crossed(mob/AM) +/obj/structure/flora/ash/cacti/Crossed(mob/AM, oldloc) if(ishuman(AM) && has_gravity(loc) && prob(70)) var/mob/living/carbon/human/H = AM if(!H.shoes && !H.lying) //ouch, my feet. diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index d8286bc8698..d28a04a11be 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -12,8 +12,12 @@ /obj/structure/closet/crate/necropolis/tendril desc = "It's watching you suspiciously." -/obj/structure/closet/crate/necropolis/tendril/New() +/obj/structure/closet/crate/necropolis/tendril/New(add_loot = TRUE) ..() + + if(!add_loot) + return + var/loot = rand(1,24) switch(loot) if(1) @@ -68,4 +72,19 @@ new /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor(src) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src) if(24) - new /obj/item/spellbook/oneuse/summonitem(src) \ No newline at end of file + new /obj/item/spellbook/oneuse/summonitem(src) + +/obj/structure/closet/crate/necropolis/puzzle + name = "puzzling chest" + +/obj/structure/closet/crate/necropolis/puzzle/New() + ..(FALSE) + + var/loot = rand(1,3) + switch(loot) + if(1) + new /obj/item/soulstone/anybody(src) + if(2) + new /obj/item/wisp_lantern(src) + if(3) + new /obj/item/prisoncube(src) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 8ba8b13c09c..f10b78dc526 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -82,6 +82,7 @@ /obj/item/flashlight/lantern name = "lantern" icon_state = "lantern" + item_state = "lantern" desc = "A mining lantern." brightness_on = 6 // luminosity when on diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index c1f474ccd64..ecf394a8734 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -31,7 +31,7 @@ else if(W.isOn()) to_chat(user, "Not enough fuel to smelt [src].") -/obj/item/stack/ore/Crossed(atom/movable/AM) +/obj/item/stack/ore/Crossed(atom/movable/AM, oldloc) var/obj/item/storage/bag/ore/OB var/turf/simulated/floor/F = get_turf(src) if(loc != F) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index c8c7d5c32e3..2d1ff8d82da 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -263,7 +263,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ..() statpanel("Status") if(client.statpanel == "Status") - show_stat_station_time() show_stat_emergency_shuttle_eta() stat(null, "Respawnability: [(src in GLOB.respawnable_list) ? "Yes" : "No"]") @@ -402,9 +401,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(usr, "Not when you're not dead!") return - var/area/A = input("Area to jump to", "BOOYEA") as null|anything in ghostteleportlocs - var/area/thearea = ghostteleportlocs[A] + var/datum/async_input/A = input_autocomplete_async(usr, "Area to jump to: ", ghostteleportlocs) + A.on_close(CALLBACK(src, .proc/teleport)) +/mob/dead/observer/proc/teleport(area/thearea) if(!thearea) return @@ -425,9 +425,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set desc = "Follow and orbit a mob." var/list/mobs = getpois(skip_mindless=1) - var/input = input("Please, select a mob!", "Haunt", null, null) as null|anything in mobs - var/mob/target = mobs[input] - ManualFollow(target) + var/datum/async_input/A = input_autocomplete_async(usr, "Please, select a mob: ", mobs) + A.on_close(CALLBACK(src, .proc/ManualFollow)) // This is the ghost's follow verb with an argument /mob/dead/observer/proc/ManualFollow(var/atom/movable/target) @@ -499,25 +498,21 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Jump to Mob" set desc = "Teleport to a mob" - if(isobserver(usr)) //Make sure they're an observer! - var/list/dest = list() //List of possible destinations (mobs) - var/target = null //Chosen target. + if(isobserver(usr)) //Make sure they're an observer! + var/list/dest = getpois(mobs_only=1) //Fill list, prompt user with list + var/datum/async_input/A = input_autocomplete_async(usr, "Enter a mob name: ", dest) + A.on_close(CALLBACK(src, .proc/jump_to_mob)) - dest += getpois(mobs_only=1) //Fill list, prompt user with list - target = input("Please, select a mob!", "Jump to Mob", null, null) as null|anything in dest - - if(!target) //Make sure we actually have a target - return - else - var/mob/M = dest[target] //Destination mob - var/mob/A = src //Source mob - var/turf/T = get_turf(M) //Turf of the destination mob - - if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - A.forceMove(T) - else - to_chat(A, "This mob is not located in the game world.") +/mob/dead/observer/proc/jump_to_mob(mob/M) + if(!M) + return + var/mob/A = src //Source mob + var/turf/T = get_turf(M) //Turf of the destination mob + if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. + A.forceMove(T) + return + to_chat(A, "This mob is not located in the game world.") /* Now a spell. See spells.dm /mob/dead/observer/verb/boo() diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm index 916ff9aa9b8..e890098b29b 100644 --- a/code/modules/mob/dead/observer/spells.dm +++ b/code/modules/mob/dead/observer/spells.dm @@ -15,6 +15,7 @@ GLOBAL_LIST_INIT(boo_phrases, list( ghost = TRUE + action_icon_state = "boo" school = "transmutation" charge_max = 600 starts_charged = FALSE diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 989decdb395..304bdc419a2 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -58,19 +58,20 @@ if(message) log_emote(message, src) - //Hearing gasp and such every five seconds is not good emotes were not global for a reason. - // Maybe some people are okay with that. - + // Hearing gasp and such every five seconds is not good emotes were not global for a reason. + // Maybe some people are okay with that. for(var/mob/M in GLOB.player_list) if(!M.client) continue //skip monkeys and leavers - if(istype(M, /mob/new_player)) - continue - if(findtext(message," snores.")) //Because we have so many sleeping people. - break - if(M.stat == DEAD && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) - M.show_message(message) + if(isnewplayer(M)) + continue + + if(findtext(message, " snores.")) //Because we have so many sleeping people. + break + + if(isobserver(M) && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting. + M.show_message(message) // Type 1 (Visual) emotes are sent to anyone in view of the item if(m_type & EMOTE_VISUAL) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 641450026ba..45d4cda2202 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -63,10 +63,10 @@ var/datum/gas_mixture/environment = T.return_air() var/pressure = environment ? environment.return_pressure() : 0 if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1) - return 0 + return FALSE if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet - italics = 1 + italics = TRUE sound_vol *= 0.5 if(sleeping || stat == UNCONSCIOUS) @@ -87,8 +87,6 @@ var/track = null if(isobserver(src)) - if(italics && client.prefs.toggles & CHAT_GHOSTRADIO) - return if(speaker_name != speaker.real_name && speaker.real_name) speaker_name = "[speaker.real_name] ([speaker_name])" track = "([ghost_follow_link(speaker, ghost=src)]) " diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index bb7bcfc94e1..35a08d0ce10 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -6,6 +6,14 @@ if(hand) return l_hand else return r_hand +/mob/verb/quick_equip() + set name = "quick-equip" + set hidden = 1 + + var/obj/item/I = get_active_hand() + if(I) + I.equip_to_best_slot(src) + /mob/proc/is_in_active_hand(obj/item/I) var/obj/item/item_to_test = get_active_hand() @@ -254,3 +262,4 @@ if(slot_r_hand) return r_hand return null + diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 25b188911ad..57725da8eb2 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -455,6 +455,7 @@ colour = "alien" key = "y" flags = RESTRICTED | HIVEMIND + follow = TRUE /datum/language/wryn/check_special_condition(mob/other) var/mob/living/carbon/M = other @@ -485,7 +486,7 @@ colour = "alien" key = "a" flags = RESTRICTED | HIVEMIND - follow = 1 + follow = TRUE /datum/language/terrorspider name = "Spider Hivemind" @@ -496,7 +497,7 @@ colour = "terrorspider" key = "ts" flags = RESTRICTED | HIVEMIND - follow = 1 + follow = TRUE /datum/language/ling name = "Changeling" @@ -505,10 +506,11 @@ colour = "changeling" key = "g" flags = RESTRICTED | HIVEMIND + follow = TRUE /datum/language/ling/broadcast(mob/living/speaker, message, speaker_mask) if(speaker.mind && speaker.mind.changeling) - ..(speaker,message,speaker.mind.changeling.changelingID) + ..(speaker, message, speaker.mind.changeling.changelingID) else if(speaker.mind && speaker.mind.linglink) ..() else @@ -521,6 +523,7 @@ colour = "shadowling" key = "8" flags = RESTRICTED | HIVEMIND + follow = TRUE /datum/language/shadowling/broadcast(mob/living/speaker, message, speaker_mask) if(speaker.mind && speaker.mind.special_role == SPECIAL_ROLE_SHADOWLING) @@ -539,6 +542,7 @@ colour = "abductor" key = "zw" //doesn't matter, this is their default and only language flags = RESTRICTED | HIVEMIND + follow = TRUE /datum/language/abductor/broadcast(mob/living/speaker, message, speaker_mask) ..(speaker,message,speaker.real_name) @@ -567,6 +571,7 @@ colour = "alien" key = "bo" flags = RESTRICTED | HIVEMIND + follow = TRUE /datum/language/corticalborer/broadcast(mob/living/speaker, message, speaker_mask) var/mob/living/simple_animal/borer/B @@ -590,7 +595,7 @@ exclaim_verb = "declares" key = "b" flags = RESTRICTED | HIVEMIND - follow = 1 + follow = TRUE var/drone_only /datum/language/binary/broadcast(mob/living/speaker, message, speaker_mask) @@ -636,8 +641,8 @@ colour = "say_quote" key = "d" flags = RESTRICTED | HIVEMIND - drone_only = 1 - follow = 1 + drone_only = TRUE + follow = TRUE /datum/language/drone name = "Drone" @@ -647,7 +652,7 @@ exclaim_verb = "declares" key = "]" flags = RESTRICTED - follow = 1 + follow = TRUE syllables = list ("beep", "boop") /datum/language/swarmer @@ -659,7 +664,7 @@ colour = "say_quote" key = "z"//Zwarmer...Or Zerg! flags = RESTRICTED | HIVEMIND - follow = 1 + follow = TRUE // Language handling. /mob/proc/add_language(language) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index ee858138f70..69a2e1160b0 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -73,7 +73,11 @@ stat = CONSCIOUS return health = maxHealth - getOxyLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() + update_stat("updatehealth([reason])") + med_hud_set_health() + med_hud_set_status() + handle_hud_icons_health() /mob/living/carbon/alien/handle_environment(var/datum/gas_mixture/environment) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index adf81753827..bf2158ae58e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -17,7 +17,7 @@ . = -1 //hunters are sanic . += ..() //but they still need to slow down on stun -/mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates() +/mob/living/carbon/alien/humanoid/hunter/handle_hud_icons_health() ..() //-Yvarov if(healths) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index 6a9565fc449..3acb1fe8713 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -42,7 +42,7 @@ alien_organs += new /obj/item/organ/internal/xenos/neurotoxin ..() -/mob/living/carbon/alien/humanoid/sentinel/handle_regular_hud_updates() +/mob/living/carbon/alien/humanoid/sentinel/handle_hud_icons_health() ..() //-Yvarov if(healths) diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm index f5355a38d67..a64602d030c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm @@ -48,29 +48,26 @@ alien_organs += new /obj/item/organ/internal/xenos/neurotoxin ..() -/mob/living/carbon/alien/humanoid/empress +/mob/living/carbon/alien/humanoid/empress/handle_hud_icons_health() + ..() //-Yvarov - handle_regular_hud_updates() - - ..() //-Yvarov - - if(src.healths) - if(src.stat != 2) - switch(health) - if(250 to INFINITY) - src.healths.icon_state = "health0" - if(175 to 250) - src.healths.icon_state = "health1" - if(100 to 175) - src.healths.icon_state = "health2" - if(50 to 100) - src.healths.icon_state = "health3" - if(0 to 50) - src.healths.icon_state = "health4" - else - src.healths.icon_state = "health5" - else - src.healths.icon_state = "health6" + if(healths) + if(stat != 2) + switch(health) + if(250 to INFINITY) + healths.icon_state = "health0" + if(175 to 250) + healths.icon_state = "health1" + if(100 to 175) + healths.icon_state = "health2" + if(50 to 100) + healths.icon_state = "health3" + if(0 to 50) + healths.icon_state = "health4" + else + healths.icon_state = "health5" + else + healths.icon_state = "health6" /mob/living/carbon/alien/humanoid/empress/verb/lay_egg() set name = "Lay Egg (250)" diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index d80d773325e..14124afef3e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -32,7 +32,7 @@ . = ..() . += 3 -/mob/living/carbon/alien/humanoid/queen/handle_regular_hud_updates() +/mob/living/carbon/alien/humanoid/queen/handle_hud_icons_health() ..() //-Yvarov if(healths) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 04dcb0c60ef..78bc0004b15 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -72,7 +72,7 @@ var/const/MAX_ACTIVE_TIME = 400 /obj/item/clothing/mask/facehugger/equipped(mob/M) Attach(M) -/obj/item/clothing/mask/facehugger/Crossed(atom/target) +/obj/item/clothing/mask/facehugger/Crossed(atom/target, oldloc) HasProximity(target) return diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index df0afa62f49..8d17b84c724 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -95,7 +95,6 @@ I'm using this for Stat to give it a more nifty interface to work with ..() if(has_synthetic_assistance()) statpanel("Status") - show_stat_station_time() show_stat_emergency_shuttle_eta() if(client.statpanel == "Status") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 2c7a2d67c55..a8dbaa7ac2f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -216,56 +216,7 @@ add_attack_logs(M, src, "Shaked", ATKLOG_ALL) if(health >= HEALTH_THRESHOLD_CRIT) if(src == M && ishuman(src)) - var/mob/living/carbon/human/H = src - visible_message( \ - text("[src] examines [].",gender==MALE?"himself":"herself"), \ - "You check yourself for injuries." \ - ) - - var/list/missing = list("head", "chest", "groin", "l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot") - for(var/X in H.bodyparts) - var/obj/item/organ/external/LB = X - missing -= LB.limb_name - var/status = "" - var/brutedamage = LB.brute_dam - var/burndamage = LB.burn_dam - - if(brutedamage > 0) - status = "bruised" - if(brutedamage > 20) - status = "battered" - if(brutedamage > 40) - status = "mangled" - if(brutedamage > 0 && burndamage > 0) - status += " and " - if(burndamage > 40) - status += "peeling away" - - else if(burndamage > 10) - status += "blistered" - else if(burndamage > 0) - status += "numb" - if(LB.status & ORGAN_MUTATED) - status = "weirdly shapen." - if(status == "") - status = "OK" - to_chat(src, "\t Your [LB.name] is [status].") - - for(var/obj/item/I in LB.embedded_objects) - to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") - - for(var/t in missing) - to_chat(src, "Your [parse_zone(t)] is missing!") - - if(H.bleed_rate) - to_chat(src, "You are bleeding!") - if(staminaloss) - if(staminaloss > 30) - to_chat(src, "You're completely exhausted.") - else - to_chat(src, "You feel fatigued.") - if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit)) - H.play_xylophone() + check_self_for_injuries() else if(player_logged) M.visible_message("[M] shakes [src], but [p_they()] [p_do()] not respond. Probably suffering from SSD.", \ @@ -308,6 +259,58 @@ else if(H.w_uniform) H.w_uniform.add_fingerprint(M) +/mob/living/carbon/proc/check_self_for_injuries() + var/mob/living/carbon/human/H = src + visible_message( \ + text("[src] examines [].",gender==MALE?"himself":"herself"), \ + "You check yourself for injuries." \ + ) + + var/list/missing = list("head", "chest", "groin", "l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot") + for(var/X in H.bodyparts) + var/obj/item/organ/external/LB = X + missing -= LB.limb_name + var/status = "" + var/brutedamage = LB.brute_dam + var/burndamage = LB.burn_dam + + if(brutedamage > 0) + status = "bruised" + if(brutedamage > 20) + status = "battered" + if(brutedamage > 40) + status = "mangled" + if(brutedamage > 0 && burndamage > 0) + status += " and " + if(burndamage > 40) + status += "peeling away" + + else if(burndamage > 10) + status += "blistered" + else if(burndamage > 0) + status += "numb" + if(LB.status & ORGAN_MUTATED) + status = "weirdly shapen." + if(status == "") + status = "OK" + to_chat(src, "\t Your [LB.name] is [status].") + + for(var/obj/item/I in LB.embedded_objects) + to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") + + for(var/t in missing) + to_chat(src, "Your [parse_zone(t)] is missing!") + + if(H.bleed_rate) + to_chat(src, "You are bleeding!") + if(staminaloss) + if(staminaloss > 30) + to_chat(src, "You're completely exhausted.") + else + to_chat(src, "You feel fatigued.") + if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit)) + H.play_xylophone() + /mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) . = ..() var/damage = intensity - check_eye_prot() @@ -972,6 +975,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, to_chat(src, "You [slipVerb]ped on [description]!") playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) // Something something don't run with scissors + moving_diagonally = 0 //If this was part of diagonal move slipping will stop it. Stun(stun) Weaken(weaken) return 1 diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 52636efb896..219ba9ca9eb 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -106,6 +106,12 @@ else //Everyone else fails, skip the emote attempt return + if("warble", "warbles") + if(isskrell(src)) //Only Skrell can warble. + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm' + else //Everyone else fails, skip the emote attempt + return + if("scream", "screams") on_CD = handle_emote_CD(50) //longer cooldown if("fart", "farts", "flip", "flips", "snap", "snaps") @@ -221,6 +227,13 @@ playsound(loc, 'sound/effects/voxrustle.ogg', 50, 0) //Credit to sound-ideas (freesfx.co.uk) for the sound. m_type = 2 + if("warble", "warbles") + var/M = handle_emote_param(param) + + message = "[src] warbles[M ? " at [M]" : ""]." + playsound(loc, 'sound/effects/warble.ogg', 50, 0) // Copyright CC BY 3.0 alienistcog (freesound.org) for the sound. + m_type = 2 + if("yes") var/M = handle_emote_param(param) @@ -658,9 +671,9 @@ if(!restrained()) var/t1 = round(text2num(param)) if(isnum(t1)) - if(t1 <= 5 && (!r_hand || !l_hand)) + if(t1 <= 5 && t1 >= 1 && (!r_hand || !l_hand)) message = "[src] raises [t1] finger\s." - else if(t1 <= 10 && (!r_hand && !l_hand)) + else if(t1 <= 10 && t1 >= 1 && (!r_hand && !l_hand)) message = "[src] raises [t1] finger\s." m_type = 1 @@ -904,6 +917,8 @@ emotelist += "\nVox specific emotes :- quill(s)" if("Diona") emotelist += "\nDiona specific emotes :- creak(s)" + if("Skrell") + emotelist += "\nSkrell specific emotes :- warble(s)" if(ismachine(src)) emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob, buzz2-(none)/mob" @@ -931,9 +946,13 @@ // Maybe some people are okay with that. for(var/mob/M in GLOB.dead_mob_list) - if(!M.client || istype(M, /mob/new_player)) - continue //skip monkeys, leavers and new players - if(M.stat == DEAD && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + if(!M.client) + continue + + if(isnewplayer(M)) + continue + + if(isobserver(M) && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting. M.show_message(message) switch(m_type) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bc0c33c233d..643319dc8dd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -162,8 +162,6 @@ stat(null, "Intent: [a_intent]") stat(null, "Move Mode: [m_intent]") - show_stat_station_time() - show_stat_emergency_shuttle_eta() if(client.statpanel == "Status") @@ -455,7 +453,7 @@ popup.open() -/mob/living/carbon/human/Crossed(atom/movable/AM) +/mob/living/carbon/human/Crossed(atom/movable/AM, oldloc) var/mob/living/simple_animal/bot/mulebot/MB = AM if(istype(MB)) MB.RunOver(src) @@ -1480,19 +1478,22 @@ if(usr != src) return 0 //something is terribly wrong - + if(incapacitated()) + to_chat(src, "You can't write on the floor in your current state!") + return if(!bloody_hands) verbs -= /mob/living/carbon/human/proc/bloody_doodle - if(src.gloves) - to_chat(src, "Your [src.gloves] are getting in the way.") + if(gloves) + to_chat(src, "[gloves] are preventing you from writing anything down!") return - var/turf/simulated/T = src.loc + var/turf/simulated/T = loc if(!istype(T)) //to prevent doodling out of mechs and lockers to_chat(src, "You cannot reach the floor.") return + var/turf/origin = T var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West") if(direction != "Here") T = get_step(T,text2dir(direction)) @@ -1510,7 +1511,9 @@ var/max_length = bloody_hands * 30 //tweeter style var/message = stripped_input(src,"Write a message. It cannot be longer than [max_length] characters.","Blood writing", "") - + if(origin != loc) + to_chat(src, "Stay still while writing!") + return if(message) var/used_blood_amount = round(length(message) / 30, 1) bloody_hands = max(0, bloody_hands - used_blood_amount) //use up some blood @@ -1518,7 +1521,8 @@ if(length(message) > max_length) message += "-" to_chat(src, "You ran out of blood to write with!") - + else + to_chat(src, "You daub '[message]' on [T] in shiny red lettering.") var/obj/effect/decal/cleanable/blood/writing/W = new(T) W.message = message W.add_fingerprint(src) @@ -1935,7 +1939,6 @@ Eyes need to have significantly high darksight to shine unless the mob has the X . += "---" .["Set Species"] = "?_src_=vars;setspecies=[UID()]" .["Make AI"] = "?_src_=vars;makeai=[UID()]" - .["Make Mask of Nar'sie"] = "?_src_=vars;makemask=[UID()]" .["Make cyborg"] = "?_src_=vars;makerobot=[UID()]" .["Make monkey"] = "?_src_=vars;makemonkey=[UID()]" .["Make alien"] = "?_src_=vars;makealien=[UID()]" diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 47dd5622379..cf9fcfd632c 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -1,11 +1,3 @@ -/mob/living/carbon/human/verb/quick_equip() - set name = "quick-equip" - set hidden = 1 - - var/obj/item/I = get_active_hand() - if(I) - I.equip_to_best_slot(src) - /mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = 1) for(var/slot in slots) if(equip_to_slot_if_possible(W, slots[slot], del_on_fail = 0)) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 85f491f71f0..438d3386948 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -341,9 +341,6 @@ if(SKELETON in target.mutations) to_chat(user, "There is no blood in a skeleton!") return - if(issmall(target) && !target.ckey) //Monkeyized humans are okay, humanized monkeys are okay, NPC monkeys are not. - to_chat(user, "Blood from a monkey is useless!") - return //we're good to suck the blood, blaah user.mind.vampire.handle_bloodsucking(target) add_attack_logs(user, target, "vampirebit") @@ -603,20 +600,37 @@ H.healthdoll.cached_healthdoll_overlays = new_overlays /datum/species/proc/handle_hud_icons_nutrition(mob/living/carbon/human/H) - switch(H.nutrition) - if(NUTRITION_LEVEL_FULL to INFINITY) - H.throw_alert("nutrition", /obj/screen/alert/fat) - if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) - H.throw_alert("nutrition", /obj/screen/alert/full) - if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) - H.throw_alert("nutrition", /obj/screen/alert/well_fed) - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) - H.throw_alert("nutrition", /obj/screen/alert/fed) - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - H.throw_alert("nutrition", /obj/screen/alert/hungry) - else - H.throw_alert("nutrition", /obj/screen/alert/starving) - return 1 + if(H.mind && H.mind.vampire && (H.mind in SSticker.mode.vampires)) //Vampires + switch(H.nutrition) + if(NUTRITION_LEVEL_FULL to INFINITY) + H.throw_alert("nutrition", /obj/screen/alert/fat/vampire) + if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) + H.throw_alert("nutrition", /obj/screen/alert/full/vampire) + if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) + H.throw_alert("nutrition", /obj/screen/alert/well_fed/vampire) + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) + H.throw_alert("nutrition", /obj/screen/alert/fed/vampire) + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + H.throw_alert("nutrition", /obj/screen/alert/hungry/vampire) + else + H.throw_alert("nutrition", /obj/screen/alert/starving/vampire) + return 1 + + else ///Any other non-vampires + switch(H.nutrition) + if(NUTRITION_LEVEL_FULL to INFINITY) + H.throw_alert("nutrition", /obj/screen/alert/fat) + if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) + H.throw_alert("nutrition", /obj/screen/alert/full) + if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) + H.throw_alert("nutrition", /obj/screen/alert/well_fed) + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) + H.throw_alert("nutrition", /obj/screen/alert/fed) + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + H.throw_alert("nutrition", /obj/screen/alert/hungry) + else + H.throw_alert("nutrition", /obj/screen/alert/starving) + return 1 /* Returns the path corresponding to the corresponding organ @@ -675,7 +689,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u H.see_invisible = G.invis_override else H.see_invisible = min(G.invis_view, H.see_invisible) - + if(!isnull(G.lighting_alpha)) H.lighting_alpha = min(G.lighting_alpha, H.lighting_alpha) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 276ee7b246e..4909148b492 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -59,8 +59,7 @@ handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc if(client) - //regular_hud_updates() //THIS DOESN'T FUCKING UPDATE SHIT - handle_regular_hud_updates() //IT JUST REMOVES FUCKING HUD IMAGES + handle_regular_hud_updates() ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 727c900ac9c..f9dba949b4b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -528,7 +528,7 @@ return var/pull_dir = get_dir(src, pulling) - if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) // puller and pullee more than one tile away or in diagonal position + if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) // puller and pullee more than one tile away or in diagonal position if(isliving(pulling)) var/mob/living/M = pulling if(M.lying && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth))) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 95b44b15862..be5187fac5b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -216,7 +216,7 @@ proc/get_radio_key_from_channel(var/channel) message_range = 1 if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet - italics = 1 + italics = TRUE sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact var/list/hear = hear(message_range, T) @@ -236,12 +236,20 @@ proc/get_radio_key_from_channel(var/channel) for(var/mob/M in GLOB.player_list) if(!M.client) - continue //skip monkeys and leavers + continue + if(isnewplayer(M)) continue - if(M.stat == DEAD && M.client && M.get_preference(CHAT_GHOSTEARS) && client) // client is so that ghosts don't have to listen to mice - listening |= M - continue + + if(isobserver(M)) + if(M.get_preference(CHAT_GHOSTEARS) && client) // The client check is so that ghosts don't have to listen to mice. + listening |= M + continue + + if(message_range < world.view && (get_dist(T, M) <= world.view)) + listening |= M + continue + if(get_turf(M) in hearturfs) listening |= M @@ -291,10 +299,13 @@ proc/get_radio_key_from_channel(var/channel) log_emote(message, src) for(var/mob/M in GLOB.dead_mob_list) - if(!M.client || istype(M, /mob/new_player)) - continue //skip monkeys, leavers and new players //who the hell knows why new players are in the dead mob list + if(!M.client) + continue //skip monkeys and leavers - if(M.stat == DEAD && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + if(isnewplayer(M)) + continue + + if(isobserver(M) && M.get_preference(CHAT_GHOSTSIGHT) && !(M in viewers(src, null)) && client) // The client check makes sure people with ghost sight don't get spammed by simple mobs emoting. M.show_message(message) switch(type) @@ -380,7 +391,7 @@ proc/get_radio_key_from_channel(var/channel) var/list/hearturfs = list() - //Pass whispers on to anything inside the immediate listeners. + // Pass whispers on to anything inside the immediate listeners. // This comes before the ghosts do so that ghosts don't act as whisper relays for(var/atom/L in listening) if(ismob(L)) @@ -391,22 +402,26 @@ proc/get_radio_key_from_channel(var/channel) if(isobj(L)) hearturfs += get_turf(L) - //ghosts - for(var/mob/M in GLOB.dead_mob_list) //does this include players who joined as observers as well? + // Loop through all players to see if they need to hear it. + for(var/mob/M in GLOB.player_list) if(!M.client) continue - if(M.stat == DEAD && M.client && M.get_preference(CHAT_GHOSTEARS)) - listening |= M - // This, in tandem with "hearturfs", lets nested mobs hear whispers that are in range - // Grifted from saycode above. - for(var/mob/M in GLOB.player_list) - if(!M.client || isnewplayer(M)) - continue //skip monkeys and leavers + if(isnewplayer(M)) + continue + + if(isobserver(M)) + if(M.get_preference(CHAT_GHOSTEARS)) // The client check is so that ghosts don't have to listen to mice. + listening |= M + continue + + if(message_range < world.view && (get_dist(whisper_loc, M) <= world.view)) + listening |= M + continue + if(get_turf(M) in hearturfs) listening |= M - //pass on the message to objects that can hear us. for(var/obj/O in view(message_range, whisper_loc)) spawn(0) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 80d644152f4..17fd47d560b 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -634,7 +634,7 @@ var/list/ai_verbs_default = list( return if(href_list["trackbot"]) - var/mob/living/simple_animal/bot/target = locate(href_list["trackbot"]) in GLOB.simple_animals + var/mob/living/simple_animal/bot/target = locate(href_list["trackbot"]) in GLOB.bots_list if(target) ai_actual_track(target) else @@ -642,7 +642,7 @@ var/list/ai_verbs_default = list( return if(href_list["callbot"]) //Command a bot to move to a selected location. - Bot = locate(href_list["callbot"]) in GLOB.simple_animals + Bot = locate(href_list["callbot"]) in GLOB.bots_list if(!Bot || Bot.remote_disabled || control_disabled) return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off. waypoint_mode = 1 @@ -650,7 +650,7 @@ var/list/ai_verbs_default = list( return if(href_list["interface"]) //Remotely connect to a bot! - Bot = locate(href_list["interface"]) in GLOB.simple_animals + Bot = locate(href_list["interface"]) in GLOB.bots_list if(!Bot || Bot.remote_disabled || control_disabled) return Bot.attack_ai(src) @@ -746,7 +746,7 @@ var/list/ai_verbs_default = list( d += "Query network status
" d += "" - for(var/mob/living/simple_animal/bot/Bot in GLOB.simple_animals) + for(var/mob/living/simple_animal/bot/Bot in GLOB.bots_list) if(is_ai_allowed(Bot.z) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected! bot_area = get_area(Bot) d += "" diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index d0262df743c..cf55cdd5f91 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -2,6 +2,3 @@ ..() regenerate_icons() show_laws(0) - - var/datum/hotkey_mode/cyborg/C = new(src) - C.set_winset_values() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 100dd1ffbba..131477d086e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -103,6 +103,9 @@ var/list/robot_verbs_default = list( var/datum/action/item_action/toggle_research_scanner/scanner = null var/list/module_actions = list() +/mob/living/silicon/robot/get_cell() + return cell + /mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0, var/alien = 0) spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(5, 0, src) @@ -1453,4 +1456,4 @@ var/list/robot_verbs_default = list( SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) sync_lighting_plane_alpha() - \ No newline at end of file + diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 4a8d8c48f5b..2cb9ddf6252 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -156,7 +156,6 @@ /mob/living/silicon/Stat() ..() if(statpanel("Status")) - show_stat_station_time() show_stat_emergency_shuttle_eta() show_system_integrity() diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 77eb74e5696..5feebb53059 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -594,7 +594,7 @@ var/robot_arm = /obj/item/robot_parts/l_arm qdel(src) /obj/item/honkbot_arm_assembly - name = "incomplete honkbot assembly." + name = "incomplete honkbot assembly" desc = "A clown box with a robot arm permanently grafted to it." icon = 'icons/obj/aibots.dmi' icon_state = "honkbot_arm" @@ -625,8 +625,8 @@ var/robot_arm = /obj/item/robot_parts/l_arm if(istype(W, /obj/item/instrument/trombone)) if(!user.unEquip(W)) return - to_chat(user, "You add the trombone to [src]! Heeeenk! ") + to_chat(user, "You add the trombone to [src]! Heeeenk!") qdel(W) - var/mob/living/simple_animal/bot/honkbot/A = new /mob/living/simple_animal/bot/honkbot(T) + var/mob/living/simple_animal/bot/honkbot/A = new /mob/living/simple_animal/bot/honkbot(get_turf(src)) A.robot_arm = robot_arm qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/griefsky.dm b/code/modules/mob/living/simple_animal/bot/griefsky.dm index 67c3780fac0..4dc50fca8f8 100644 --- a/code/modules/mob/living/simple_animal/bot/griefsky.dm +++ b/code/modules/mob/living/simple_animal/bot/griefsky.dm @@ -48,7 +48,7 @@ ..() light_color = LIGHT_COLOR_PURE_RED //if you see a red one. RUN!! -/mob/living/simple_animal/bot/secbot/griefsky/Crossed(atom/movable/AM) +/mob/living/simple_animal/bot/secbot/griefsky/Crossed(atom/movable/AM, oldloc) ..() if(ismob(AM) && AM == target) var/mob/living/carbon/C = AM diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 958f493e309..3499ae06649 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -37,7 +37,7 @@ . = ..() update_icon() auto_patrol = TRUE - var/datum/job/clown/J = new/datum/job/clown + var/datum/job/clown/J = new /datum/job/clown() access_card.access += J.get_access() prev_access = access_card.access @@ -298,7 +298,7 @@ target = user mode = BOT_HUNT -/mob/living/simple_animal/bot/honkbot/Crossed(atom/movable/AM) +/mob/living/simple_animal/bot/honkbot/Crossed(atom/movable/AM, oldloc) if(ismob(AM) && on) //only if its online if(prob(30)) //you're far more likely to trip on a honkbot var/mob/living/carbon/C = AM diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 49a3b2718db..1db149418c7 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -50,6 +50,9 @@ var/currentBloodColor = "#A10808" var/currentDNA = null +/mob/living/simple_animal/bot/mulebot/get_cell() + return cell + /mob/living/simple_animal/bot/mulebot/New() ..() wires = new /datum/wires/mulebot(src) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 14a72c43fac..ea559fdc597 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -439,7 +439,7 @@ Auto Patrol: []"}, target = user mode = BOT_HUNT -/mob/living/simple_animal/bot/secbot/Crossed(atom/movable/AM) +/mob/living/simple_animal/bot/secbot/Crossed(atom/movable/AM, oldloc) if(ismob(AM) && target) var/mob/living/carbon/C = AM if(!istype(C) || !C || in_range(src, target)) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index ab9253b96cc..d5fabe96be4 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -113,7 +113,7 @@ status_flags = 0 const_type = "juggernaut" mob_size = MOB_SIZE_LARGE - construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall) + construct_spells = list(/obj/effect/proc_holder/spell/targeted/night_vision, /obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall) force_threshold = 11 playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, \ create shield walls, rip apart enemies and walls alike, and even deflect energy weapons." @@ -171,7 +171,7 @@ see_in_dark = 8 attack_sound = 'sound/weapons/bladeslice.ogg' const_type = "wraith" - construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift) + construct_spells = list(/obj/effect/proc_holder/spell/targeted/night_vision, /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift) retreat_distance = 2 //AI wraiths will move in and out of combat playstyle_string = "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." @@ -202,7 +202,8 @@ minimum_distance = 10 //AI artificers will flee like fuck attack_sound = 'sound/weapons/punch2.ogg' const_type = "builder" - construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, + construct_spells = list(/obj/effect/proc_holder/spell/targeted/night_vision, + /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, /obj/effect/proc_holder/spell/aoe_turf/conjure/wall, /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, /obj/effect/proc_holder/spell/aoe_turf/conjure/pylon, @@ -311,7 +312,8 @@ see_in_dark = 8 attack_sound = 'sound/weapons/tap.ogg' const_type = "harvester" - construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall, + construct_spells = list(/obj/effect/proc_holder/spell/targeted/night_vision, + /obj/effect/proc_holder/spell/aoe_turf/conjure/wall, /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, /obj/effect/proc_holder/spell/targeted/smoke/disable) retreat_distance = 2 //AI harvesters will move in and out of combat, like wraiths, but shittier diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index 5be21c8646e..b52140922f1 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -24,7 +24,7 @@ /mob/living/simple_animal/cockroach/can_die() return ..() && !SSticker.cinematic //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. -/mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM) +/mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM, oldloc) if(isliving(AM)) var/mob/living/A = AM if(A.mob_size > MOB_SIZE_SMALL) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 4faa821701c..cbc125beeab 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -91,7 +91,7 @@ to_chat(src, "You are too small to pull anything.") return -/mob/living/simple_animal/mouse/Crossed(AM as mob|obj) +/mob/living/simple_animal/mouse/Crossed(AM as mob|obj, oldloc) if(ishuman(AM)) if(!stat) var/mob/M = AM diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index d1982ac359d..0aa148eb031 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/alien.dmi' icon_state = "alienh_running" icon_living = "alienh_running" - icon_dead = "alien_l" + icon_dead = "alienh_dead" icon_gib = "syndicate_gib" response_help = "pokes the" response_disarm = "shoves the" @@ -40,7 +40,7 @@ name = "alien drone" icon_state = "aliend_running" icon_living = "aliend_running" - icon_dead = "aliend_l" + icon_dead = "aliend_dead" health = 60 maxHealth = 60 melee_damage_lower = 15 @@ -61,7 +61,7 @@ name = "alien sentinel" icon_state = "aliens_running" icon_living = "aliens_running" - icon_dead = "aliens_l" + icon_dead = "aliens_dead" health = 120 maxHealth = 120 melee_damage_lower = 15 @@ -77,7 +77,7 @@ name = "alien queen" icon_state = "alienq_running" icon_living = "alienq_running" - icon_dead = "alienq_l" + icon_dead = "alienq_d" health = 250 maxHealth = 250 melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index 13c695387bd..5b97579b146 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -1,7 +1,6 @@ /mob/living/simple_animal/hostile/creature name = "creature" desc = "A sanity-destroying otherthing." - icon = 'icons/mob/critter.dmi' speak_emote = list("gibbers") icon_state = "otherthing" icon_living = "otherthing" diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm index 100225e0760..e34a5e0cb08 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm @@ -21,6 +21,7 @@ maxHealth = 50 health = 50 pixel_x = -16 + see_in_dark = 8 harm_intent_damage = 8 melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 5fd5b4e9231..7fd32bd71ec 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -1,265 +1,265 @@ -#define MINER_DASH_RANGE 4 - -/* - -BLOOD-DRUNK MINER - -Effectively a highly aggressive miner, the blood-drunk miner has very few attacks but compensates by being highly aggressive. - -The blood-drunk miner's attacks are as follows -- If not in KA range, it will rapidly dash at its target -- If in KA range, it will fire its kinetic accelerator -- If in melee range, will rapidly attack, akin to an actual player -- After any of these attacks, may transform its cleaving saw: - Untransformed, it attacks very rapidly for smaller amounts of damage - Transformed, it attacks at normal speed for higher damage and cleaves enemies hit - -When the blood-drunk miner dies, it leaves behind the cleaving saw it was using and its kinetic accelerator. - -Difficulty: Medium - -*/ - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner - name = "blood-drunk miner" - desc = "A miner destined to wander forever, engaged in an endless hunt." - health = 900 - maxHealth = 900 - icon_state = "miner" - icon_living = "miner" - icon = 'icons/mob/alienqueen.dmi' - light_color = "#E4C7C5" - speak_emote = list("roars") - speed = 1 - move_to_delay = 3 - projectiletype = /obj/item/projectile/kinetic/miner - projectilesound = 'sound/weapons/kenetic_accel.ogg' - ranged = 1 - ranged_cooldown_time = 16 - pixel_x = -16 - loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator) - wander = FALSE - del_on_death = TRUE - blood_volume = BLOOD_VOLUME_NORMAL - var/obj/item/melee/energy/cleaving_saw/miner/miner_saw - var/time_until_next_transform = 0 - var/dashing = FALSE - var/dash_cooldown = 15 - var/guidance = FALSE - deathmessage = "falls to the ground, decaying into glowing particles." - death_sound = "bodyfall" - -/obj/item/gps/internal/miner - icon_state = null - gpstag = "Resonant Signal" - desc = "The sweet blood, oh, it sings to me." - invisibility = 100 - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance - guidance = TRUE - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/hunter/AttackingTarget() - . = ..() - if(. && prob(12)) - INVOKE_ASYNC(src, .proc/dash) - -/obj/item/melee/energy/cleaving_saw/miner //nerfed saw because it is very murdery - force = 6 - force_on = 10 - -/obj/item/melee/energy/cleaving_saw/miner/attack(mob/living/target, mob/living/carbon/human/user) - target.add_stun_absorption("miner", 10, INFINITY) - ..() - target.stun_absorption -= "miner" - -/obj/item/projectile/kinetic/miner - damage = 20 - speed = 0.9 - icon_state = "ka_tracer" - range = MINER_DASH_RANGE - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize() - . = ..() - miner_saw = new(src) - internal_gps = new/obj/item/gps/internal/miner(src) - - // Add a zone selection UI; otherwise the mob can't melee attack properly. - zone_sel = new /obj/screen/zone_sel() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - var/adjustment_amount = amount * 0.1 - if(world.time + adjustment_amount > next_move) - changeNext_move(adjustment_amount) //attacking it interrupts it attacking, but only briefly - . = ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/death() - if(health > 0) - return - new /obj/effect/temp_visual/dir_setting/miner_death(loc, dir) - return ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Move(atom/newloc) - if(dashing || (newloc && newloc.z == z && (islava(newloc) || ischasm(newloc)))) //we're not stupid! - return FALSE - return ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/ex_act(severity, target) - if(dash()) - return - return ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/AttackingTarget() - if(QDELETED(target)) - return - if(next_move > world.time || !Adjacent(target)) //some cheating - INVOKE_ASYNC(src, .proc/quick_attack_loop) - return - face_atom(target) - if(isliving(target)) - var/mob/living/L = target - if(L.stat == DEAD) - visible_message("[src] butchers [L]!", - "You butcher [L], restoring your health!") - if(!is_station_level(z) || client) //NPC monsters won't heal while on station - if(guidance) - adjustHealth(-L.maxHealth) - else - adjustHealth(-(L.maxHealth * 0.5)) - L.gib() - return TRUE - changeNext_move(CLICK_CD_MELEE) - miner_saw.melee_attack_chain(src, target) - if(guidance) - adjustHealth(-2) - transform_weapon() - INVOKE_ASYNC(src, .proc/quick_attack_loop) - return TRUE - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) - if(!used_item && !isturf(A)) - used_item = miner_saw - ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/GiveTarget(new_target) - var/targets_the_same = (new_target == target) - . = ..() - if(. && target && !targets_the_same) - wander = TRUE - transform_weapon() - INVOKE_ASYNC(src, .proc/quick_attack_loop) - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/OpenFire() - Goto(target, move_to_delay, minimum_distance) - if(get_dist(src, target) > MINER_DASH_RANGE && dash_cooldown <= world.time) - INVOKE_ASYNC(src, .proc/dash, target) - else - shoot_ka() - transform_weapon() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/shoot_ka() - if(ranged_cooldown <= world.time && get_dist(src, target) <= MINER_DASH_RANGE && !Adjacent(target)) - ranged_cooldown = world.time + ranged_cooldown_time - visible_message("[src] fires the proto-kinetic accelerator!") - face_atom(target) - new /obj/effect/temp_visual/dir_setting/firing_effect(loc, dir) - Shoot(target) - changeNext_move(CLICK_CD_RANGE) - -//I'm still of the belief that this entire proc needs to be wiped from existence. -// do not take my touching of it to be endorsement of it. ~mso -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/quick_attack_loop() - while(!QDELETED(target) && next_move <= world.time) //this is done this way because next_move can change to be sooner while we sleep. - stoplag(1) - sleep((next_move - world.time) * 1.5) //but don't ask me what the fuck this is about - if(QDELETED(target)) - return - if(dashing || next_move > world.time || !Adjacent(target)) - if(dashing && next_move <= world.time) - next_move = world.time + 1 - INVOKE_ASYNC(src, .proc/quick_attack_loop) //lets try that again. - return - AttackingTarget() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/dash(atom/dash_target) - if(world.time < dash_cooldown) - return - var/list/accessable_turfs = list() - var/self_dist_to_target = 0 - var/turf/own_turf = get_turf(src) - if(!QDELETED(dash_target)) - self_dist_to_target += get_dist(dash_target, own_turf) - for(var/turf/simulated/O in RANGE_TURFS(MINER_DASH_RANGE, own_turf)) - var/turf_dist_to_target = 0 - if(!QDELETED(dash_target)) - turf_dist_to_target += get_dist(dash_target, O) - if(get_dist(src, O) >= MINER_DASH_RANGE && turf_dist_to_target <= self_dist_to_target && !islava(O) && !ischasm(O)) - var/valid = TRUE - for(var/turf/T in getline(own_turf, O)) - if(is_blocked_turf(T, TRUE)) - valid = FALSE - continue - if(valid) - accessable_turfs[O] = turf_dist_to_target - var/turf/target_turf - if(!QDELETED(dash_target)) - var/closest_dist = MINER_DASH_RANGE - for(var/t in accessable_turfs) - if(accessable_turfs[t] < closest_dist) - closest_dist = accessable_turfs[t] - for(var/t in accessable_turfs) - if(accessable_turfs[t] != closest_dist) - accessable_turfs -= t - if(!LAZYLEN(accessable_turfs)) - return - dash_cooldown = world.time + initial(dash_cooldown) - target_turf = pick(accessable_turfs) - var/turf/step_back_turf = get_step(target_turf, get_cardinal_dir(target_turf, own_turf)) - var/turf/step_forward_turf = get_step(own_turf, get_cardinal_dir(own_turf, target_turf)) - new /obj/effect/temp_visual/small_smoke/halfsecond(step_back_turf) - new /obj/effect/temp_visual/small_smoke/halfsecond(step_forward_turf) - var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc, src) - animate(D, alpha = 0, time = 5) - forceMove(step_back_turf) - playsound(own_turf, 'sound/weapons/punchmiss.ogg', 40, 1, -1) - dashing = TRUE - alpha = 0 - animate(src, alpha = 255, time = 5) - sleep(2) - D.forceMove(step_forward_turf) - forceMove(target_turf) - playsound(target_turf, 'sound/weapons/punchmiss.ogg', 40, 1, -1) - sleep(1) - dashing = FALSE - shoot_ka() - return TRUE - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/transform_weapon() - if(time_until_next_transform <= world.time) - miner_saw.transform_cooldown = 0 - miner_saw.transform_weapon(src, TRUE) - icon_state = "miner[miner_saw.active ? "_transformed":""]" - icon_living = "miner[miner_saw.active ? "_transformed":""]" - time_until_next_transform = world.time + rand(50, 100) - -/obj/effect/temp_visual/dir_setting/miner_death - icon_state = "miner_death" - duration = 15 - -/obj/effect/temp_visual/dir_setting/miner_death/Initialize(mapload, set_dir) - . = ..() - INVOKE_ASYNC(src, .proc/fade_out) - -/obj/effect/temp_visual/dir_setting/miner_death/proc/fade_out() - var/matrix/M = new - M.Turn(pick(90, 270)) - var/final_dir = dir - if(dir & (EAST|WEST)) //Facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass - - animate(src, transform = M, pixel_y = -6, dir = final_dir, time = 2, easing = EASE_IN|EASE_OUT) - sleep(5) - animate(src, color = list("#A7A19E", "#A7A19E", "#A7A19E", list(0, 0, 0)), time = 10, easing = EASE_IN, flags = ANIMATION_PARALLEL) - sleep(4) - animate(src, alpha = 0, time = 6, easing = EASE_OUT, flags = ANIMATION_PARALLEL) - +#define MINER_DASH_RANGE 4 + +/* + +BLOOD-DRUNK MINER + +Effectively a highly aggressive miner, the blood-drunk miner has very few attacks but compensates by being highly aggressive. + +The blood-drunk miner's attacks are as follows +- If not in KA range, it will rapidly dash at its target +- If in KA range, it will fire its kinetic accelerator +- If in melee range, will rapidly attack, akin to an actual player +- After any of these attacks, may transform its cleaving saw: + Untransformed, it attacks very rapidly for smaller amounts of damage + Transformed, it attacks at normal speed for higher damage and cleaves enemies hit + +When the blood-drunk miner dies, it leaves behind the cleaving saw it was using and its kinetic accelerator. + +Difficulty: Medium + +*/ + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner + name = "blood-drunk miner" + desc = "A miner destined to wander forever, engaged in an endless hunt." + health = 900 + maxHealth = 900 + icon_state = "miner" + icon_living = "miner" + icon = 'icons/mob/alienqueen.dmi' + light_color = "#E4C7C5" + speak_emote = list("roars") + speed = 1 + move_to_delay = 3 + projectiletype = /obj/item/projectile/kinetic/miner + projectilesound = 'sound/weapons/kenetic_accel.ogg' + ranged = 1 + ranged_cooldown_time = 16 + pixel_x = -16 + loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator) + wander = FALSE + del_on_death = TRUE + blood_volume = BLOOD_VOLUME_NORMAL + var/obj/item/melee/energy/cleaving_saw/miner/miner_saw + var/time_until_next_transform = 0 + var/dashing = FALSE + var/dash_cooldown = 15 + var/guidance = FALSE + deathmessage = "falls to the ground, decaying into glowing particles." + death_sound = "bodyfall" + +/obj/item/gps/internal/miner + icon_state = null + gpstag = "Resonant Signal" + desc = "The sweet blood, oh, it sings to me." + invisibility = 100 + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance + guidance = TRUE + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/hunter/AttackingTarget() + . = ..() + if(. && prob(12)) + INVOKE_ASYNC(src, .proc/dash) + +/obj/item/melee/energy/cleaving_saw/miner //nerfed saw because it is very murdery + force = 6 + force_on = 10 + +/obj/item/melee/energy/cleaving_saw/miner/attack(mob/living/target, mob/living/carbon/human/user) + target.add_stun_absorption("miner", 10, INFINITY) + ..() + target.stun_absorption -= "miner" + +/obj/item/projectile/kinetic/miner + damage = 20 + speed = 0.9 + icon_state = "ka_tracer" + range = MINER_DASH_RANGE + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize() + . = ..() + miner_saw = new(src) + internal_gps = new/obj/item/gps/internal/miner(src) + + // Add a zone selection UI; otherwise the mob can't melee attack properly. + zone_sel = new /obj/screen/zone_sel() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + var/adjustment_amount = amount * 0.1 + if(world.time + adjustment_amount > next_move) + changeNext_move(adjustment_amount) //attacking it interrupts it attacking, but only briefly + . = ..() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/death() + if(health > 0) + return + new /obj/effect/temp_visual/dir_setting/miner_death(loc, dir) + return ..() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Move(atom/newloc) + if(dashing || (newloc && newloc.z == z && (islava(newloc) || ischasm(newloc)))) //we're not stupid! + return FALSE + return ..() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/ex_act(severity, target) + if(dash()) + return + return ..() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/AttackingTarget() + if(QDELETED(target)) + return + if(next_move > world.time || !Adjacent(target)) //some cheating + INVOKE_ASYNC(src, .proc/quick_attack_loop) + return + face_atom(target) + if(isliving(target)) + var/mob/living/L = target + if(L.stat == DEAD) + visible_message("[src] butchers [L]!", + "You butcher [L], restoring your health!") + if(!is_station_level(z) || client) //NPC monsters won't heal while on station + if(guidance) + adjustHealth(-L.maxHealth) + else + adjustHealth(-(L.maxHealth * 0.5)) + L.gib() + return TRUE + changeNext_move(CLICK_CD_MELEE) + miner_saw.melee_attack_chain(src, target) + if(guidance) + adjustHealth(-2) + transform_weapon() + INVOKE_ASYNC(src, .proc/quick_attack_loop) + return TRUE + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) + if(!used_item && !isturf(A)) + used_item = miner_saw + ..() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/GiveTarget(new_target) + var/targets_the_same = (new_target == target) + . = ..() + if(. && target && !targets_the_same) + wander = TRUE + transform_weapon() + INVOKE_ASYNC(src, .proc/quick_attack_loop) + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/OpenFire() + Goto(target, move_to_delay, minimum_distance) + if(get_dist(src, target) > MINER_DASH_RANGE && dash_cooldown <= world.time) + INVOKE_ASYNC(src, .proc/dash, target) + else + shoot_ka() + transform_weapon() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/shoot_ka() + if(ranged_cooldown <= world.time && get_dist(src, target) <= MINER_DASH_RANGE && !Adjacent(target)) + ranged_cooldown = world.time + ranged_cooldown_time + visible_message("[src] fires the proto-kinetic accelerator!") + face_atom(target) + new /obj/effect/temp_visual/dir_setting/firing_effect(loc, dir) + Shoot(target) + changeNext_move(CLICK_CD_RANGE) + +//I'm still of the belief that this entire proc needs to be wiped from existence. +// do not take my touching of it to be endorsement of it. ~mso +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/quick_attack_loop() + while(!QDELETED(target) && next_move <= world.time) //this is done this way because next_move can change to be sooner while we sleep. + stoplag(1) + sleep((next_move - world.time) * 1.5) //but don't ask me what the fuck this is about + if(QDELETED(target)) + return + if(dashing || next_move > world.time || !Adjacent(target)) + if(dashing && next_move <= world.time) + next_move = world.time + 1 + INVOKE_ASYNC(src, .proc/quick_attack_loop) //lets try that again. + return + AttackingTarget() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/dash(atom/dash_target) + if(world.time < dash_cooldown) + return + var/list/accessable_turfs = list() + var/self_dist_to_target = 0 + var/turf/own_turf = get_turf(src) + if(!QDELETED(dash_target)) + self_dist_to_target += get_dist(dash_target, own_turf) + for(var/turf/simulated/O in RANGE_TURFS(MINER_DASH_RANGE, own_turf)) + var/turf_dist_to_target = 0 + if(!QDELETED(dash_target)) + turf_dist_to_target += get_dist(dash_target, O) + if(get_dist(src, O) >= MINER_DASH_RANGE && turf_dist_to_target <= self_dist_to_target && !islava(O) && !ischasm(O)) + var/valid = TRUE + for(var/turf/T in getline(own_turf, O)) + if(is_blocked_turf(T, TRUE)) + valid = FALSE + continue + if(valid) + accessable_turfs[O] = turf_dist_to_target + var/turf/target_turf + if(!QDELETED(dash_target)) + var/closest_dist = MINER_DASH_RANGE + for(var/t in accessable_turfs) + if(accessable_turfs[t] < closest_dist) + closest_dist = accessable_turfs[t] + for(var/t in accessable_turfs) + if(accessable_turfs[t] != closest_dist) + accessable_turfs -= t + if(!LAZYLEN(accessable_turfs)) + return + dash_cooldown = world.time + initial(dash_cooldown) + target_turf = pick(accessable_turfs) + var/turf/step_back_turf = get_step(target_turf, get_cardinal_dir(target_turf, own_turf)) + var/turf/step_forward_turf = get_step(own_turf, get_cardinal_dir(own_turf, target_turf)) + new /obj/effect/temp_visual/small_smoke/halfsecond(step_back_turf) + new /obj/effect/temp_visual/small_smoke/halfsecond(step_forward_turf) + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc, src) + animate(D, alpha = 0, time = 5) + forceMove(step_back_turf) + playsound(own_turf, 'sound/weapons/punchmiss.ogg', 40, 1, -1) + dashing = TRUE + alpha = 0 + animate(src, alpha = 255, time = 5) + sleep(2) + D.forceMove(step_forward_turf) + forceMove(target_turf) + playsound(target_turf, 'sound/weapons/punchmiss.ogg', 40, 1, -1) + sleep(1) + dashing = FALSE + shoot_ka() + return TRUE + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/transform_weapon() + if(time_until_next_transform <= world.time) + miner_saw.transform_cooldown = 0 + miner_saw.transform_weapon(src, TRUE) + icon_state = "miner[miner_saw.active ? "_transformed":""]" + icon_living = "miner[miner_saw.active ? "_transformed":""]" + time_until_next_transform = world.time + rand(50, 100) + +/obj/effect/temp_visual/dir_setting/miner_death + icon_state = "miner_death" + duration = 15 + +/obj/effect/temp_visual/dir_setting/miner_death/Initialize(mapload, set_dir) + . = ..() + INVOKE_ASYNC(src, .proc/fade_out) + +/obj/effect/temp_visual/dir_setting/miner_death/proc/fade_out() + var/matrix/M = new + M.Turn(pick(90, 270)) + var/final_dir = dir + if(dir & (EAST|WEST)) //Facing east or west + final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass + + animate(src, transform = M, pixel_y = -6, dir = final_dir, time = 2, easing = EASE_IN|EASE_OUT) + sleep(5) + animate(src, color = list("#A7A19E", "#A7A19E", "#A7A19E", list(0, 0, 0)), time = 10, easing = EASE_IN, flags = ANIMATION_PARALLEL) + sleep(4) + animate(src, alpha = 0, time = 6, easing = EASE_OUT, flags = ANIMATION_PARALLEL) + #undef MINER_DASH_RANGE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 6af11b10b14..6caee40ba80 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -526,7 +526,7 @@ Difficulty: Hard sleep(1.3) //slightly forgiving; the burst animation is 1.5 deciseconds bursting = FALSE //we no longer damage crossers -/obj/effect/temp_visual/hierophant/blast/Crossed(atom/movable/AM) +/obj/effect/temp_visual/hierophant/blast/Crossed(atom/movable/AM, oldloc) ..() if(bursting) do_damage(get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm index d73fe3ca77c..6e5c840a401 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm @@ -64,7 +64,7 @@ ..() /mob/living/simple_animal/hostile/asteroid/gutlunch/AttackingTarget() - if(is_type_in_list(target, wanted_objects)) //we eats + if(is_type_in_typecache(target, wanted_objects)) //we eats udder.generateMilk() regenerate_icons() visible_message("[src] slurps up [target].") diff --git a/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm b/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm index 2ee9c387140..c6bc205627e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm @@ -12,7 +12,7 @@ maxHealth = 250 max_mobs = 3 spawn_time = 300 //30 seconds default - mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril + mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril) spawn_text = "emerges from" atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 @@ -73,7 +73,7 @@ qdel(src) /mob/living/simple_animal/hostile/spawner/lavaland/goliath - mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril) /mob/living/simple_animal/hostile/spawner/lavaland/legion - mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril \ No newline at end of file + mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm new file mode 100644 index 00000000000..fc39035618e --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -0,0 +1,111 @@ +/mob/living/simple_animal/hostile/netherworld + name = "creature" + desc = "A sanity-destroying otherthing from the netherworld." + icon_state = "otherthing" + icon_living = "otherthing" + icon_dead = "otherthing-dead" + health = 80 + maxHealth = 80 + obj_damage = 100 + melee_damage_lower = 25 + melee_damage_upper = 50 + attacktext = "slashes" + attack_sound = 'sound/weapons/bladeslice.ogg' + faction = list("creature") + speak_emote = list("screams") + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + faction = list("nether") + +/mob/living/simple_animal/hostile/netherworld/migo + name = "mi-go" + desc = "A pinkish, fungoid crustacean-like creature with numerous pairs of clawed appendages and a head covered with waving antennae." + speak_emote = list("screams", "clicks", "chitters", "barks", "moans", "growls", "meows", "reverberates", "roars", "squeaks", "rattles", "exclaims", "yells", "remarks", "mumbles", "jabbers", "stutters", "seethes") + icon_state = "mi-go" + icon_living = "mi-go" + icon_dead = "mi-go-dead" + attacktext = "lacerates" + speed = -0.5 + var/static/list/migo_sounds + deathmessage = "wails as its form turns into a pulpy mush." + death_sound = 'sound/voice/hiss6.ogg' + +/mob/living/simple_animal/hostile/netherworld/migo/Initialize() + . = ..() + migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/voice/bcreep.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/mpatchedup.ogg', 'sound/voice/mfeelbetter.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heartbeat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/goonstation/effects/screech.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/goonstation/misc/airraid_loop.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/chainsaw.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshots/gunshot_silenced.ogg', 'sound/weapons/gunshots/gunshot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlock_close.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlock_open.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/poweroff.ogg', 'sound/ai/radiation.ogg', 'sound/ai/shuttlecalled.ogg', 'sound/ai/shuttledock.ogg', 'sound/ai/shuttlerecalled.ogg', 'sound/ai/aimalf.ogg') //hahahaha fuck you code divers + +/mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) + ..() + if(stat) + return + var/chosen_sound = pick(migo_sounds) + playsound(src, chosen_sound, 50, TRUE) + +/mob/living/simple_animal/hostile/netherworld/migo/Life() + ..() + if(stat) + return + if(prob(10)) + var/chosen_sound = pick(migo_sounds) + playsound(src, chosen_sound, 50, TRUE) + +/mob/living/simple_animal/hostile/netherworld/blankbody + name = "blank body" + desc = "This looks human enough, but its flesh has an ashy texture, and it's face is featureless save an eerie smile." + icon_state = "blank-body" + icon_living = "blank-body" + icon_dead = "blank-dead" + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID + health = 100 + maxHealth = 100 + melee_damage_lower = 5 + melee_damage_upper = 10 + attacktext = "punches" + deathmessage = "falls apart into a fine dust." + +/mob/living/simple_animal/hostile/spawner/nether + name = "netherworld link" + desc = null //see examine() + icon_state = "nether" + health = 50 + spawn_time = 600 //1 minute + max_mobs = 15 + icon = 'icons/mob/nest.dmi' + spawn_text = "crawls through" + mob_types = list(/mob/living/simple_animal/hostile/netherworld/migo, /mob/living/simple_animal/hostile/netherworld, /mob/living/simple_animal/hostile/netherworld/blankbody) + faction = list("nether") + +/mob/living/simple_animal/hostile/spawner/nether/Initialize() + .=..() + START_PROCESSING(SSprocessing, src) + +/mob/living/simple_animal/hostile/spawner/nether/examine(mob/user) + ..() + if(isskeleton(user)) + to_chat(user, "A direct link to another dimension full of creatures very happy to see you. You can see your house from here!") + else + to_chat(user, "A direct link to another dimension full of creatures not very happy to see you. Entering the link would be a very bad idea.") + +/mob/living/simple_animal/hostile/spawner/nether/attack_hand(mob/user) + . = ..() + if(isskeleton(user)) + to_chat(user, "You don't feel like going home yet...") + else + user.visible_message("[user] is violently pulled into the link!", \ + "Touching the portal, you are quickly pulled through into a world of unimaginable horror!") + contents.Add(user) + +/mob/living/simple_animal/hostile/spawner/nether/process() + for(var/mob/living/M in contents) + if(M) + playsound(src, 'sound/magic/demon_consume.ogg', 50, 1) + M.adjustBruteLoss(60) + new /obj/effect/gibspawner/generic(get_turf(M), M) + if(M.stat == DEAD) + var/mob/living/simple_animal/hostile/netherworld/blankbody/blank + blank = new(loc) + blank.name = "[M]" + blank.desc = "It's [M], but [M.p_their()] flesh has an ashy texture, and [M.p_their()] face is featureless save an eerie smile." + visible_message("[M] reemerges from the link!") + qdel(M) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 3f649eae984..2e1e7508e1c 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -189,35 +189,6 @@ L.EyeBlind(4) return -//Toggle Night Vision -/obj/effect/proc_holder/spell/targeted/night_vision - name = "Toggle Nightvision" - desc = "Toggle your nightvision mode." - - charge_max = 10 - clothes_req = 0 - - message = "You toggle your night vision!" - range = -1 - include_user = 1 - -/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets, mob/user = usr) - for(var/mob/living/target in targets) - switch(target.lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - target.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - name = "Toggle Nightvision \[More]" - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - target.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - name = "Toggle Nightvision \[Full]" - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - target.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE - name = "Toggle Nightvision \[OFF]" - else - target.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - name = "Toggle Nightvision \[ON]" - target.update_sight() - /mob/living/simple_animal/hostile/statue/sentience_act() faction -= "neutral" diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index f73ee07441a..5b82f8d35dd 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -202,7 +202,7 @@ var/global/list/ts_spiderling_list = list() var/obj/machinery/door/airlock/A = target if(A.density) try_open_airlock(A) - else if(isliving(target)) + else if(isliving(target) && (!client || a_intent == INTENT_HARM)) var/mob/living/G = target if(issilicon(G)) G.attack_animal(src) diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index e2c9194abc5..52ec406fcbd 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -36,7 +36,7 @@ desc = "A thick vine, painful to the touch." -/obj/effect/ebeam/vine/Crossed(atom/movable/AM) +/obj/effect/ebeam/vine/Crossed(atom/movable/AM, oldloc) if(isliving(AM)) var/mob/living/L = AM if(!("vines" in L.faction)) diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm index 38a9c176be7..747c7690150 100644 --- a/code/modules/mob/living/simple_animal/spawner.dm +++ b/code/modules/mob/living/simple_animal/spawner.dm @@ -7,7 +7,7 @@ var/max_mobs = 5 var/spawn_delay = 0 var/spawn_time = 300 //30 seconds default - var/mob_type = /mob/living/simple_animal/hostile/carp + var/mob_types = list(/mob/living/simple_animal/hostile/carp) var/spawn_text = "emerges from" status_flags = 0 move_resist = MOVE_FORCE_VERY_STRONG @@ -39,7 +39,8 @@ if(spawn_delay > world.time) return 0 spawn_delay = world.time + spawn_time - var/mob/living/simple_animal/L = new mob_type(src.loc) + var/chosen_type = pick(mob_types) + var/mob/living/simple_animal/L = new chosen_type(loc) L.admin_spawned = admin_spawned //If we were admin spawned, lets have our children count as that as well. spawned_mobs += L L.nest = src @@ -51,7 +52,7 @@ icon = 'icons/obj/device.dmi' icon_state = "syndbeacon" spawn_text = "warps in from" - mob_type = /mob/living/simple_animal/hostile/syndicate/ranged + mob_types = list(/mob/living/simple_animal/hostile/syndicate/ranged) faction = list("syndicate") /mob/living/simple_animal/hostile/spawner/mining @@ -64,21 +65,21 @@ max_mobs = 3 icon = 'icons/mob/nest.dmi' spawn_text = "crawls out of" - mob_type = /mob/living/simple_animal/hostile/asteroid/goldgrub + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) faction = list("mining") /mob/living/simple_animal/hostile/spawner/mining/goliath name = "goliath den" desc = "A den housing a nest of goliaths, oh god why?" - mob_type = /mob/living/simple_animal/hostile/asteroid/goliath + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath) /mob/living/simple_animal/hostile/spawner/mining/hivelord name = "hivelord den" desc = "A den housing a nest of hivelords." - mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord + mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord) /mob/living/simple_animal/hostile/spawner/mining/basilisk name = "basilisk den" desc = "A den housing a nest of basilisks, bring a coat." - mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk + mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c74d7545473..02cb948c5c9 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -2,6 +2,7 @@ GLOB.mob_list -= src GLOB.dead_mob_list -= src GLOB.living_mob_list -= src + focus = null QDEL_NULL(hud_used) if(mind && mind.current == src) spellremove(src) @@ -30,6 +31,7 @@ GLOB.dead_mob_list += src else GLOB.living_mob_list += src + set_focus(src) prepare_huds() ..() @@ -50,7 +52,6 @@ /mob/proc/GetAltName() return "" - /mob/proc/Cell() set category = "Admin" set hidden = 1 @@ -173,6 +174,7 @@ return 0 /mob/proc/Life(seconds, times_fired) + set waitfor = FALSE if(forced_look) if(!isnum(forced_look)) var/atom/A = locateUID(forced_look) @@ -691,9 +693,13 @@ var/list/slot_equipment_priority = list( \ msg = copytext(msg, 1, MAX_MESSAGE_LEN) msg = sanitize_simple(html_encode(msg), list("\n" = "
")) - - if(mind) + + var/combined = length(memory + msg) + if(mind && (combined < MAX_PAPER_MESSAGE_LEN)) mind.store_memory(msg) + else if(combined >= MAX_PAPER_MESSAGE_LEN) + to_chat(src, "Your brain can't hold that much information!") + return else to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.") @@ -988,6 +994,9 @@ var/list/slot_equipment_priority = list( \ statpanel("Status") // Switch to the Status panel again, for the sake of the lazy Stat procs + if(client && client.statpanel == "Status" && SSticker) + show_stat_station_time() + // this function displays the station time in the status panel /mob/proc/show_stat_station_time() stat(null, "Round Time: [worldtime2text()]") @@ -1361,5 +1370,19 @@ var/list/slot_equipment_priority = list( \ /mob/proc/sync_lighting_plane_alpha() if(hud_used) var/obj/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"] - if (L) + if(L) L.alpha = lighting_alpha + + sync_nightvision_screen() //Sync up the overlay used for nightvision to the amount of see_in_dark a mob has. This needs to be called everywhere sync_lighting_plane_alpha() is. + +/mob/proc/sync_nightvision_screen() + var/obj/screen/fullscreen/see_through_darkness/S = screens["see_through_darkness"] + if(S) + var/suffix = "" + switch(see_in_dark) + if(3 to 8) + suffix = "_[see_in_dark]" + if(8 to INFINITY) + suffix = "_8" + + S.icon_state = "[initial(S.icon_state)][suffix]" diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index beb474539f1..efda8f38863 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -399,9 +399,6 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) set name = "Rest" set category = "IC" - if(world.time < client.move_delay) - return - if(!resting) client.move_delay = world.time + 20 to_chat(src, "You are now resting.") @@ -485,6 +482,8 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) if(A) if(O.client.prefs && O.client.prefs.UI_style) A.icon = ui_style2icon(O.client.prefs.UI_style) + if(title) + A.name = title A.desc = message A.action = action A.target = source @@ -641,5 +640,26 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) // Cast to 1/0 return !!(client.prefs.toggles & toggleflag) +// Used to make sure that a player has a valid job preference setup, used to knock players out of eligibility for anything if their prefs don't make sense. +// A "valid job preference setup" in this situation means at least having one job set to low, or not having "return to lobby" enabled +// Prevents "antag rolling" by setting antag prefs on, all jobs to never, and "return to lobby if preferences not availible" +// Doing so would previously allow you to roll for antag, then send you back to lobby if you didn't get an antag role +// This also does some admin notification and logging as well +/mob/proc/has_valid_preferences() + if(!client) + return FALSE //Not sure how this would get run without the mob having a client, but let's just be safe. + if(client.prefs.alternate_option != RETURN_TO_LOBBY) + return TRUE + // If they have antags enabled, they're potentially doing this on purpose instead of by accident. Notify admins if so. + var/has_antags = FALSE + if(client.prefs.be_special.len > 0) + has_antags = TRUE + if(!client.prefs.check_any_job()) + to_chat(src, "You have no jobs enabled, along with return to lobby if job is unavailable. This makes you ineligible for any round start role, please update your job preferences.") + if(has_antags) + log_admin("[src.ckey] just got booted back to lobby with no jobs, but antags enabled.") + message_admins("[src.ckey] just got booted back to lobby with no jobs enabled, but antag rolling enabled. Likely antag rolling abuse.") + return FALSE //This is the only case someone should actually be completely blocked from antag rolling as well + return TRUE #define isterrorspider(A) (istype((A), /mob/living/simple_animal/hostile/poison/terror_spider)) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index f26961eace9..47909a5d0b9 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -15,102 +15,6 @@ return 1 return (!mover.density || !density || lying) -//The byond version of these verbs wait for the next tick before acting. -// instant verbs however can run mid tick or even during the time between ticks. -#define DO_MOVE(this_dir) var/final_dir = turn(this_dir, -dir2angle(dir)); Move(get_step(mob, final_dir), final_dir); - -/client/verb/moveup() - set name = ".moveup" - set instant = 1 - DO_MOVE(NORTH) - -/client/verb/movedown() - set name = ".movedown" - set instant = 1 - DO_MOVE(SOUTH) - -/client/verb/moveright() - set name = ".moveright" - set instant = 1 - DO_MOVE(EAST) - -/client/verb/moveleft() - set name = ".moveleft" - set instant = 1 - DO_MOVE(WEST) - -#undef DO_MOVE - -/client/Northeast() - swap_hand() - return - - -/client/Southeast() - attack_self() - return - - -/client/Southwest() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.toggle_throw_mode() - else if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - var/module = R.get_selected_module() - if(!module) - to_chat(usr, "You have no module selected.") - return - R.cycle_modules() - R.uneq_numbered(module) - else - to_chat(usr, "This mob type cannot throw items.") - return - - -/client/Northwest() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!C.get_active_hand()) - to_chat(usr, "You have nothing to drop in your hand.") - return - drop_item() - else if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - if(!R.get_selected_module()) - to_chat(usr, "You have no module selected.") - return - R.deselect_module(R.get_selected_module()) - else - to_chat(usr, "This mob type cannot drop items.") - return - -//This gets called when you press the delete button. -/client/verb/delete_key_pressed() - set hidden = 1 - - if(!usr.pulling) - to_chat(usr, "You are not pulling anything.") - return - usr.stop_pulling() - -/client/verb/swap_hand() - set hidden = 1 - if(istype(mob, /mob/living/carbon)) - mob:swap_hand() - if(istype(mob,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = mob - R.cycle_modules() - return - - - -/client/verb/attack_self() - set hidden = 1 - if(mob) - mob.mode() - return - /client/verb/toggle_throw_mode() set hidden = 1 @@ -128,7 +32,7 @@ return -/client/Center() +/* /client/Center() /* No 3D movement in 2D spessman game. dir 16 is Z Up if(isobj(mob.loc)) var/obj/O = mob.loc @@ -136,7 +40,7 @@ return O.relaymove(mob, 16) */ return - + */ /client/proc/Move_object(direct) @@ -155,11 +59,17 @@ /client/Move(n, direct) if(world.time < move_delay) return + else + next_move_dir_add = 0 + next_move_dir_sub = 0 var/old_move_delay = move_delay move_delay = world.time + world.tick_lag //this is here because Move() can now be called multiple times per tick if(!mob || !mob.loc) return 0 + if(!n || !direct) // why did we never check this before? + return FALSE + if(mob.notransform) return 0 //This is sota the goto stop mobs from moving var @@ -226,9 +136,9 @@ moving = 1 var/delay = mob.movement_delay() if(old_move_delay + (delay * MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time) - move_delay = old_move_delay + delay + move_delay = old_move_delay else - move_delay = delay + world.time + move_delay = world.time mob.last_movement = world.time if(locate(/obj/item/grab, mob)) @@ -264,19 +174,29 @@ return else if(mob.confused) - step(mob, pick(cardinal)) - else - . = ..() + var/newdir = 0 + if(mob.confused > 40) + newdir = pick(alldirs) + else if(prob(mob.confused * 1.5)) + newdir = angle2dir(dir2angle(direct) + pick(90, -90)) + else if(prob(mob.confused * 3)) + newdir = angle2dir(dir2angle(direct) + pick(45, -45)) + if(newdir) + direct = newdir + n = get_step(mob, direct) + . = ..() mob.setDir(direct) for(var/obj/item/grab/G in mob) if(G.state == GRAB_NECK) - mob.setDir(reverse_dir[direct]) + mob.setDir(angle2dir((dir2angle(direct) + 202.5) % 365)) G.adjust_position() for(var/obj/item/grab/G in mob.grabbed_by) G.adjust_position() - + if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully + delay = mob.movement_delay() * 2 + move_delay += delay moving = 0 if(mob && .) if(mob.throwing) @@ -461,3 +381,123 @@ /mob/proc/update_gravity() return +/client/proc/check_has_body_select() + return mob && mob.hud_used && mob.zone_sel && istype(mob.zone_sel, /obj/screen/zone_sel) + +/client/verb/body_toggle_head() + set name = "body-toggle-head" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/next_in_line + switch(mob.zone_sel.selecting) + if(BODY_ZONE_HEAD) + next_in_line = BODY_ZONE_PRECISE_EYES + if(BODY_ZONE_PRECISE_EYES) + next_in_line = BODY_ZONE_PRECISE_MOUTH + else + next_in_line = BODY_ZONE_HEAD + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_line, mob) + +/client/verb/body_r_arm() + set name = "body-r-arm" + set hidden = 1 + if(!check_has_body_select()) + return + + var/next_in_line + if(mob.zone_sel.selecting == BODY_ZONE_R_ARM) + next_in_line = BODY_ZONE_PRECISE_R_HAND + else + next_in_line = BODY_ZONE_R_ARM + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_line, mob) + +/client/verb/body_chest() + set name = "body-chest" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(BODY_ZONE_CHEST, mob) + +/client/verb/body_l_arm() + set name = "body-l-arm" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/next_in_line + if(mob.zone_sel.selecting == BODY_ZONE_L_ARM) + next_in_line = BODY_ZONE_PRECISE_L_HAND + else + next_in_line = BODY_ZONE_L_ARM + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_line, mob) + +/client/verb/body_r_leg() + set name = "body-r-leg" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/next_in_line + if(mob.zone_sel.selecting == BODY_ZONE_R_LEG) + next_in_line = BODY_ZONE_PRECISE_R_FOOT + else + next_in_line = BODY_ZONE_R_LEG + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_line, mob) + +/client/verb/body_groin() + set name = "body-groin" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob) + +/client/verb/body_l_leg() + set name = "body-l-leg" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/next_in_line + if(mob.zone_sel.selecting == BODY_ZONE_L_LEG) + next_in_line = BODY_ZONE_PRECISE_L_FOOT + else + next_in_line = BODY_ZONE_L_LEG + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_line, mob) + +/client/verb/toggle_walk_run() + set name = "toggle-walk-run" + set hidden = TRUE + set instant = TRUE + if(mob) + mob.toggle_move_intent(usr) + +/mob/proc/toggle_move_intent(mob/user) + if(m_intent == MOVE_INTENT_RUN) + m_intent = MOVE_INTENT_WALK + else + m_intent = MOVE_INTENT_RUN + if(hud_used && hud_used.static_inventory) + for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) + selector.update_icon(src) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a87cbf6c8d3..47a4e4a5d0e 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -136,8 +136,6 @@ ..() statpanel("Status") - if(client.statpanel == "Status" && SSticker) - show_stat_station_time() /mob/new_player/Topic(href, href_list[]) diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index 0a7955cfe52..27c81d48190 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -26,6 +26,10 @@ return battery_module.battery.give(amount) return 0 +/obj/item/modular_computer/get_cell() + var/obj/item/computer_hardware/battery/battery_module = all_components[MC_CELL] + if(battery_module && battery_module.battery) + return battery_module.battery // Used in following function to reduce copypaste /obj/item/modular_computer/proc/power_failure() diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index 65b4ef1f640..98f1ab5667e 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -8,6 +8,9 @@ var/obj/item/stock_parts/cell/battery = null device_type = MC_CELL +/obj/item/computer_hardware/battery/get_cell() + return battery + /obj/item/computer_hardware/battery/New(loc, battery_type = null) if(battery_type) battery = new battery_type(src) diff --git a/code/modules/nano/modules/nano_module.dm b/code/modules/nano/modules/nano_module.dm index d33b59528f9..c62067bfaf8 100644 --- a/code/modules/nano/modules/nano_module.dm +++ b/code/modules/nano/modules/nano_module.dm @@ -1,6 +1,6 @@ /datum/nano_module var/name - var/host + var/datum/host /datum/nano_module/New(var/host) src.host = host @@ -8,5 +8,9 @@ /datum/nano_module/nano_host() return host ? host : src +/datum/nano_module/on_ui_close(mob/user) + if(host) + host.on_ui_close(user) + /datum/nano_module/proc/can_still_topic(var/datum/topic_state/state = default_state) return CanUseTopic(usr, state) == STATUS_INTERACTIVE diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/nanoexternal.dm index 6864c834f3a..8e7269972fd 100644 --- a/code/modules/nano/nanoexternal.dm +++ b/code/modules/nano/nanoexternal.dm @@ -40,6 +40,14 @@ /datum/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nano_ui/master_ui = null, var/datum/topic_state/state = default_state) return +/** + * The UI-close proc is called when the UI is closed. + * + * @param user /mob The mob who was interacting with this UI. + */ +/datum/proc/on_ui_close(mob/user) + return + /** * The ui_data proc is used to get data for the interface * diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 1dbdcc05b92..5bd0f3827ac 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -444,6 +444,8 @@ nanoui is used to open and update nano browser uis for(var/datum/nanoui/child in children) child.close() + src_object.on_ui_close(user) + /** * Set the UI window to call the nanoclose verb when the window is closed * This allows Nano to handle closed windows diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index dfd430a5754..6e550e64893 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -27,6 +27,9 @@ Contents: var/obj/item/clothing/mask/gas/space_ninja/suitMask var/mob/living/carbon/human/suitOccupant +/obj/item/clothing/suit/space/space_ninja/get_cell() + return suitCell + /obj/item/clothing/suit/space/space_ninja/proc/toggle_suit_lock(mob/living/carbon/human/user) if(!suitActive) if(!istype(user.wear_suit, /obj/item/clothing/suit/space/space_ninja)) diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm index ab6250a2b0f..2a2683a2826 100644 --- a/code/modules/ninja/suit/suit_attackby.dm +++ b/code/modules/ninja/suit/suit_attackby.dm @@ -1,5 +1,3 @@ - - /obj/item/clothing/suit/space/space_ninja/attackby(obj/item/I, mob/U, params) if(U==suitOccupant)//Safety, in case you try doing this without wearing the suit/being the person with the suit. if(istype(I, /obj/item/stock_parts/cell)) @@ -21,4 +19,4 @@ else to_chat(U, "Procedure interrupted. Protocol terminated.") return - ..() \ No newline at end of file + ..() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 451687cd38c..23a37e06409 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -75,16 +75,19 @@ assets.send(user) var/data - if((!user.say_understands(null, GLOB.all_languages["Galactic Common"]) && !forceshow) || forcestars) //assuming all paper is written in common is better than hardcoded type checks - data = "[name][stars(info)][stamps]" - if(view) - usr << browse(data, "window=[name];size=[paper_width]x[paper_height]") - onclose(usr, "[name]") + var/stars = (!user.say_understands(null, GLOB.all_languages["Galactic Common"]) && !forceshow) || forcestars + if(stars) //assuming all paper is written in common is better than hardcoded type checks + data = "[stars(info)][stamps]" else - data = "[name][infolinks ? info_links : info][stamps]" - if(view) - usr << browse(data, "window=[name];size=[paper_width]x[paper_height]") - onclose(usr, "[name]") + data = "
[infolinks ? info_links : info]
[stamps]" + if(view) + var/datum/browser/popup = new(user, name, , paper_width, paper_height) + popup.stylesheets = list() + popup.set_content(data) + if(!stars) + popup.add_script("marked.js", 'html/browser/marked.js') + popup.add_head_content("[name]") + popup.open() return data /obj/item/paper/verb/rename() diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm index 67ccf48df8a..ab97c956d85 100644 --- a/code/modules/pda/messenger.dm +++ b/code/modules/pda/messenger.dm @@ -169,10 +169,18 @@ if(useTC != 2) // Does our recipient have a broadcaster on their level? to_chat(U, "ERROR: Cannot reach recipient.") return + useMS.send_pda_message("[P.owner]","[pda.owner]","[t]") tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]"))) PM.tnote.Add(list(list("sent" = 0, "owner" = "[pda.owner]", "job" = "[pda.ownjob]", "message" = "[t]", "target" = "\ref[pda]"))) pda.investigate_log("PDA Message - [U.key] - [pda.owner] -> [P.owner]: [t]", "pda") + + // Show it to ghosts + for(var/mob/M in GLOB.dead_mob_list) + if(isobserver(M) && M.client && (M.client.prefs.toggles & CHAT_GHOSTPDA)) + var/ghost_message = "[pda.owner] ([ghost_follow_link(pda, ghost=M)]) PDA Message --> [P.owner] ([ghost_follow_link(P, ghost=M)]): [t]" + to_chat(M, "[ghost_message]") + if(!conversations.Find("\ref[P]")) conversations.Add("\ref[P]") if(!PM.conversations.Find("\ref[pda]")) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a69ff2a793b..7b3162fdefb 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -135,6 +135,9 @@ usesound = 'sound/items/deconstruct.ogg' toolspeed = 1 +/obj/machinery/power/apc/get_cell() + return cell + /obj/machinery/power/apc/connect_to_network() //Override because the APC does not directly connect to the network; it goes through a terminal. //The terminal is what the power computer looks for anyway. diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 4719ff75261..33b423c6360 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -19,6 +19,9 @@ var/ratingdesc = TRUE var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it. +/obj/item/stock_parts/cell/get_cell() + return src + /obj/item/stock_parts/cell/New() ..() START_PROCESSING(SSobj, src) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 8b5f64e94fb..388b523518b 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -46,7 +46,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 // You aren't allowed to move. /obj/machinery/gravity_generator/Move() - ..() + . = ..() qdel(src) /obj/machinery/gravity_generator/proc/set_broken() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 6c8eba8fb62..89e37b88c5c 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -33,11 +33,10 @@ return 0 -/obj/machinery/field/containment/Crossed(mob/mover) +/obj/machinery/field/containment/Crossed(mob/mover, oldloc) if(isliving(mover)) shock_field(mover) -/obj/machinery/field/containment/Crossed(obj/mover) if(istype(mover, /obj/machinery) || istype(mover, /obj/structure) || istype(mover, /obj/mecha)) bump_field(mover) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 420a112c352..b2f172deb72 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -287,7 +287,7 @@ field_generator power level display fields += CF G.fields += CF for(var/mob/living/L in T) - CF.Crossed(L) + CF.Crossed(L, null) connected_gens |= G G.connected_gens |= src diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 2b6695b9e85..befb2a4931a 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -39,7 +39,7 @@ var/obj/singularity/S = A S.energy += energy -/obj/effect/accelerated_particle/Crossed(atom/A) +/obj/effect/accelerated_particle/Crossed(atom/A, oldloc) if(isliving(A)) toxmob(A) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index c6c6de434c2..62d52c587c9 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -144,7 +144,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin /obj/structure/particle_accelerator/Move() - ..() + . = ..() if(master && master.active) master.toggle_power() investigate_log("was moved whilst active; it powered down.","singulo") diff --git a/code/modules/power/supermatter/sm_shard.dm b/code/modules/power/supermatter/sm_shard.dm index 1d946fee0c8..c5d7549e0a7 100644 --- a/code/modules/power/supermatter/sm_shard.dm +++ b/code/modules/power/supermatter/sm_shard.dm @@ -41,7 +41,7 @@ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) return ..() -/obj/item/shard/supermatter/Crossed(AM as mob|obj) +/obj/item/shard/supermatter/Crossed(AM as mob|obj, oldloc) if(ismob(AM)) var/mob/M = AM to_chat(M, "You step on \the [src]!") diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index 1548738f3f5..36f3ac15df4 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -25,7 +25,7 @@ /obj/machinery/power/treadmill/update_icon() icon_state = speed ? "conveyor-1" : "conveyor0" -/obj/machinery/power/treadmill/Crossed(mob/living/M) +/obj/machinery/power/treadmill/Crossed(mob/living/M, oldloc) if(anchored && !M.anchored) if(!istype(M) || M.dir != dir) throw_off(M) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index b25420b5491..cbc230c1e98 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -23,6 +23,9 @@ power_supply.use(round(power_supply.charge / severity)) update_icon() +/obj/item/gun/energy/get_cell() + return power_supply + /obj/item/gun/energy/New() ..() if(cell_type) diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index a1677b764e0..618315bea6e 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -1,6 +1,6 @@ /obj/item/gun/medbeam name = "Medical Beamgun" - desc = "Delivers medical nanites in a focused beam." + desc = "Delivers volatile medical nanites in a focused beam. Don't cross the beams!" icon = 'icons/obj/chronos.dmi' icon_state = "chronogun" item_state = "chronogun" @@ -92,6 +92,7 @@ return 0 for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams! if(B.owner != current_beam) + turf.visible_message("The medbeams cross and EXPLODE!") explosion(B.loc,0,3,5,8) qdel(dummy) return 0 diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 647c690a40d..3cba868a379 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -299,6 +299,18 @@ user.apply_damage(300, BRUTE, affecting) user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!") +/obj/item/gun/projectile/revolver/russian/soul + name = "cursed Russian revolver" + desc = "To play with this revolver requires wagering your very soul." + +/obj/item/gun/projectile/revolver/russian/soul/shoot_self(mob/living/user) + ..() + var/obj/item/soulstone/anybody/SS = new /obj/item/soulstone/anybody(get_turf(src)) + if(!SS.transfer_soul("FORCE", user)) //Something went wrong + qdel(SS) + return + user.visible_message("[user.name]'s soul is captured by \the [src]!", "You've lost the gamble! Your soul is forfeit!") + /obj/item/gun/projectile/revolver/capgun name = "cap gun" desc = "Looks almost like the real thing! Ages 8 and up." diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm index bf101cd49c3..9c87f7949a9 100644 --- a/code/modules/projectiles/guns/throw/crossbow.dm +++ b/code/modules/projectiles/guns/throw/crossbow.dm @@ -22,6 +22,9 @@ var/obj/item/stock_parts/cell/cell = null // Used for firing superheated rods. var/list/possible_tensions = list(XBOW_TENSION_20, XBOW_TENSION_40, XBOW_TENSION_60, XBOW_TENSION_80, XBOW_TENSION_FULL) +/obj/item/gun/throw/crossbow/get_cell() + return cell + /obj/item/gun/throw/crossbow/emp_act(severity) if(cell && severity) emp_act(severity) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 949983d45ba..a8d368d6aef 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -281,7 +281,7 @@ Range() sleep(1) -obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it. +obj/item/projectile/Crossed(atom/movable/AM, oldloc) //A mob moving on a tile with a projectile is hit by it. ..() if(isliving(AM) && AM.density && !checkpass(PASSMOB)) Bump(AM, 1) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 20ecaff13d4..7c53761a70f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -24,6 +24,9 @@ var/hack_message = "You disable the safety safeguards, enabling the \"Mad Scientist\" mode." var/unhack_message = "You re-enable the safety safeguards, enabling the \"NT Standard\" mode." +/obj/machinery/chem_dispenser/get_cell() + return cell + /obj/machinery/chem_dispenser/New() ..() component_parts = list() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 7c36334f78d..870ef8cf76a 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -135,12 +135,11 @@ return else if(href_list["empty_beaker"]) beaker.reagents.clear_reagents() + eject_beaker() updateUsrDialog() return else if(href_list["eject"]) - beaker:loc = loc - beaker = null - icon_state = "mixer0" + eject_beaker() updateUsrDialog() return else if(href_list["clear"]) @@ -173,6 +172,11 @@ add_fingerprint(usr) +/obj/machinery/computer/pandemic/proc/eject_beaker() + beaker.forceMove(loc) + beaker = null + icon_state = "mixer0" + //Prints a nice virus release form. Props to Urbanliner for the layout /obj/machinery/computer/pandemic/proc/print_form(var/datum/disease/advance/D, mob/living/user) D = archive_diseases[D.GetDiseaseID()] @@ -308,7 +312,7 @@ dat += "nothing
" else dat += "nothing
" - dat += "
Eject beaker[((R.total_volume&&R.reagent_list.len) ? "-- Empty beaker":"")]
" + dat += "
Eject beaker[((R.total_volume&&R.reagent_list.len) ? "-- Empty and eject beaker":"")]
" dat += "Close" var/datum/browser/popup = new(user, "pandemic", name, 575, 400) diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index 6c22360face..6dde9d2a4ec 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -115,6 +115,24 @@ update_flags |= M.adjustToxLoss(1, FALSE) return list(0, update_flags) +/datum/reagent/consumable/ethanol/hooch + name = "Hooch" + id = "hooch" + description = "Either someone's failure at cocktail making or attempt in alcohol production. In any case, do you really want to drink that?" + color = "#664300" // rgb: 102, 67, 0 + dizzy_adj = 7 + alcohol_perc = 1 + drink_icon = "glass_brown2" + drink_name = "Hooch" + drink_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + taste_message = "pure resignation" + +/datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M) + if(M.mind && M.mind.assigned_role == "Assistant") + M.heal_organ_damage(1, 1) + . = 1 + return ..() || . + /datum/reagent/consumable/ethanol/rum name = "Rum" id = "rum" @@ -1361,3 +1379,15 @@ taste_message = flavor if(holder.my_atom) holder.my_atom.on_reagent_change() + +/datum/reagent/consumable/ethanol/bacchus_blessing //An EXTREMELY powerful drink. Smashed in seconds, dead in minutes. + name = "Bacchus' Blessing" + id = "bacchus_blessing" + description = "Unidentifiable mixture. Unmeasurably high alcohol content." + color = rgb(51, 19, 3) //Sickly brown + dizzy_adj = 21 + alcohol_perc = 3 //I warned you + drink_icon = "glass_brown2" + drink_name = "Bacchus' Blessing" + drink_desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?" + taste_message = "a wall of bricks" diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index a67f681973d..6f0c53730b4 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -815,7 +815,7 @@ var/update_flags = STATUS_UPDATE_NONE if(prob(5)) if(prob(10)) - update_flags |= M.adjustToxLoss(rand(2.4), FALSE) + update_flags |= M.adjustToxLoss(rand(2,4), FALSE) if(prob(7)) to_chat(M, "A horrible migraine overpowers you.") update_flags |= M.Stun(rand(2,5), FALSE) diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 345ac4a9c6f..77118450aaa 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -290,6 +290,11 @@ addiction_chance = 5 taste_message = "health" +/datum/reagent/medicine/omnizine/godblood + name = "Godblood" + description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power." + overdose_threshold = 150 + /datum/reagent/medicine/omnizine/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE update_flags |= M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE) diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 4cf50c9f661..8048c21a283 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -1174,3 +1174,14 @@ M.electrocute_act(rand(5, 20), "Teslium in their body", 1, TRUE) //Override because it's caused from INSIDE of you playsound(M, "sparks", 50, 1) return ..() + +/datum/reagent/gluttonytoxin + name = "Gluttony's Blessing" + id = "gluttonytoxin" + description = "An advanced corruptive toxin produced by something terrible." + reagent_state = LIQUID + color = "#5EFF3B" //RGB: 94, 255, 59 + taste_message = "decay" + +/datum/reagent/gluttonytoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume) + L.ForceContractDisease(new /datum/disease/transformation/morph()) diff --git a/code/modules/reagents/chemistry/recipes/drinks.dm b/code/modules/reagents/chemistry/recipes/drinks.dm index 2f3eda996b0..5d088bd9ccb 100644 --- a/code/modules/reagents/chemistry/recipes/drinks.dm +++ b/code/modules/reagents/chemistry/recipes/drinks.dm @@ -851,4 +851,20 @@ required_reagents = list("rum" = 5, "cream" = 5, "egg" = 5) result_amount = 15 mix_message = "The eggs nog together. Pretend that \"nog\" is a verb." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' \ No newline at end of file + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/hooch + name = "Hooch" + id = "hooch" + result = "hooch" + required_reagents = list("ethanol" = 2, "fuel" = 1) + result_amount = 3 + required_catalysts = list("enzyme" = 1) + +/datum/chemical_reaction/bacchus_blessing + name = "Bacchus' Blessing" + id = "bacchus_blessing" + result = "bacchus_blessing" + required_reagents = list("hooch" = 1, "absinthe" = 1, "manlydorf" = 1, "syndicatebomb" = 1) + result_amount = 4 + mix_message = "The mixture turns to a sickening froth." \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 17d68f7e607..d408db7f2f0 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -73,7 +73,7 @@ if(user.a_intent == INTENT_HARM) M.visible_message("[user] splashes the contents of [src] onto [M]!", \ "[user] splashes the contents of [src] onto [M]!") - add_attack_logs(M, user, "Splashed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL) + add_attack_logs(user, M, "Splashed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL) if(!iscarbon(user)) M.LAssailant = null else @@ -90,11 +90,12 @@ if(!reagents || !reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding M.visible_message("[user] feeds something to [M].", "[user] feeds something to you.") - add_attack_logs(M, user, "Fed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL) + add_attack_logs(user, M, "Fed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL) else to_chat(user, "You swallow a gulp of [src].") - reagents.reaction(M, INGEST) + var/fraction = min(5 / reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) else @@ -246,9 +247,9 @@ if(assembly) assembly.HasProximity(AM) -/obj/item/reagent_containers/glass/beaker/Crossed(atom/movable/AM) +/obj/item/reagent_containers/glass/beaker/Crossed(atom/movable/AM, oldloc) if(assembly) - assembly.Crossed(AM) + assembly.Crossed(AM, oldloc) /obj/item/reagent_containers/glass/beaker/on_found(mob/finder) //for mousetraps if(assembly) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index e28ec4c0cff..0d3d4f17252 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -289,12 +289,6 @@ icon_state = "[rounded_vol]" item_state = "syringe_[rounded_vol]" - -//////////////////////////////////////////////////////////////////////////////// -/// Syringes. END -//////////////////////////////////////////////////////////////////////////////// - - /obj/item/reagent_containers/syringe/antiviral name = "Syringe (spaceacillin)" desc = "Contains antiviral agents." @@ -327,3 +321,10 @@ name = "bioterror syringe" desc = "Contains several paralyzing reagents." list_reagents = list("neurotoxin" = 5, "capulettium_plus" = 5, "sodium_thiopental" = 5) + +/obj/item/reagent_containers/syringe/gluttony + name = "Gluttony's Blessing" + desc = "A syringe recovered from a dread place. It probably isn't wise to use." + amount_per_transfer_from_this = 1 + volume = 1 + list_reagents = list("gluttonytoxin" = 1) \ No newline at end of file diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index b3c98f82b54..fc9d5d56134 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -187,9 +187,9 @@ if(rig) rig.HasProximity(AM) -/obj/structure/reagent_dispensers/fueltank/Crossed(atom/movable/AM) +/obj/structure/reagent_dispensers/fueltank/Crossed(atom/movable/AM, oldloc) if(rig) - rig.Crossed(AM) + rig.Crossed(AM, oldloc) /obj/structure/reagent_dispensers/fueltank/hear_talk(mob/living/M, list/message_pieces) if(rig) @@ -220,6 +220,7 @@ icon_state = "water_cooler" anchored = 1 tank_volume = 500 + reagent_id = "water" var/paper_cups = 25 //Paper cups left from the cooler /obj/structure/reagent_dispensers/water_cooler/examine(mob/user) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 5d3a3536d62..933f223d120 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -178,7 +178,7 @@ GLOBAL_LIST_INIT(conveyor_switches, list()) else if(still_stuff_to_move && !speed_process) makeSpeedProcess() -/obj/machinery/conveyor/Crossed(atom/movable/AM) +/obj/machinery/conveyor/Crossed(atom/movable/AM, oldloc) if(!speed_process && !AM.anchored) makeSpeedProcess() ..() diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 4c9ca937409..f7719c4fd54 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -692,11 +692,9 @@ // pipe is deleted // ensure if holder is present, it is expelled /obj/structure/disposalpipe/Destroy() - var/obj/structure/disposalholder/H = locate() in src - if(H) - // holder was present + for(var/obj/structure/disposalholder/H in contents) H.active = 0 - var/turf/T = src.loc + var/turf/T = loc if(T.density) // deleting pipe is inside a dense turf (wall) // this is unlikely, but just dump out everything into the turf in case @@ -709,8 +707,7 @@ return // otherwise, do normal expel from turf - if(H) - expel(H, T, 0) + expel(H, T, 0) return ..() /obj/structure/disposalpipe/singularity_pull(S, current_size) diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm index 6e485040715..eb0901b71e2 100644 --- a/code/modules/research/designs/equipment_designs.dm +++ b/code/modules/research/designs/equipment_designs.dm @@ -125,6 +125,7 @@ name = "Portable Seed Extractor" desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant." build_type = PROTOLATHE + id = "portaseeder" req_tech = list("biotech" = 3, "engineering" = 2) materials = list(MAT_METAL = 1000, MAT_GLASS = 400) build_path = /obj/item/storage/bag/plants/portaseeder diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index d945722770e..98a181bcdf8 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -101,7 +101,7 @@ materials = list(MAT_METAL = 1000, MAT_GLASS = 500) construction_time = 75 build_path = /obj/item/mmi - category = list("Misc","Medical") + category = list("Medical") /datum/design/robotic_brain name = "Robotic Brain" @@ -112,7 +112,7 @@ materials = list(MAT_METAL = 1700, MAT_GLASS = 1350, MAT_GOLD = 500) //Gold, because SWAG. construction_time = 75 build_path = /obj/item/mmi/robotic_brain - category = list("Misc","Medical") + category = list("Medical") /datum/design/mmi_radio_upgrade name = "Man-Machine Interface Radio Upgrade" @@ -123,7 +123,7 @@ materials = list(MAT_METAL = 200) construction_time = 50 build_path = /obj/item/mmi_radio_upgrade - category = list("Misc","Medical") + category = list("Medical") /datum/design/nanopaste name = "Nanopaste" @@ -288,7 +288,7 @@ construction_time = 40 materials = list(MAT_METAL = 600, MAT_GLASS = 400) build_path = /obj/item/organ/internal/cyberimp/eyes/shield - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_breather name = "Breathing Tube Implant" @@ -299,7 +299,7 @@ construction_time = 35 materials = list(MAT_METAL = 600, MAT_GLASS = 250) build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_surgical name = "Surgical Arm Implant" @@ -310,7 +310,7 @@ materials = list(MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500) construction_time = 200 build_path = /obj/item/organ/internal/cyberimp/arm/surgery - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_toolset name = "Toolset Arm Implant" @@ -321,7 +321,7 @@ materials = list(MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500) construction_time = 200 build_path = /obj/item/organ/internal/cyberimp/arm/toolset - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_diagnostic_hud name = "Diagnostic HUD implant" @@ -332,7 +332,7 @@ construction_time = 50 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 500) build_path = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_medical_hud name = "Medical HUD implant" @@ -343,7 +343,7 @@ construction_time = 50 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 500) build_path = /obj/item/organ/internal/cyberimp/eyes/hud/medical - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_security_hud name = "Security HUD implant" @@ -354,7 +354,7 @@ construction_time = 50 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 750, MAT_GOLD = 750) build_path = /obj/item/organ/internal/cyberimp/eyes/hud/security - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_meson name = "Meson scanner implant" @@ -365,7 +365,7 @@ construction_time = 50 materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500, MAT_GOLD = 300) build_path = /obj/item/organ/internal/cyberimp/eyes/meson - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_xray name = "X-Ray implant" @@ -376,7 +376,7 @@ 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 = 1000, MAT_BLUESPACE = 1000) build_path = /obj/item/organ/internal/cyberimp/eyes/xray - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_thermals name = "Thermals implant" @@ -387,7 +387,7 @@ 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/internal/cyberimp/eyes/thermals - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_antidrop name = "Anti-Drop implant" @@ -398,7 +398,7 @@ construction_time = 60 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 400, MAT_GOLD = 400) build_path = /obj/item/organ/internal/cyberimp/brain/anti_drop - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_antistun name = "CNS Rebooter implant" @@ -409,7 +409,7 @@ construction_time = 60 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 1000) build_path = /obj/item/organ/internal/cyberimp/brain/anti_stun - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_clownvoice name = "Comical implant" @@ -420,7 +420,7 @@ construction_time = 60 materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_BANANIUM = 200) build_path = /obj/item/organ/internal/cyberimp/brain/clown_voice - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_nutriment name = "Nutriment pump implant" @@ -431,7 +431,7 @@ construction_time = 40 materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_GOLD = 500) build_path = /obj/item/organ/internal/cyberimp/chest/nutriment - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_nutriment_plus name = "Nutriment pump implant PLUS" @@ -442,7 +442,7 @@ construction_time = 50 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_GOLD = 500, MAT_URANIUM = 750) build_path = /obj/item/organ/internal/cyberimp/chest/nutriment/plus - category = list("Misc", "Medical") + category = list("Medical") /datum/design/cyberimp_reviver name = "Reviver implant" @@ -453,7 +453,7 @@ construction_time = 60 materials = list(MAT_METAL = 800, MAT_GLASS = 800, MAT_GOLD = 300, MAT_URANIUM = 500) build_path = /obj/item/organ/internal/cyberimp/chest/reviver - category = list("Misc", "Medical") + category = list("Medical") ///////////////////////////////////////// ////////////Regular Implants///////////// @@ -508,6 +508,7 @@ req_tech = list("biotech" = 4, "materials" = 4) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 500, MAT_GLASS = 500) + construction_time = 60 build_path = /obj/item/organ/internal/eyes/cybernetic category = list("Medical") @@ -518,6 +519,7 @@ req_tech = list("biotech" = 4, "materials" = 4) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 500, MAT_GLASS = 500) + construction_time = 60 build_path = /obj/item/organ/internal/liver/cybernetic category = list("Medical") @@ -528,6 +530,7 @@ req_tech = list("biotech" = 4, "materials" = 4) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 500, MAT_GLASS = 500) + construction_time = 60 build_path = /obj/item/organ/internal/kidneys/cybernetic category = list("Medical") @@ -538,6 +541,7 @@ req_tech = list("biotech" = 4, "materials" = 4) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 500, MAT_GLASS = 500) + construction_time = 60 build_path = /obj/item/organ/internal/heart/cybernetic category = list("Medical") @@ -548,6 +552,7 @@ req_tech = list("biotech" = 5, "materials" = 5, "engineering" = 5) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500) + construction_time = 60 build_path = /obj/item/organ/internal/heart/cybernetic/upgraded category = list("Medical") @@ -558,6 +563,7 @@ req_tech = list("biotech" = 4, "materials" = 4) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 500, MAT_GLASS = 500) + construction_time = 60 build_path = /obj/item/organ/internal/lungs/cybernetic category = list("Medical") @@ -568,5 +574,6 @@ req_tech = list("biotech" = 5, "materials" = 5, "engineering" = 5) build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500) + construction_time = 60 build_path = /obj/item/organ/internal/lungs/cybernetic/upgraded category = list("Medical") diff --git a/code/modules/ruins/lavalandruin_code/dead_ratvar.dm b/code/modules/ruins/lavalandruin_code/dead_ratvar.dm new file mode 100644 index 00000000000..b634aba5c4c --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/dead_ratvar.dm @@ -0,0 +1,248 @@ +// Dead Ratvar +/obj/structure/dead_ratvar + name = "hulking wreck" + desc = "The remains of a monstrous war machine." + icon = 'icons/obj/lavaland/dead_ratvar.dmi' + icon_state = "dead_ratvar" + flags = ON_BORDER + appearance_flags = 0 + layer = FLY_LAYER + anchored = TRUE + density = TRUE + bound_width = 416 + bound_height = 64 + pixel_y = -10 + unacidable = TRUE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF + +// An "overlay" used by clockwork walls and floors to appear normal to mesons. +/obj/effect/clockwork/overlay + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + var/atom/linked + +/obj/effect/clockwork/overlay/examine(mob/user) + if(linked) + linked.examine(user) + +/obj/effect/clockwork/overlay/ex_act() + return FALSE + +/obj/effect/clockwork/overlay/singularity_act() + return +/obj/effect/clockwork/overlay/singularity_pull() + return + +/obj/effect/clockwork/overlay/singularity_pull(S, current_size) + return + +/obj/effect/clockwork/overlay/Destroy() + if(linked) + linked = null + . = ..() + +/obj/effect/clockwork/overlay/wall + name = "clockwork wall" + icon = 'icons/turf/walls/clockwork_wall.dmi' + icon_state = "clockwork_wall" + canSmoothWith = list(/obj/effect/clockwork/overlay/wall, /obj/structure/falsewall/brass) + smooth = SMOOTH_TRUE + layer = CLOSED_TURF_LAYER + +/obj/effect/clockwork/overlay/wall/Initialize(mapload) + . = ..() + queue_smooth_neighbors(src) + addtimer(CALLBACK(GLOBAL_PROC, .proc/queue_smooth, src), 1) + +/obj/effect/clockwork/overlay/wall/Destroy() + queue_smooth_neighbors(src) + return ..() + +/obj/effect/clockwork/overlay/floor + icon = 'icons/turf/floors.dmi' + icon_state = "clockwork_floor" + layer = TURF_LAYER + plane = FLOOR_PLANE + +/obj/effect/clockwork/overlay/floor/bloodcult //this is used by BLOOD CULT, it shouldn't use such a path... + icon_state = "cult" + +// Wall gears +//A massive gear, effectively a girder for clocks. +/obj/structure/clockwork/wall_gear + name = "massive gear" + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "wall_gear" + climbable = TRUE + max_integrity = 100 + can_deconstruct = TRUE + anchored = TRUE + density = TRUE + unacidable = TRUE + resistance_flags = FIRE_PROOF + desc = "A massive brass gear. You could probably secure or unsecure it with a wrench, or just climb over it." + +/obj/structure/clockwork/wall_gear/displaced + anchored = FALSE + +/obj/structure/clockwork/wall_gear/Initialize() + . = ..() + new /obj/effect/temp_visual/ratvar/gear(get_turf(src)) + +/obj/structure/clockwork/wall_gear/emp_act(severity) + return + +/obj/structure/clockwork/wall_gear/attackby(obj/item/I, mob/user, params) + if(iswrench(I)) + default_unfasten_wrench(user, I, 10) + return 1 + else if(isscrewdriver(I)) + if(anchored) + to_chat(user, "[src] needs to be unsecured to disassemble it!") + else + var/obj/item/screwdriver/S = I + user.visible_message("[user] starts to disassemble [src].", "You start to disassemble [src]...") + if(do_after(user, 30 * S.toolspeed, target = src) && !anchored) + playsound(loc, S.usesound, 50, 1) + to_chat(user, "You disassemble [src].") + deconstruct(TRUE) + return 1 + else if(istype(I, /obj/item/stack/tile/brass)) + var/obj/item/stack/tile/brass/W = I + if(W.get_amount() < 1) + to_chat(user, "You need one brass sheet to do this!") + return + var/turf/T = get_turf(src) + if(iswallturf(T)) + to_chat(user, "There is already a wall present!") + return + if(!isfloorturf(T)) + to_chat(user, "A floor must be present to build a [anchored ? "false ":""]wall!") + return + if(locate(/obj/structure/falsewall) in T.contents) + to_chat(user, "There is already a false wall present!") + return + to_chat(user, "You start adding [W] to [src]...") + if(do_after(user, 20, target = src)) + var/brass_floor = FALSE + if(istype(T, /turf/simulated/floor/clockwork)) //if the floor is already brass, costs less to make(conservation of masssssss) + brass_floor = TRUE + if(W.use(2 - brass_floor)) + if(anchored) + T.ChangeTurf(/turf/simulated/wall/clockwork) + else + T.ChangeTurf(/turf/simulated/floor/clockwork) + new /obj/structure/falsewall/brass(T) + qdel(src) + else + to_chat(user, "You need more brass to make a [anchored ? "false ":""]wall!") + return 1 + return ..() + +/obj/structure/clockwork/wall_gear/deconstruct(disassembled = TRUE) + if(can_deconstruct && disassembled) + new /obj/item/stack/tile/brass(loc, 3) + return ..() + +//Shards of Alloy, suitable only as a source of power for a replica fabricator. +/obj/item/clockwork/alloy_shards + name = "replicant alloy shards" + desc = "Broken shards of some oddly malleable metal. They occasionally move and seem to glow." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "alloy_shards" + resistance_flags = LAVA_PROOF | FIRE_PROOF + unacidable = TRUE + var/randomsinglesprite = FALSE + var/randomspritemax = 2 + var/sprite_shift = 9 + +/obj/item/clockwork/alloy_shards/Initialize() + . = ..() + if(randomsinglesprite) + replace_name_desc() + icon_state = "[icon_state][rand(1, randomspritemax)]" + pixel_x = rand(-sprite_shift, sprite_shift) + pixel_y = rand(-sprite_shift, sprite_shift) + +/obj/item/clockwork/alloy_shards/proc/replace_name_desc() + name = "replicant alloy shard" + desc = "A broken shard of some oddly malleable metal. It occasionally moves and seems to glow." + +/obj/item/clockwork/alloy_shards/clockgolem_remains + name = "clockwork golem scrap" + desc = "A pile of scrap metal. It seems damaged beyond repair." + icon_state = "clockgolem_dead" + sprite_shift = 0 + +/obj/item/clockwork/alloy_shards/large + w_class = WEIGHT_CLASS_TINY + randomsinglesprite = TRUE + icon_state = "shard_large" + sprite_shift = 9 + +/obj/item/clockwork/alloy_shards/medium + w_class = WEIGHT_CLASS_TINY + randomsinglesprite = TRUE + icon_state = "shard_medium" + sprite_shift = 10 + +/obj/item/clockwork/alloy_shards/medium/gear_bit + randomspritemax = 4 + icon_state = "gear_bit" + sprite_shift = 12 + +/obj/item/clockwork/alloy_shards/medium/gear_bit/replace_name_desc() + name = "gear bit" + desc = "A broken chunk of a gear. You want it." + +/obj/item/clockwork/alloy_shards/medium/gear_bit/large //gives more power + +/obj/item/clockwork/alloy_shards/medium/gear_bit/large/replace_name_desc() + ..() + name = "complex gear bit" + +/obj/item/clockwork/alloy_shards/small + w_class = WEIGHT_CLASS_TINY + randomsinglesprite = TRUE + randomspritemax = 3 + icon_state = "shard_small" + sprite_shift = 12 + +/obj/item/clockwork/alloy_shards/pinion_lock + name = "pinion lock" + desc = "A dented and scratched gear. It's very heavy." + icon_state = "pinion_lock" + +/obj/item/clockwork/component/belligerent_eye + name = "belligerent eye" + desc = "A brass construct with a rotating red center. It's as though it's looking for something to hurt." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "belligerent_eye" + +/obj/item/clockwork/component/belligerent_eye/blind_eye + name = "blind eye" + desc = "A heavy brass eye, its red iris fallen dark." + icon_state = "blind_eye" + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/clockwork/component/geis_capacitor/fallen_armor + name = "fallen armor" + desc = "Lifeless chunks of armor. They're designed in a strange way and won't fit on you." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "fallen_armor" + w_class = WEIGHT_CLASS_NORMAL + +//Ratvarian spear +/obj/item/clockwork/weapon/ratvarian_spear + name = "ratvarian spear" + desc = "A razor-sharp spear made of brass. It thrums with barely-contained energy." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "ratvarian_spear" + item_state = "ratvarian_spear" + force = 15 //Extra damage is dealt to targets in attack() + throwforce = 25 + armour_penetration = 10 + sharp = TRUE + attack_verb = list("stabbed", "poked", "slashed") + hitsound = 'sound/weapons/bladeslice.ogg' + w_class = WEIGHT_CLASS_BULKY + var/bonus_burn = 5 diff --git a/code/modules/ruins/lavalandruin_code/fountain_hall.dm b/code/modules/ruins/lavalandruin_code/fountain_hall.dm new file mode 100644 index 00000000000..917ea4e4bd0 --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/fountain_hall.dm @@ -0,0 +1,49 @@ +/obj/structure/sacrificealtar + name = "sacrificial altar" + desc = "An altar designed to perform blood sacrifice for a deity." + icon = 'icons/obj/hand_of_god_structures.dmi' + icon_state = "sacrificealtar" + anchored = TRUE + density = FALSE + can_buckle = TRUE + +/obj/structure/sacrificealtar/attack_hand(mob/living/user) + if(user.incapacitated()) + return + if(!has_buckled_mobs()) + return + var/mob/living/L = buckled_mob + if(!L) + return + to_chat(user, "You attempt to sacrifice [L] by invoking the sacrificial ritual.") + L.gib() + message_admins("[ADMIN_LOOKUPFLW(user)] has sacrificed [key_name_admin(L)] on the sacrificial altar at [AREACOORD(src)].") + +/obj/structure/healingfountain + name = "healing fountain" + desc = "A fountain containing the waters of life." + icon = 'icons/obj/hand_of_god_structures.dmi' + icon_state = "fountain" + anchored = TRUE + density = TRUE + var/time_between_uses = 1800 + var/last_process = 0 + +/obj/structure/healingfountain/attack_hand(mob/living/user) + . = ..() + if(.) + return + if(last_process + time_between_uses > world.time) + to_chat(user, "The fountain appears to be empty.") + return + last_process = world.time + to_chat(user, "The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.") + user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood, 20) + update_icon() + addtimer(CALLBACK(src, .proc/update_icon), time_between_uses) + +/obj/structure/healingfountain/update_icon() + if(last_process + time_between_uses > world.time) + icon_state = "fountain" + else + icon_state = "fountain-red" \ No newline at end of file diff --git a/code/modules/ruins/lavalandruin_code/pizzaparty.dm b/code/modules/ruins/lavalandruin_code/pizzaparty.dm new file mode 100644 index 00000000000..3201652c371 --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/pizzaparty.dm @@ -0,0 +1,11 @@ +/obj/effect/spawner/lootdrop/pizzaparty + name = "pizza bomb spawner" + loot = list(/obj/item/pizzabox/margherita = 3, + /obj/item/pizzabox/meat = 3, + /obj/item/pizzabox/mushroom = 3, + /obj/item/pizza_bomb = 1) + lootdoubles = FALSE + +/obj/structure/reagent_dispensers/water_cooler/pizzaparty + name = "punch cooler" + reagent_id = "bacchus_blessing" \ No newline at end of file diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm new file mode 100644 index 00000000000..44383f11a0a --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -0,0 +1,351 @@ +/obj/effect/sliding_puzzle + name = "Sliding puzzle generator" + icon = 'icons/obj/items.dmi' //mapping + icon_state = "syndballoon" + invisibility = INVISIBILITY_ABSTRACT + anchored = TRUE + var/list/elements + var/floor_type = /turf/simulated/floor/vault + var/finished = FALSE + var/reward_type = /obj/item/reagent_containers/food/snacks/cookie + var/element_type = /obj/structure/puzzle_element + var/auto_setup = TRUE + var/empty_tile_id + +//Gets the turf where the tile with given id should be +/obj/effect/sliding_puzzle/proc/get_turf_for_id(id) + var/turf/center = get_turf(src) + switch(id) + if(1) + return get_step(center,NORTHWEST) + if(2) + return get_step(center,NORTH) + if(3) + return get_step(center,NORTHEAST) + if(4) + return get_step(center,WEST) + if(5) + return center + if(6) + return get_step(center,EAST) + if(7) + return get_step(center,SOUTHWEST) + if(8) + return get_step(center,SOUTH) + if(9) + return get_step(center,SOUTHEAST) + +/obj/effect/sliding_puzzle/Initialize(mapload) + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/sliding_puzzle/LateInitialize() + if(auto_setup) + setup() + +/obj/effect/sliding_puzzle/proc/check_setup_location() + for(var/id in 1 to 9) + var/turf/T = get_turf_for_id(id) + if(!T) + return FALSE + if(istype(T, /turf/simulated/wall/indestructible) || istype(T, /turf/simulated/floor/indestructible)) + return FALSE + return TRUE + + +/obj/effect/sliding_puzzle/proc/validate() + if(finished) + return + + if(elements.len < 8) //Someone broke it + qdel(src) + + //Check if everything is in place + for(var/id in 1 to 9) + var/target_turf = get_turf_for_id(id) + var/obj/structure/puzzle_element/E = locate() in target_turf + if(id == empty_tile_id && !E) // This location should be empty. + continue + if(!E || E.id != id) //wrong tile or no tile at all + return + //Ding ding + finish() + +/obj/effect/sliding_puzzle/Destroy() + if(LAZYLEN(elements)) + for(var/obj/structure/puzzle_element/E in elements) + E.source = null + elements.Cut() + return ..() + +#define COLLAPSE_DURATION 7 + +/obj/effect/sliding_puzzle/proc/finish() + finished = TRUE + for(var/mob/M in range(7,src)) + shake_camera(M, COLLAPSE_DURATION , 1) + for(var/obj/structure/puzzle_element/E in elements) + E.collapse() + + dispense_reward() + +/obj/effect/sliding_puzzle/proc/dispense_reward() + new reward_type(get_turf(src)) + +/obj/effect/sliding_puzzle/proc/is_solvable() + var/list/current_ordering = list() + for(var/obj/structure/puzzle_element/E in elements_in_order()) + current_ordering += E.id + + var/swap_tally = 0 + for(var/i in 1 to current_ordering.len) + var/checked_value = current_ordering[i] + for(var/j in i to current_ordering.len) + if(current_ordering[j] < checked_value) + swap_tally++ + + return swap_tally % 2 == 0 + +//swap two tiles in same row +/obj/effect/sliding_puzzle/proc/make_solvable() + var/first_tile_id = 1 + var/other_tile_id = 2 + if(empty_tile_id == 1 || empty_tile_id == 2) //Can't swap with empty one so just grab some in second row + first_tile_id = 4 + other_tile_id = 5 + + var/turf/T1 = get_turf_for_id(first_tile_id) + var/turf/T2 = get_turf_for_id(other_tile_id) + + var/obj/structure/puzzle_element/E1 = locate() in T1 + var/obj/structure/puzzle_element/E2 = locate() in T2 + + E1.forceMove(T2) + E2.forceMove(T1) + +/proc/cmp_xy_desc(atom/movable/A, atom/movable/B) + if(A.y > B.y) + return -1 + if(A.y < B.y) + return 1 + if(A.x > B.x) + return 1 + if(A.x < B.x) + return -1 + return 0 + +/obj/effect/sliding_puzzle/proc/elements_in_order() + return sortTim(elements,cmp=/proc/cmp_xy_desc) + +/obj/effect/sliding_puzzle/proc/get_base_icon() + var/icon/I = new('icons/obj/puzzle.dmi') + var/list/puzzles = icon_states(I) + var/puzzle_state = pick(puzzles) + var/icon/P = new('icons/obj/puzzle.dmi',puzzle_state) + return P + +/obj/effect/sliding_puzzle/proc/setup() + //First we slice the 96x96 icon into 32x32 pieces + var/list/puzzle_pieces = list() //id -> icon list + + var/width = 3 + var/height = 3 + var/list/left_ids = list() + var/tile_count = width * height + + //Generate per tile icons + for(var/id in 1 to tile_count) + var/y = width - round((id - 1) / width) + var/x = ((id - 1) % width) + 1 + + var/x_start = 1 + (x - 1) * world.icon_size + var/x_end = x_start + world.icon_size - 1 + var/y_start = 1 + ((y - 1) * world.icon_size) + var/y_end = y_start + world.icon_size - 1 + + var/icon/T = get_base_icon() + T.Crop(x_start,y_start,x_end,y_end) + puzzle_pieces["[id]"] = T + left_ids += id + + //Setup random empty tile + empty_tile_id = pick_n_take(left_ids) + var/turf/empty_tile_turf = get_turf_for_id(empty_tile_id) + empty_tile_turf.ChangeTurf(floor_type, keep_icon = FALSE, ignore_air = FALSE) + var/mutable_appearance/MA = new(puzzle_pieces["[empty_tile_id]"]) + MA.layer = empty_tile_turf.layer + 0.1 + empty_tile_turf.add_overlay(MA) + + elements = list() + var/list/empty_spots = left_ids.Copy() + for(var/spot_id in empty_spots) + var/turf/T = get_turf_for_id(spot_id) + T = T.ChangeTurf(floor_type, keep_icon = FALSE, ignore_air = FALSE) + var/obj/structure/puzzle_element/E = new element_type(T) + elements += E + var/chosen_id = pick_n_take(left_ids) + E.puzzle_icon = puzzle_pieces["[chosen_id]"] + E.source = src + E.id = chosen_id + E.set_puzzle_icon() + + if(!is_solvable()) + make_solvable() + +/obj/structure/puzzle_element + name = "mysterious pillar" + desc = "puzzling..." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "puzzle_pillar" + anchored = FALSE + density = TRUE + var/id = 0 + var/obj/effect/sliding_puzzle/source + var/icon/puzzle_icon + +/obj/structure/puzzle_element/Move(nloc, dir) + if(!isturf(nloc) || moving_diagonally || get_dist(get_step(src,dir),get_turf(source)) > 1) + return 0 + else + return ..() + +/obj/structure/puzzle_element/proc/set_puzzle_icon() + cut_overlays() + if(puzzle_icon) + //Need to scale it down a bit to fit the static border + var/icon/C = new(puzzle_icon) + C.Scale(19,19) + var/mutable_appearance/puzzle_small = new(C) + puzzle_small.layer = layer + 0.1 + puzzle_small.pixel_x = 7 + puzzle_small.pixel_y = 7 + add_overlay(puzzle_small) + +/obj/structure/puzzle_element/Destroy() + if(source) + source.elements -= src + source.validate() + return ..() + +//Set the full image on the turf and delete yourself +/obj/structure/puzzle_element/proc/collapse() + var/turf/T = get_turf(src) + var/mutable_appearance/MA = new(puzzle_icon) + MA.layer = T.layer + 0.1 + T.add_overlay(MA) + //Some basic shaking animation + for(var/i in 1 to COLLAPSE_DURATION) + animate(src, pixel_x=rand(-5,5), pixel_y=rand(-2,2), time=1) + QDEL_IN(src,COLLAPSE_DURATION) + +/obj/structure/puzzle_element/Moved() + . = ..() + source.validate() + +//Admin abuse version so you can pick the icon before it sets up +/obj/effect/sliding_puzzle/admin + auto_setup = FALSE + var/icon/puzzle_icon + var/puzzle_state + +/obj/effect/sliding_puzzle/admin/get_base_icon() + var/icon/I = new(puzzle_icon,puzzle_state) + return I + +//Ruin version +/obj/effect/sliding_puzzle/lavaland + reward_type = /obj/structure/closet/crate/necropolis/puzzle + +/obj/effect/sliding_puzzle/lavaland/dispense_reward() + if(prob(25)) + //If it's not roaming somewhere else already. + var/mob/living/simple_animal/hostile/megafauna/bubblegum/B = locate() in GLOB.mob_list + if(!B) + reward_type = /mob/living/simple_animal/hostile/megafauna/bubblegum + return ..() + +//Prison cube version +/obj/effect/sliding_puzzle/prison + auto_setup = FALSE //This will be done by cube proc + var/mob/living/prisoner + element_type = /obj/structure/puzzle_element/prison + +/obj/effect/sliding_puzzle/prison/get_base_icon() + if(!prisoner) + CRASH("Prison cube without prisoner") + prisoner.setDir(SOUTH) + var/icon/I = getFlatIcon(prisoner) + I.Scale(96,96) + return I + +/obj/effect/sliding_puzzle/prison/Destroy() + if(prisoner) + to_chat(prisoner,"With the cube broken by force, you can feel your body falling apart.") + prisoner.death() + qdel(prisoner) + . = ..() + +/obj/effect/sliding_puzzle/prison/dispense_reward() + prisoner.forceMove(get_turf(src)) + prisoner.notransform = FALSE + prisoner = null + +//Some armor so it's harder to kill someone by mistake. +/obj/structure/puzzle_element/prison + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 50, "acid" = 50) + +/obj/structure/puzzle_element/prison/relaymove(mob/user) + return + +/obj/item/prisoncube + name = "Prison Cube" + desc = "Dusty cube with humanoid imprint on it." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "prison_cube" + +/obj/item/prisoncube/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!proximity_flag || !isliving(target)) + return + var/mob/living/victim = target + var/mob/living/carbon/carbon_victim = victim + //Handcuffed or unconcious + if(istype(carbon_victim) && carbon_victim.handcuffed || victim.stat != CONSCIOUS) + if(!puzzle_imprison(target)) + to_chat(user,"[src] does nothing.") + return + to_chat(user,"You trap [victim] in the prison cube!") + qdel(src) + else + to_chat(user,"[src] only accepts restrained or unconcious prisoners.") + +/proc/puzzle_imprison(mob/living/prisoner) + var/turf/T = get_turf(prisoner) + var/obj/effect/sliding_puzzle/prison/cube = new(T) + if(!cube.check_setup_location()) + qdel(cube) + return FALSE + + //First grab the prisoner and move them temporarily into the generator so they won't get thrown around. + prisoner.notransform = TRUE + prisoner.forceMove(cube) + to_chat(prisoner,"You're trapped by the prison cube! You will remain trapped until someone solves it.") + + //Clear the area from objects (and cube user) + var/list/things_to_throw = list() + for(var/atom/movable/AM in range(1,T)) + if(!AM.anchored) + things_to_throw += AM + + for(var/atom/movable/AM in things_to_throw) + var/throwtarget = get_edge_target_turf(T, get_dir(T, get_step_away(AM, T))) + AM.throw_at(throwtarget, 2, 3) + + //Create puzzle itself + cube.prisoner = prisoner + cube.setup() + + //Move them into random block + var/obj/structure/puzzle_element/E = pick(cube.elements) + prisoner.forceMove(E) + return TRUE \ No newline at end of file diff --git a/code/modules/ruins/lavalandruin_code/sin_ruins.dm b/code/modules/ruins/lavalandruin_code/sin_ruins.dm new file mode 100644 index 00000000000..82fbd410ea1 --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/sin_ruins.dm @@ -0,0 +1,156 @@ +//These objects are used in the cardinal sin-themed ruins (i.e. Gluttony, Pride...) + +// Greed +/obj/structure/cursed_slot_machine //Greed's slot machine: Used in the Greed ruin. Deals clone damage on each use, with a successful use giving a d20 of fate. + name = "greed's slot machine" + desc = "High stakes, high rewards." + icon = 'icons/obj/economy.dmi' + icon_state = "slots-off" + anchored = TRUE + density = TRUE + var/win_prob = 5 + +/obj/structure/cursed_slot_machine/attack_hand(mob/user) + interact(user) + +/obj/structure/cursed_slot_machine/interact(mob/living/carbon/human/user) + if(!istype(user)) + return + + if(in_use) + return + + in_use = TRUE + user.adjustCloneLoss(20) + if(user.stat) + to_chat(user, "No... just one more try...") + user.gib() + else + user.visible_message("[user] pulls [src]'s lever with a glint in [user.p_their()] eyes!", "You feel a draining as you pull the lever, but you \ + know it'll be worth it.") + icon_state = "slots-on" + playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, 0) + addtimer(CALLBACK(src, .proc/determine_victor, user), 50) + +/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user) + icon_state = "slots-off" + in_use = FALSE + if(prob(win_prob)) + playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, 0) + new/obj/structure/cursed_money(get_turf(src)) + if(user) + to_chat(user, "You've hit jackpot. Laughter echoes around you as your reward appears in the machine's place.") + qdel(src) + else + if(user) + to_chat(user, "Fucking machine! Must be rigged. Still... one more try couldn't hurt, right?") + +/obj/structure/cursed_money + name = "bag of money" + desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!" + icon = 'icons/obj/storage.dmi' + icon_state = "moneybag" + anchored = FALSE + density = TRUE + +/obj/structure/cursed_money/Initialize() + . = ..() + addtimer(CALLBACK(src, .proc/collapse), 600) + +/obj/structure/cursed_money/proc/collapse() + visible_message("[src] falls in on itself, \ + canvas rotting away and contents vanishing.") + qdel(src) + +/obj/structure/cursed_money/attack_hand(mob/living/user) + . = ..() + if(.) + return . + + user.visible_message("[user] opens the bag and \ + and removes a die. The bag then vanishes.", + "You open the bag...!\n\ + And see a bag full of dice. Confused, \ + you take one... and the bag vanishes.") + var/turf/T = get_turf(user) + var/obj/item/dice/d20/fate/one_use/critical_fail = new(T) + user.put_in_hands(critical_fail) + qdel(src) + +// Gluttony +/obj/effect/gluttony //Gluttony's wall: Used in the Gluttony ruin. Only lets the overweight through. + name = "gluttony's wall" + desc = "Only those who truly indulge may pass." + anchored = TRUE + density = TRUE + icon_state = "blob" + icon = 'icons/mob/blob.dmi' + color = rgb(145, 150, 0) + +/obj/effect/gluttony/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff. + if(ishuman(mover)) + var/mob/living/carbon/human/H = mover + if(H.nutrition >= NUTRITION_LEVEL_FAT || (FAT in H.mutations)) + H.visible_message("[H] pushes through [src]!", "You've seen and eaten worse than this.") + return TRUE + else + to_chat(H, "You're repulsed by even looking at [src]. Only a pig could force themselves to go through it.") + if(istype(mover, /mob/living/simple_animal/hostile/morph)) + return TRUE + else + return FALSE + +// Pride +/obj/structure/mirror/magic/pride //Pride's mirror: Used in the Pride ruin. + name = "pride's mirror" + desc = "Pride cometh before the..." + icon_state = "magic_mirror" + +/obj/structure/mirror/magic/pride/curse(mob/user) + user.visible_message("The ground splits beneath [user] as [user.p_their()] hand leaves the mirror!", \ + "Perfect. Much better! Now nobody will be able to resist yo-") + + var/turf/T = get_turf(user) + var/list/levels = space_manager.z_list.Copy() + for(var/level in levels) + if(!is_teleport_allowed(level)) + levels -= level + + T.ChangeTurf(/turf/simulated/floor/chasm) + var/turf/simulated/floor/chasm/C = T + C.drop_x = T.x + C.drop_y = T.y + C.drop_z = pick(levels) + C.drop(user) + +// Envy +/obj/item/kitchen/knife/envy //Envy's knife: Found in the Envy ruin. Attackers take on the appearance of whoever they strike. + name = "envy's knife" + desc = "Their success will be yours." + icon = 'icons/obj/wizard.dmi' + icon_state = "render" + item_state = "knife" + force = 18 + throwforce = 10 + w_class = WEIGHT_CLASS_NORMAL + hitsound = 'sound/weapons/bladeslice.ogg' + +/obj/item/kitchen/knife/envy/afterattack(atom/movable/AM, mob/living/carbon/human/user, proximity) + . = ..() + if(!proximity) + return + if(!istype(user)) + return + if(ishuman(AM)) + var/mob/living/carbon/human/H = AM + if(user.real_name != H.dna.real_name) + user.real_name = H.dna.real_name + H.dna.transfer_identity(user) + user.visible_message("[user]'s appearance shifts into [H]'s!", \ + "[H.p_they(TRUE)] think[H.p_s()] [H.p_theyre()] sooo much better than you. Not anymore, [H.p_they()] won't.") + +// Sloth +/obj/item/paper/fluff/stations/lavaland/sloth/note + name = "note from sloth" + icon_state = "paper_words" + info = "have not gotten around to finishing my cursed item yet sorry - sloth" diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index a725d3d5d5f..3c9f093921e 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -266,7 +266,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) /obj/structure/stone_tile/singularity_pull() return -/obj/structure/stone_tile/Crossed(atom/movable/AM) +/obj/structure/stone_tile/Crossed(atom/movable/AM, oldloc) if(falling || fallen) return var/turf/T = get_turf(src) @@ -310,7 +310,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) falling = FALSE fallen = FALSE -/obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM) +/obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM, oldloc) return /obj/structure/stone_tile/block diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index 273ea75e832..0bc9a074179 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -92,6 +92,8 @@ has_paint = 1 update_icons() +/obj/spacepod/get_cell() + return battery /obj/spacepod/New() . = ..() @@ -1035,7 +1037,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/spacepod_equipment/SPE, v return stop() /obj/spacepod/relaymove(mob/user, direction) - if(usr != src.pilot) + if(user != src.pilot) return handlerelaymove(user, direction) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 4462e4ea470..54be2e679b3 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -129,7 +129,6 @@ if(!parent.children) parent.children = list() parent.children.Add(src) - parent.check_fracture() /obj/item/organ/external/attempt_become_organ(obj/item/organ/external/parent,mob/living/carbon/human/H) if(parent_organ != parent.limb_name) @@ -224,7 +223,7 @@ droplimb(1) //Clean loss, just drop the limb and be done // See if bones need to break - check_fracture() + check_fracture(brute) var/mob/living/carbon/owner_old = owner //Need to update health, but need a reference in case the below check cuts off a limb. //If limb took enough damage, try to cut or tear it off if(owner && loc == owner) @@ -399,9 +398,10 @@ Note that amputating the affected organ does in fact remove the infection from t owner.adjustToxLoss(1) //Updates brute_damn and burn_damn from wound damages. Updates BLEEDING status. -/obj/item/organ/external/proc/check_fracture() +/obj/item/organ/external/proc/check_fracture(var/damage_inflicted) if(config.bones_can_break && brute_dam > min_broken_damage && !is_robotic()) - fracture() + if(prob(damage_inflicted)) + fracture() /obj/item/organ/external/proc/check_for_internal_bleeding(damage) if(NO_BLOOD in owner.dna.species.species_traits) diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 8f98f1b4158..b0b2941b3d2 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -66,6 +66,7 @@ var/global/list/datum/stack_recipe/bluespace_crystal_recipes = list(new/datum/st attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed") toolspeed = 1 usesound = 'sound/items/deconstruct.ogg' + point_value = 30 /obj/item/stack/sheet/bluespace_crystal/New() ..() diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 2f3667a645f..893e9719fb4 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -128,11 +128,13 @@ var/teleporting = 0 var/chargecost = 1000 +/obj/item/rcs/get_cell() + return rcell + /obj/item/rcs/New() ..() rcell = new(src) - /obj/item/rcs/examine(mob/user) ..(user) to_chat(user, "There are [round(rcell.charge/chargecost)] charge\s left.") diff --git a/config/example/config.txt b/config/example/config.txt index 87ed0ce5cf1..89b8767feab 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -85,6 +85,16 @@ LOG_WORLD_OUTPUT ## log admin warning messages LOG_ADMINWARN + +## Amount of minutes that a person has to be AFK before he will be warned by the AFK subsystem. Leave this 0 to prevent the subsystem from activating +WARN_AFK_MINIMUM 0 + +## Amount of minutes that a person has to be AFK before he will be cryod by the AFK subsystem. Leave this 0 to prevent the subsystem from activating +AUTO_CRYO_AFK 0 + +## Amount of minutes that a person has to be AFK before he will be despawned by the AFK subsystem. Leave this 0 to prevent the subsystem from activating +AUTO_DESPAWN_AFK 0 + ## probablities for game modes chosen in "secret" and "random" modes ## ## default probablity is 1, increase to make that mode more likely to be picked diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt index 8b411db15e1..2404119d52f 100644 --- a/config/example/dbconfig.txt +++ b/config/example/dbconfig.txt @@ -9,7 +9,7 @@ ## This value must be set to the version of the paradise schema in use. ## If this value does not match, the SQL database will not be loaded and an error will be generated. ## Roundstart will be delayed. -DB_VERSION 6 +DB_VERSION 8 ## Server the MySQL database can be found at. # Examples: localhost, 200.135.5.43, www.mysqldb.com, etc. diff --git a/config/example/jobs.txt b/config/example/jobs.txt index 962803ab886..44543fca332 100644 --- a/config/example/jobs.txt +++ b/config/example/jobs.txt @@ -20,7 +20,7 @@ Botanist=2 Chef=1 Janitor=1 Quartermaster=1 -Shaft Miner=3 +Shaft Miner=6 Warden=1 Detective=1 diff --git a/config/example/jobs_highpop.txt b/config/example/jobs_highpop.txt index 962803ab886..44543fca332 100644 --- a/config/example/jobs_highpop.txt +++ b/config/example/jobs_highpop.txt @@ -20,7 +20,7 @@ Botanist=2 Chef=1 Janitor=1 Quartermaster=1 -Shaft Miner=3 +Shaft Miner=6 Warden=1 Detective=1 diff --git a/config/example/lavaRuinBlacklist.txt b/config/example/lavaRuinBlacklist.txt index ee3f0245a07..934d86514b0 100644 --- a/config/example/lavaRuinBlacklist.txt +++ b/config/example/lavaRuinBlacklist.txt @@ -8,17 +8,33 @@ ##RESPAWN #_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm #_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm #_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm ##SIN +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_envy.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_greed.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pride.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm - -##MISC -#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +##MEGAFAUNA #_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm #_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm #_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm -#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm #_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm #_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm + +##MISC +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_cube.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_fountain_hell.dmm" +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pizza_party.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm" +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm" \ No newline at end of file diff --git a/config/names/adjectives.txt b/config/names/adjectives.txt index ab0b4ba1806..c217e7f5f49 100644 --- a/config/names/adjectives.txt +++ b/config/names/adjectives.txt @@ -76,6 +76,7 @@ expensive famous fragile frail +flaming gifted helpful helpless diff --git a/config/names/nouns.txt b/config/names/nouns.txt new file mode 100644 index 00000000000..3f0d1dc6d05 --- /dev/null +++ b/config/names/nouns.txt @@ -0,0 +1,6801 @@ +ATM +CD +SUV +TV +aardvark +abacus +abbey +abbreviation +abdomen +ability +abnormality +abolishment +abortion +abrogation +absence +abundance +abuse +academics +academy +accelerant +accelerator +accent +acceptance +access +accessory +accident +accommodation +accompanist +accomplishment +accord +accordance +accordion +account +accountability +accountant +accounting +accuracy +accusation +acetate +achievement +achiever +acid +acknowledgment +acorn +acoustics +acquaintance +acquisition +acre +acrylic +act +action +activation +activist +activity +actor +actress +acupuncture +ad +adaptation +adapter +addiction +addition +address +adjective +adjustment +admin +administration +administrator +admire +admission +adobe +adoption +adrenalin +adrenaline +adult +adulthood +advance +advancement +advantage +advent +adverb +advertisement +advertising +advice +adviser +advocacy +advocate +affair +affect +affidavit +affiliate +affinity +afoul +afterlife +aftermath +afternoon +aftershave +aftershock +afterthought +age +agency +agenda +agent +aggradation +aggression +aglet +agony +agreement +agriculture +aid +aide +aim +air +airbag +airbus +aircraft +airfare +airfield +airforce +airline +airmail +airman +airplane +airport +airship +airspace +alarm +alb +albatross +album +alcohol +alcove +alder +ale +alert +alfalfa +algebra +algorithm +alias +alibi +alien +allegation +allergist +alley +alliance +alligator +allocation +allowance +alloy +alluvium +almanac +almighty +almond +alpaca +alpenglow +alpenhorn +alpha +alphabet +altar +alteration +alternative +altitude +alto +aluminium +aluminum +amazement +amazon +ambassador +amber +ambience +ambiguity +ambition +ambulance +amendment +amenity +ammunition +amnesty +amount +amusement +anagram +analgesia +analog +analogue +analogy +analysis +analyst +analytics +anarchist +anarchy +anatomy +ancestor +anchovy +android +anesthesiologist +anesthesiology +angel +anger +angina +angiosperm +angle +angora +angstrom +anguish +animal +anime +anise +ankle +anklet +anniversary +announcement +annual +anorak +answer +ant +anteater +antecedent +antechamber +antelope +antennae +anterior +anthropology +antibody +anticipation +anticodon +antigen +antique +antiquity +antler +antling +anxiety +anybody +anyone +anything +anywhere +apartment +ape +aperitif +apology +app +apparatus +apparel +appeal +appearance +appellation +appendix +appetiser +appetite +appetizer +applause +apple +applewood +appliance +application +appointment +appreciation +apprehension +approach +appropriation +approval +apricot +apron +apse +aquarium +aquifer +arcade +arch +arch-rival +archaeologist +archaeology +archeology +archer +architect +architecture +archives +area +arena +argument +arithmetic +ark +arm +arm-rest +armadillo +armament +armchair +armoire +armor +armour +armpit +armrest +army +arrangement +array +arrest +arrival +arrogance +arrow +art +artery +arthur +artichoke +article +artifact +artificer +artist +ascend +ascent +ascot +ash +ashram +ashtray +aside +asparagus +aspect +asphalt +aspic +ass +assassination +assault +assembly +assertion +assessment +asset +assignment +assist +assistance +assistant +associate +association +assumption +assurance +asterisk +astrakhan +astrolabe +astrologer +astrology +astronomy +asymmetry +atelier +atheist +athlete +athletics +atmosphere +atom +atrium +attachment +attack +attacker +attainment +attempt +attendance +attendant +attention +attenuation +attic +attitude +attorney +attraction +attribute +auction +audience +audit +auditorium +aunt +authentication +authenticity +author +authorisation +authority +authorization +auto +autoimmunity +automation +automaton +autumn +availability +avalanche +avenue +average +avocado +award +awareness +awe +axis +azimuth +babe +baboon +babushka +baby +bachelor +back +back-up +backbone +backburn +backdrop +background +backpack +backup +backyard +bacon +bacterium +badge +badger +bafflement +bag +bagel +baggage +baggie +baggy +bagpipe +bail +bait +bake +baker +bakery +bakeware +balaclava +balalaika +balance +balcony +ball +ballet +balloon +balloonist +ballot +ballpark +bamboo +ban +banana +band +bandana +bandanna +bandolier +bandwidth +bangle +banjo +bank +bankbook +banker +banking +bankruptcy +banner +banquette +banyan +baobab +bar +barbecue +barbeque +barber +barbiturate +bargain +barge +baritone +barium +bark +barley +barn +barometer +barracks +barrage +barrel +barrier +barstool +bartender +base +baseball +baseboard +baseline +basement +basics +basil +basin +basis +basket +basketball +bass +bassinet +bassoon +bat +bath +bather +bathhouse +bathrobe +bathroom +bathtub +battalion +batter +battery +batting +battle +battleship +bay +bayou +beach +bead +beak +beam +bean +beancurd +beanie +beanstalk +bear +beard +beast +beastie +beat +beating +beauty +beaver +beck +bed +bedrock +bedroom +bee +beech +beef +beer +beet +beetle +beggar +beginner +beginning +begonia +behalf +behavior +behaviour +beheading +behest +behold +being +belfry +belief +believer +bell +belligerency +bellows +belly +belt +bench +bend +beneficiary +benefit +beret +berry +best-seller +bestseller +bet +beverage +beyond +bias +bibliography +bicycle +bid +bidder +bidding +bidet +bifocals +bijou +bike +bikini +bill +billboard +billing +billion +bin +binoculars +biology +biopsy +biosphere +biplane +birch +bird +bird-watcher +birdbath +birdcage +birdhouse +birth +birthday +biscuit +bit +bite +bitten +bitter +black +blackberry +blackbird +blackboard +blackfish +blackness +bladder +blade +blame +blank +blanket +blast +blazer +blend +blessing +blight +blind +blinker +blister +blizzard +block +blocker +blog +blogger +blood +bloodflow +bloom +bloomer +blossom +blouse +blow +blowgun +blowhole +blue +blueberry +blush +boar +board +boat +boatload +boatyard +bob +bobcat +body +bog +bolero +bolt +bomb +bomber +bombing +bond +bonding +bondsman +bone +bonfire +bongo +bonnet +bonsai +bonus +boogeyman +book +bookcase +bookend +booking +booklet +bookmark +boolean +boom +boon +boost +booster +boot +bootee +bootie +booty +border +bore +borrower +borrowing +bosom +boss +botany +bother +bottle +bottling +bottom +bottom-line +boudoir +bough +boulder +boulevard +boundary +bouquet +bourgeoisie +bout +boutique +bow +bower +bowl +bowler +bowling +bowtie +box +boxer +boxspring +boy +boycott +boyfriend +boyhood +boysenberry +bra +brace +bracelet +bracket +brain +brake +bran +branch +brand +brandy +brass +brassiere +bratwurst +bread +breadcrumb +breadfruit +break +breakdown +breakfast +breakpoint +breakthrough +breast +breastplate +breath +breeze +brewer +bribery +brick +bricklaying +bride +bridge +brief +briefing +briefly +briefs +brilliant +brink +brisket +broad +broadcast +broccoli +brochure +brocolli +broiler +broker +bronchitis +bronco +bronze +brooch +brood +brook +broom +brother +brother-in-law +brow +brown +brownie +browser +browsing +brunch +brush +brushfire +brushing +bubble +buck +bucket +buckle +buckwheat +bud +buddy +budget +buffalo +buffer +buffet +bug +buggy +bugle +builder +building +bulb +bulk +bull +bull-fighter +bulldozer +bullet +bump +bumper +bun +bunch +bungalow +bunghole +bunkhouse +burden +bureau +burglar +burial +burlesque +burn +burn-out +burning +burrito +burro +burrow +burst +bus +bush +business +businessman +bust +bustle +butane +butcher +butler +butter +butterfly +button +buy +buyer +buying +buzz +buzzard +c-clamp +cabana +cabbage +cabin +cabinet +cable +caboose +cacao +cactus +caddy +cadet +cafe +caffeine +caftan +cage +cake +calcification +calculation +calculator +calculus +calendar +calf +caliber +calibre +calico +call +calm +calorie +camel +cameo +camera +camp +campaign +campaigning +campanile +camper +campus +can +canal +cancer +candelabra +candidacy +candidate +candle +candy +cane +cannibal +cannon +canoe +canon +canopy +cantaloupe +canteen +canvas +cap +capability +capacity +cape +caper +capital +capitalism +capitulation +capon +cappelletti +cappuccino +captain +caption +captor +car +carabao +caramel +caravan +carbohydrate +carbon +carboxyl +card +cardboard +cardigan +care +career +cargo +caribou +carload +carnation +carnival +carol +carotene +carp +carpenter +carpet +carpeting +carport +carriage +carrier +carrot +carry +cart +cartel +carter +cartilage +cartload +cartoon +cartridge +carving +cascade +case +casement +cash +cashew +cashier +casino +casket +cassava +casserole +cassock +cast +castanet +castle +casualty +cat +catacomb +catalogue +catalysis +catalyst +catamaran +catastrophe +catch +catcher +category +caterpillar +cathedral +cation +catsup +cattle +cauliflower +causal +cause +causeway +caution +cave +caviar +cayenne +ceiling +celebration +celebrity +celeriac +celery +cell +cellar +cello +celsius +cement +cemetery +cenotaph +census +cent +center +centimeter +centre +centurion +century +cephalopod +ceramic +ceramics +cereal +ceremony +certainty +certificate +certification +cesspool +chafe +chain +chainstay +chair +chairlift +chairman +chairperson +chaise +chalet +chalice +chalk +challenge +chamber +champagne +champion +championship +chance +chandelier +change +channel +chaos +chap +chapel +chaplain +chapter +character +characteristic +characterization +chard +charge +charger +charity +charlatan +charm +charset +chart +charter +chasm +chassis +chastity +chasuble +chateau +chatter +chauffeur +chauvinist +check +checkbook +checking +checkout +checkroom +cheddar +cheek +cheer +cheese +cheesecake +cheetah +chef +chem +chemical +chemistry +chemotaxis +cheque +cherry +chess +chest +chestnut +chick +chicken +chicory +chief +chiffonier +child +childbirth +childhood +chili +chill +chime +chimpanzee +chin +chinchilla +chino +chip +chipmunk +chit-chat +chivalry +chive +chives +chocolate +choice +choir +choker +cholesterol +choosing +chop +chops +chopstick +chopsticks +chord +chorus +chow +chowder +chrome +chromolithograph +chronicle +chronograph +chronometer +chrysalis +chub +chuck +chug +church +churn +chutney +cicada +cigarette +cilantro +cinder +cinema +cinnamon +circadian +circle +circuit +circulation +circumference +circumstance +cirrhosis +cirrus +citizen +citizenship +citron +citrus +city +civilian +civilisation +civilization +claim +clam +clamp +clan +clank +clapboard +clarification +clarinet +clarity +clasp +class +classic +classification +classmate +classroom +clause +clave +clavicle +clavier +claw +clay +cleaner +clearance +clearing +cleat +cleavage +clef +cleft +clergyman +cleric +clerk +click +client +cliff +climate +climb +clinic +clip +clipboard +clipper +cloak +cloakroom +clock +clockwork +clogs +cloister +clone +close +closet +closing +closure +cloth +clothes +clothing +cloud +cloudburst +clove +clover +cloves +club +clue +cluster +clutch +co-producer +coach +coal +coalition +coast +coaster +coat +cob +cobbler +cobweb +cock +cockpit +cockroach +cocktail +cocoa +coconut +cod +code +codepage +codling +codon +codpiece +coevolution +cofactor +coffee +coffin +cohesion +cohort +coil +coin +coincidence +coinsurance +coke +cold +coleslaw +coliseum +collaboration +collagen +collapse +collar +collard +collateral +colleague +collection +collectivisation +collectivization +collector +college +collision +colloquy +colon +colonial +colonialism +colonisation +colonization +colony +color +colorlessness +colt +column +columnist +comb +combat +combination +combine +comeback +comedy +comestible +comfort +comfortable +comic +comics +comma +command +commander +commandment +comment +commerce +commercial +commission +commitment +committee +commodity +common +commonsense +commotion +communicant +communication +communion +communist +community +commuter +company +comparison +compass +compassion +compassionate +compensation +competence +competition +competitor +complaint +complement +completion +complex +complexity +compliance +complication +complicity +compliment +component +comportment +composer +composite +composition +compost +comprehension +compress +compromise +comptroller +compulsion +computer +comradeship +con +concentrate +concentration +concept +conception +concern +concert +conclusion +concrete +condition +conditioner +condominium +condor +conduct +conductor +cone +confectionery +conference +confidence +confidentiality +configuration +confirmation +conflict +conformation +confusion +conga +congo +congregation +congress +congressman +congressperson +conifer +connection +connotation +conscience +consciousness +consensus +consent +consequence +conservation +conservative +consideration +consignment +consist +consistency +console +consonant +conspiracy +conspirator +constant +constellation +constitution +constraint +construction +consul +consulate +consulting +consumer +consumption +contact +contact lens +contagion +container +content +contention +contest +context +continent +contingency +continuity +contour +contract +contractor +contrail +contrary +contrast +contribution +contributor +control +controller +controversy +convection +convenience +convention +conversation +conversion +convert +convertible +conviction +cook +cookbook +cookie +cooking +coonskin +cooperation +coordination +coordinator +cop +cop-out +cope +copper +copy +copying +copyright +copywriter +coral +cord +corduroy +core +cork +cormorant +corn +corner +cornerstone +cornet +cornflakes +cornmeal +corporal +corporation +corporatism +corps +corral +correspondence +correspondent +corridor +corruption +corsage +cosset +cost +costume +cot +cottage +cotton +couch +cougar +cough +council +councilman +councilor +councilperson +counsel +counseling +counselling +counsellor +counselor +count +counter +counter-force +counterpart +counterterrorism +countess +country +countryside +county +couple +coupon +courage +course +court +courthouse +courtroom +cousin +covariate +cover +coverage +coverall +cow +cowbell +cowboy +coyote +crab +crack +cracker +crackers +cradle +craft +craftsman +cranberry +crane +cranky +crap +crash +crate +cravat +craw +crawdad +crayfish +crayon +crazy +cream +creation +creationism +creationist +creative +creativity +creator +creature +creche +credential +credenza +credibility +credit +creditor +creek +creme brulee +crepe +crest +crew +crewman +crewmate +crewmember +crewmen +cria +crib +cribbage +cricket +cricketer +crime +criminal +crinoline +crisis +crisp +criteria +criterion +critic +criticism +crocodile +crocus +croissant +crook +crop +cross +cross-contamination +cross-stitch +crotch +croup +crow +crowd +crown +crucifixion +crude +cruelty +cruise +crumb +crunch +crusader +crush +crust +cry +crystal +crystallography +cub +cube +cuckoo +cucumber +cue +cuff-link +cuisine +cultivar +cultivator +culture +culvert +cummerbund +cup +cupboard +cupcake +cupola +curd +cure +curio +curiosity +curl +curler +currant +currency +current +curriculum +curry +curse +cursor +curtailment +curtain +curve +cushion +custard +custody +custom +customer +cut +cuticle +cutlet +cutover +cutting +cyclamen +cycle +cyclone +cyclooxygenase +cygnet +cylinder +cymbal +cynic +cyst +cytokine +cytoplasm +dad +daddy +daffodil +dagger +dahlia +daikon +daily +dairy +daisy +dam +damage +dame +damn +dance +dancer +dancing +dandelion +danger +dare +dark +darkness +darn +dart +dash +dashboard +data +database +date +daughter +dawn +day +daybed +daylight +dead +deadline +deal +dealer +dealing +dearest +death +deathwatch +debate +debris +debt +debtor +decade +decadence +decency +decimal +decision +decision-making +deck +declaration +declination +decline +decoder +decongestant +decoration +decrease +decryption +dedication +deduce +deduction +deed +deep +deer +default +defeat +defendant +defender +defense +deficit +definition +deformation +degradation +degree +delay +deliberation +delight +delivery +demand +democracy +democrat +demon +demur +den +denim +denominator +density +dentist +deodorant +department +departure +dependency +dependent +deployment +deposit +deposition +depot +depression +depressive +depth +deputy +derby +derivation +derivative +derrick +descendant +descent +description +desert +design +designation +designer +desire +desk +desktop +dessert +destination +destiny +destroyer +destruction +detail +detainee +detainment +detection +detective +detector +detention +determination +detour +devastation +developer +developing +development +developmental +deviance +deviation +device +devil +dew +dhow +diabetes +diadem +diagnosis +diagram +dial +dialect +dialogue +diam +diamond +diaper +diaphragm +diarist +diary +dibble +dick +dickey +dictaphone +dictator +diction +dictionary +die +diesel +diet +difference +differential +difficulty +diffuse +dig +digestion +digestive +digger +digging +digit +dignity +dilapidation +dill +dilution +dime +dimension +dimple +diner +dinghy +dining +dinner +dinosaur +dioxide +dip +diploma +diplomacy +dipstick +direction +directive +director +directory +dirndl +dirt +disability +disadvantage +disagreement +disappointment +disarmament +disaster +discharge +discipline +disclaimer +disclosure +disco +disconnection +discount +discourse +discovery +discrepancy +discretion +discrimination +discussion +disdain +disease +disembodiment +disengagement +disguise +disgust +dish +dishwasher +disk +disparity +dispatch +displacement +display +disposal +disposer +disposition +dispute +disregard +disruption +dissemination +dissonance +distance +distinction +distortion +distribution +distributor +district +divalent +divan +diver +diversity +divide +dividend +divider +divine +diving +division +divorce +doc +dock +doctor +doctorate +doctrine +document +documentary +documentation +doe +dog +doggie +dogsled +dogwood +doing +doll +dollar +dollop +dolman +dolor +dolphin +domain +dome +domination +donation +donkey +donor +donut +door +doorbell +doorknob +doorpost +doorway +dory +dose +dot +double +doubling +doubt +doubter +dough +doughnut +down +downfall +downforce +downgrade +download +downstairs +downtown +downturn +dozen +draft +drag +dragon +dragonfly +dragonfruit +dragster +drain +drainage +drake +drama +dramaturge +drapes +draw +drawbridge +drawer +drawing +dream +dreamer +dredger +dress +dresser +dressing +drill +drink +drinking +drive +driver +driveway +driving +drizzle +dromedary +drop +drudgery +drug +drum +drummer +drunk +dryer +duck +duckling +dud +dude +due +duel +dueling +duffel +dugout +dulcimer +dumbwaiter +dump +dump truck +dune +dune buggy +dungarees +dungeon +duplexer +duration +durian +dusk +dust +dust storm +duster +duty +dwarf +dwell +dwelling +dynamics +dynamite +dynamo +dynasty +dysfunction +e-book +e-mail +e-reader +eagle +eaglet +ear +eardrum +earmuffs +earnings +earplug +earring +earrings +earth +earthquake +earthworm +ease +easel +east +eating +eaves +eavesdropper +ecclesia +echidna +eclipse +ecliptic +ecology +economics +economy +ecosystem +ectoderm +ectodermal +ecumenist +eddy +edge +edger +edible +editing +edition +editor +editorial +education +eel +effacement +effect +effective +effectiveness +effector +efficacy +efficiency +effort +egg +egghead +eggnog +eggplant +ego +eicosanoid +ejector +elbow +elderberry +election +electricity +electrocardiogram +electronics +element +elephant +elevation +elevator +eleventh +elf +elicit +eligibility +elimination +elite +elixir +elk +ellipse +elm +elongation +elver +email +emanate +embarrassment +embassy +embellishment +embossing +embryo +emerald +emergence +emergency +emergent +emery +emission +emitter +emotion +emphasis +empire +employ +employee +employer +employment +empowerment +emu +enactment +encirclement +enclave +enclosure +encounter +encouragement +encyclopedia +end +endive +endoderm +endorsement +endothelium +endpoint +enemy +energy +enforcement +engagement +engine +engineer +engineering +enigma +enjoyment +enquiry +enrollment +enterprise +entertainment +enthusiasm +entirety +entity +entrance +entree +entrepreneur +entry +envelope +environment +envy +enzyme +epauliere +epee +ephemera +ephemeris +ephyra +epic +episode +epithelium +epoch +eponym +epoxy +equal +equality +equation +equinox +equipment +equity +equivalent +era +eraser +erection +erosion +error +escalator +escape +escort +espadrille +espalier +essay +essence +essential +establishment +estate +estimate +estrogen +estuary +eternity +ethernet +ethics +ethnicity +ethyl +euphonium +eurocentrism +evaluation +evaluator +evaporation +eve +evening +evening-wear +event +everybody +everyone +everything +eviction +evidence +evil +evocation +evolution +ex-husband +ex-wife +exaggeration +exam +examination +examiner +example +exasperation +excellence +exception +excerpt +excess +exchange +excitement +exclamation +excursion +excuse +execution +executive +executor +exercise +exhaust +exhaustion +exhibit +exhibition +exile +existence +exit +exocrine +expansion +expansionism +expectancy +expectation +expedition +expense +experience +experiment +experimentation +expert +expertise +explanation +exploration +explorer +explosion +export +expose +exposition +exposure +expression +extension +extent +exterior +external +extinction +extreme +extremist +eye +eyeball +eyebrow +eyebrows +eyeglasses +eyelash +eyelashes +eyelid +eyelids +eyeliner +eyestrain +eyrie +fabric +face +facelift +facet +facility +facsimile +fact +factor +factory +faculty +fahrenheit +fail +failure +fairness +fairy +faith +faithful +fall +fallacy +falling-out +fame +familiar +familiarity +family +fan +fang +fanlight +fanny +fanny-pack +fantasy +farm +farmer +farming +farmland +farrow +fascia +fashion +fat +fate +father +father-in-law +fatigue +fatigues +faucet +fault +fav +fava +favor +favorite +fawn +fax +fear +feast +feather +feature +fedelini +federation +fedora +fee +feed +feedback +feeding +feel +feeling +fellow +felony +female +fen +fence +fencing +fender +feng +fennel +ferret +ferry +ferryboat +fertilizer +festival +fetus +few +fiber +fiberglass +fibre +fibroblast +fibrosis +ficlet +fiction +fiddle +field +fiery +fiesta +fifth +fig +fight +fighter +figure +figurine +file +filing +fill +fillet +filly +film +filter +filth +final +finance +financing +finding +fine +finer +finger +fingerling +fingernail +finish +finisher +fir +fire +fireman +fireplace +firewall +firm +first +fish +fishbone +fisherman +fishery +fishing +fishmonger +fishnet +fisting +fit +fitness +fix +fixture +flag +flair +flame +flan +flanker +flare +flash +flat +flatboat +flavor +flax +fleck +fledgling +fleece +flesh +flexibility +flick +flicker +flight +flint +flintlock +flip-flops +flock +flood +floodplain +floor +floozie +flour +flow +flower +flu +flugelhorn +fluke +flume +flung +flute +fly +flytrap +foal +foam +fob +focus +fog +fold +folder +folk +folklore +follower +following +fondue +font +food +foodstuffs +fool +foot +footage +football +footnote +footprint +footrest +footstep +footstool +footwear +forage +forager +foray +force +ford +forearm +forebear +forecast +forehead +foreigner +forelimb +forest +forestry +forever +forgery +fork +form +formal +formamide +format +formation +former +formicarium +formula +fort +forte +fortnight +fortress +fortune +forum +foundation +founder +founding +fountain +fourths +fowl +fox +foxglove +fraction +fragrance +frame +framework +fratricide +fraud +fraudster +freak +freckle +freedom +freelance +freezer +freezing +freight +freighter +frenzy +freon +frequency +fresco +friction +fridge +friend +friendship +fries +frigate +fright +fringe +fritter +frock +frog +front +frontier +frost +frosting +frown +fruit +frustration +fry +fuck +fuel +fugato +fulfillment +full +fun +function +functionality +fund +funding +fundraising +funeral +fur +furnace +furniture +furry +fusarium +futon +future +gadget +gaffe +gaffer +gain +gaiters +gale +gall-bladder +gallery +galley +gallon +galoshes +gambling +game +gamebird +gaming +gamma-ray +gander +gang +gap +garage +garb +garbage +garden +garlic +garment +garter +gas +gasket +gasoline +gasp +gastronomy +gastropod +gate +gateway +gather +gathering +gator +gauge +gauntlet +gavel +gazebo +gazelle +gear +gearshift +geek +gel +gelatin +gelding +gem +gemsbok +gender +gene +general +generation +generator +generosity +genetics +genie +genius +genocide +genre +gentleman +geography +geology +geometry +geranium +gerbil +gesture +geyser +gherkin +ghost +giant +gift +gig +gigantism +giggle +ginger +gingerbread +ginseng +giraffe +girdle +girl +girlfriend +git +glacier +gladiolus +glance +gland +glass +glasses +glee +glen +glider +gliding +glimpse +globe +glockenspiel +gloom +glory +glove +glow +glucose +glue +glut +glutamate +gnat +gnu +go-kart +goal +goat +gobbler +god +goddess +godfather +godmother +godparent +goggles +going +gold +goldfish +golf +gondola +gong +good +good-bye +goodbye +goodie +goodness +goodnight +goodwill +goose +gopher +gorilla +gosling +gossip +governance +government +governor +gown +grab-bag +grace +grade +gradient +graduate +graduation +graffiti +graft +grain +gram +grammar +gran +grand +grandchild +granddaughter +grandfather +grandma +grandmom +grandmother +grandpa +grandparent +grandson +granny +granola +grant +grape +grapefruit +graph +graphic +grasp +grass +grasshopper +grassland +gratitude +gravel +gravitas +gravity +gravy +gray +grease +great-grandfather +great-grandmother +greatness +greed +green +greenhouse +greens +grenade +grey +grid +grief +grill +grin +grip +gripper +grit +grocery +ground +group +grouper +grouse +grove +growth +grub +guacamole +guarantee +guard +guava +guerrilla +guess +guest +guestbook +guidance +guide +guideline +guilder +guilt +guilty +guinea +guitar +guitarist +gum +gumshoe +gun +gunpowder +gutter +guy +gym +gymnast +gymnastics +gynaecology +gyro +habit +habitat +hacienda +hacksaw +hackwork +hail +hair +haircut +hake +half +half-brother +half-sister +halibut +hall +halloween +hallway +halt +ham +hamburger +hammer +hammock +hamster +hand +hand-holding +handball +handful +handgun +handicap +handle +handlebar +handmaiden +handover +handrail +handsaw +hanger +happening +happiness +harald +harbor +harbour +hard-hat +hardboard +hardcover +hardening +hardhat +hardship +hardware +hare +harm +harmonica +harmonise +harmonize +harmony +harp +harpooner +harpsichord +harvest +harvester +hash +hashtag +hassock +haste +hat +hatbox +hatchet +hatchling +hate +hatred +haunt +haven +haversack +havoc +hawk +hay +haze +hazel +hazelnut +head +headache +headlight +headline +headphones +headquarters +headrest +health +health-care +hearing +hearsay +heart +heart-throb +heartache +heartbeat +hearth +hearthside +heartwood +heat +heater +heating +heaven +heavy +hectare +hedge +hedgehog +heel +heifer +height +heir +heirloom +helicopter +helium +hell +hellcat +hello +helmet +helo +help +hemisphere +hemp +hen +hepatitis +herb +herbs +heritage +hermit +hero +heroine +heron +herring +hesitation +heterosexual +hexagon +heyday +hiccups +hide +hierarchy +high +high-rise +highland +highlight +highway +hike +hiking +hill +hint +hip +hippodrome +hippopotamus +hire +hiring +historian +history +hit +hive +hobbit +hobby +hockey +hoe +hog +hold +holder +hole +holiday +home +homeland +homeownership +hometown +homework +homicide +homogenate +homonym +homosexual +homosexuality +honesty +honey +honeybee +honeydew +honor +honoree +hood +hoof +hook +hop +hope +hops +horde +horizon +hormone +horn +hornet +horror +horse +horseradish +horst +hose +hosiery +hospice +hospital +hospitalisation +hospitality +hospitalization +host +hostel +hostess +hotdog +hotel +hound +hour +hourglass +house +houseboat +household +housewife +housework +housing +hovel +hovercraft +howard +howitzer +hub +hubcap +hubris +hug +hugger +hull +human +humanity +humidity +hummus +humor +humour +hunchback +hundred +hunger +hunt +hunter +hunting +hurdle +hurdler +hurricane +hurry +hurt +husband +hut +hutch +hyacinth +hybridisation +hybridization +hydrant +hydraulics +hydrocarb +hydrocarbon +hydrofoil +hydrogen +hydrolyse +hydrolysis +hydrolyze +hydroxyl +hyena +hygienic +hype +hyphenation +hypochondria +hypothermia +hypothesis +ice +ice-cream +iceberg +icebreaker +icecream +icicle +icing +icon +icy +id +idea +ideal +identification +identity +ideology +idiom +idiot +igloo +ignorance +ignorant +ikebana +illegal +illiteracy +illness +illusion +illustration +image +imagination +imbalance +imitation +immigrant +immigration +immortal +impact +impairment +impala +impediment +implement +implementation +implication +import +importance +impostor +impress +impression +imprisonment +impropriety +improvement +impudence +impulse +in-joke +in-laws +inability +inauguration +inbox +incandescence +incarnation +incense +incentive +inch +incidence +incident +incision +inclusion +income +incompetence +inconvenience +increase +incubation +independence +independent +index +indication +indicator +indigence +individual +industrialisation +industrialization +industry +inequality +inevitable +infancy +infant +infarction +infection +infiltration +infinite +infix +inflammation +inflation +influence +influx +info +information +infrastructure +infusion +inglenook +ingrate +ingredient +inhabitant +inheritance +inhibition +inhibitor +initial +initialise +initialize +initiative +injunction +injury +injustice +ink +inlay +inn +innervation +innocence +innocent +innovation +input +inquiry +inscription +insect +insectarium +insert +inside +insight +insolence +insomnia +inspection +inspector +inspiration +installation +instance +instant +instinct +institute +institution +instruction +instructor +instrument +instrumentalist +instrumentation +insulation +insurance +insurgence +insurrection +integer +integral +integration +integrity +intellect +intelligence +intensity +intent +intention +intentionality +interaction +interchange +interconnection +intercourse +interest +interface +interferometer +interior +interject +interloper +internet +interpretation +interpreter +interval +intervenor +intervention +interview +interviewer +intestine +introduction +intuition +invader +invasion +invention +inventor +inventory +inverse +inversion +investigation +investigator +investment +investor +invitation +invite +invoice +involvement +iridescence +iris +iron +ironclad +irony +irrigation +ischemia +island +isogloss +isolation +issue +item +itinerary +ivory +jack +jackal +jacket +jackfruit +jade +jaguar +jail +jailhouse +jalapeño +jam +jar +jasmine +jaw +jazz +jealousy +jeans +jeep +jelly +jellybeans +jellyfish +jerk +jet +jewel +jeweller +jewellery +jewelry +jicama +jiffy +job +jockey +jodhpurs +joey +jogging +joint +joke +jot +journal +journalism +journalist +journey +joy +judge +judgment +judo +jug +juggernaut +juice +julienne +jumbo +jump +jumper +jumpsuit +jungle +junior +junk +junker +junket +jury +justice +justification +jute +kale +kamikaze +kangaroo +karate +kayak +kazoo +kebab +keep +keeper +kendo +kennel +ketch +ketchup +kettle +kettledrum +key +keyboard +keyboarding +keystone +kick +kick-off +kid +kidney +kielbasa +kill +killer +killing +kilogram +kilometer +kilt +kimono +kinase +kind +kindness +king +kingdom +kingfish +kiosk +kiss +kit +kitchen +kite +kitsch +kitten +kitty +kiwi +knee +kneejerk +knickers +knife +knife-edge +knight +knitting +knock +knot +know-how +knowledge +knuckle +koala +kohlrabi +kumquat +lab +label +labor +laboratory +laborer +labour +labourer +lace +lack +lacquerware +lad +ladder +ladle +lady +ladybug +lag +lake +lamb +lambkin +lament +lamp +lanai +land +landform +landing +landmine +landscape +lane +language +lantern +lap +laparoscope +lapdog +laptop +larch +lard +larder +lark +larva +laryngitis +lasagna +lashes +last +latency +latex +lathe +latitude +latte +latter +laugh +laughter +laundry +lava +law +lawmaker +lawn +lawsuit +lawyer +lay +layer +layout +lead +leader +leadership +leading +leaf +league +leaker +leap +learning +leash +leather +leave +leaver +lecture +leek +leeway +left +leg +legacy +legal +legend +legging +legislation +legislator +legislature +legitimacy +legume +leisure +lemon +lemonade +lemur +lender +lending +length +lens +lentil +leopard +leprosy +leptocephalus +lesbian +lesson +letter +lettuce +level +lever +leverage +leveret +liability +liar +liberty +libido +library +licence +license +licensing +licorice +lid +lie +lieu +lieutenant +life +lifestyle +lifetime +lift +ligand +light +lighting +lightning +lightscreen +ligula +likelihood +likeness +lilac +lily +limb +lime +limestone +limit +limitation +limo +line +linen +liner +linguist +linguistics +lining +link +linkage +linseed +lion +lip +lipid +lipoprotein +lipstick +liquid +liquidity +liquor +list +listening +listing +literate +literature +litigation +litmus +litter +littleneck +liver +livestock +living +lizard +llama +load +loading +loaf +loafer +loan +lobby +lobotomy +lobster +local +locality +location +lock +locker +locket +locomotive +locust +lode +loft +log +loggia +logic +login +logistics +logo +loincloth +lollipop +loneliness +longboat +longitude +look +lookout +loop +loophole +loquat +lord +loss +lot +lotion +lottery +lounge +louse +lout +love +lover +lox +loyalty +luck +luggage +lumber +lumberman +lunch +luncheonette +lunchmeat +lunchroom +lung +lunge +lust +lute +luxury +lychee +lycra +lye +lymphocyte +lynx +lyocell +lyre +lyrics +lysine +mRNA +macadamia +macaroni +macaroon +macaw +machine +machinery +macrame +macro +macrofauna +madam +maelstrom +maestro +magazine +maggot +magic +magnet +magnitude +maid +maiden +mail +mailbox +mailer +mailing +mailman +main +mainland +mainstream +maintainer +maintenance +maize +major +major-league +majority +makeover +maker +makeup +making +male +malice +mall +mallard +mallet +malnutrition +mama +mambo +mammoth +man +manacle +management +manager +manatee +mandarin +mandate +mandolin +mangle +mango +mangrove +manhunt +maniac +manicure +manifestation +manipulation +mankind +manner +manor +mansard +manservant +mansion +mantel +mantle +mantua +manufacturer +manufacturing +many +map +maple +mapping +maracas +marathon +marble +march +mare +margarine +margin +mariachi +marimba +marines +marionberry +mark +marker +market +marketer +marketing +marketplace +marksman +markup +marmalade +marriage +marsh +marshland +marshmallow +marten +marxism +mascara +mask +masonry +mass +massage +mast +master +masterpiece +mastication +mastoid +mat +match +matchmaker +mate +material +maternity +math +mathematics +matrix +matter +mattock +mattress +max +maximum +maybe +mayonnaise +mayor +meadow +meal +mean +meander +meaning +means +meantime +measles +measure +measurement +meat +meatball +meatloaf +mecca +mechanic +mechanism +med +medal +media +median +medication +medicine +medium +meet +meeting +melatonin +melody +melon +member +membership +membrane +meme +memo +memorial +memory +men +menopause +menorah +mention +mentor +menu +merchandise +merchant +mercury +meridian +meringue +merit +mesenchyme +mess +message +messenger +messy +metabolite +metal +metallurgist +metaphor +meteor +meteorology +meter +methane +method +methodology +metric +metro +metronome +mezzanine +microlending +micronutrient +microphone +microwave +mid-course +midden +middle +middleman +midline +midnight +midwife +might +migrant +migration +mile +mileage +milepost +milestone +military +milk +milkshake +mill +millennium +millet +millimeter +million +millisecond +millstone +mime +mimosa +min +mincemeat +mind +mine +mineral +mineshaft +mini +mini-skirt +minibus +minimalism +minimum +mining +minion +minister +mink +minnow +minor +minor-league +minority +mint +minute +miracle +mirror +miscarriage +miscommunication +misfit +misnomer +misogyny +misplacement +misreading +misrepresentation +miss +missile +mission +missionary +mist +mistake +mister +misunderstand +miter +mitten +mix +mixer +mixture +moai +moat +mob +mobile +mobility +mobster +moccasins +mocha +mochi +mode +model +modeling +modem +modernist +modernity +modification +molar +molasses +molding +mole +molecule +mom +moment +monastery +monasticism +money +monger +monitor +monitoring +monk +monkey +monocle +monopoly +monotheism +monsoon +monster +month +monument +mood +moody +moon +moonlight +moonscape +moonshine +moose +mop +morale +morbid +morbidity +morning +moron +morphology +morsel +mortal +mortality +mortgage +mortise +mosque +mosquito +most +motel +moth +mother +mother-in-law +motion +motivation +motive +motor +motorboat +motorcar +motorcycle +mound +mountain +mouse +mouser +mousse +moustache +mouth +mouton +movement +mover +movie +mower +mozzarella +mud +muffin +mug +mukluk +mule +multimedia +murder +muscat +muscatel +muscle +musculature +museum +mushroom +music +music-box +music-making +musician +muskrat +mussel +mustache +mustard +mutation +mutt +mutton +mycoplasma +mystery +myth +mythology +nail +name +naming +nanoparticle +napkin +narrative +nasal +nation +nationality +native +naturalisation +nature +navigation +necessity +neck +necklace +necktie +nectar +nectarine +need +needle +neglect +negligee +negotiation +neighbor +neighborhood +neighbour +neighbourhood +neologism +neon +neonate +nephew +nerve +nest +nestling +nestmate +net +netball +netbook +netsuke +network +networking +neurobiologist +neuron +neuropathologist +neuropsychiatry +news +newsletter +newspaper +newsprint +newsstand +nexus +nibble +nicety +niche +nick +nickel +nickname +niece +night +nightclub +nightgown +nightingale +nightlife +nightlight +nightmare +ninja +nit +nitrogen +nobody +nod +node +noir +noise +nonbeliever +nonconformist +nondisclosure +nonsense +noodle +noodles +noon +norm +normal +normalisation +normalization +north +nose +notation +note +notebook +notepad +nothing +notice +notion +notoriety +nougat +noun +nourishment +novel +nucleotidase +nucleotide +nudge +nuke +number +numeracy +numeric +numismatist +nun +nurse +nursery +nursing +nurture +nut +nutmeg +nutrient +nutrition +nylon +nymph +oak +oar +oasis +oat +oatmeal +oats +obedience +obesity +obi +object +objection +objective +obligation +oboe +observation +observatory +obsession +obsidian +obstacle +occasion +occupation +occurrence +ocean +ocelot +octagon +octave +octavo +octet +octopus +odometer +odyssey +oeuvre +off-ramp +offence +offense +offer +offering +office +officer +official +offset +oil +okra +oldie +oleo +olive +omega +omelet +omission +omnivore +oncology +onion +online +onset +opening +opera +operating +operation +operator +ophthalmologist +opinion +opium +opossum +opponent +opportunist +opportunity +opposite +opposition +optimal +optimisation +optimist +optimization +option +orange +orangutan +orator +orchard +orchestra +orchid +order +ordinary +ordination +ore +oregano +organ +organisation +organising +organization +organizing +orient +orientation +origin +original +originality +ornament +osmosis +osprey +ostrich +other +otter +ottoman +ounce +outback +outcome +outfielder +outfit +outhouse +outlaw +outlay +outlet +outline +outlook +output +outrage +outrigger +outrun +outset +outside +oval +ovary +oven +overcharge +overclocking +overcoat +overexertion +overflight +overhead +overheard +overload +overnighter +overshoot +oversight +overview +overweight +owl +owner +ownership +ox +oxford +oxygen +oyster +ozone +pace +pacemaker +pack +package +packaging +packet +pad +paddle +paddock +pagan +page +pagoda +pail +pain +paint +painter +painting +paintwork +pair +pajamas +palace +palate +palm +pamphlet +pan +pancake +pancreas +panda +panel +panic +pannier +panpipe +pansy +panther +panties +pantologist +pantology +pantry +pants +pantsuit +panty +pantyhose +papa +papaya +paper +paperback +paperwork +parable +parachute +parade +paradise +paragraph +parallelogram +paramecium +paramedic +parameter +paranoia +parcel +parchment +pard +pardon +parent +parenthesis +parenting +park +parka +parking +parliament +parole +parrot +parser +parsley +parsnip +part +participant +participation +particle +particular +partner +partnership +partridge +party +pass +passage +passbook +passenger +passing +passion +passive +passport +password +past +pasta +paste +pastor +pastoralist +pastry +pasture +pat +patch +pate +patent +patentee +path +pathogenesis +pathology +pathway +patience +patient +patina +patio +patriarch +patrimony +patriot +patrol +patroller +patrolling +patron +pattern +patty +pattypan +pause +pavement +pavilion +paw +pawnshop +pay +payee +payment +payoff +pea +peace +peach +peacoat +peacock +peak +peanut +pear +pearl +peasant +pecan +pecker +pedal +peek +peen +peer +peer-to-peer +pegboard +pelican +pelt +pen +penalty +pence +pencil +pendant +pendulum +penguin +penicillin +peninsula +penis +pennant +penny +pension +pentagon +peony +people +pepper +pepperoni +percent +percentage +perception +perch +perennial +perfection +performance +perfume +period +periodical +peripheral +permafrost +permission +permit +perp +perpendicular +persimmon +person +personal +personality +personnel +perspective +pest +pet +petal +petition +petitioner +petticoat +pew +pharmacist +pharmacopoeia +phase +pheasant +phenomenon +phenotype +pheromone +philanthropy +philosopher +philosophy +phone +phosphate +photo +photodiode +photograph +photographer +photography +photoreceptor +phrase +phrasing +physical +physics +physiology +pianist +piano +piccolo +pick +pickax +pickaxe +picket +pickle +pickup +picnic +picture +picturesque +pie +piece +pier +piety +pig +pigeon +piglet +pigpen +pigsty +pike +pilaf +pile +pilgrim +pilgrimage +pill +pillar +pillbox +pillow +pilot +pimp +pimple +pin +pinafore +pince-nez +pine +pineapple +pinecone +ping +pink +pinkie +pinot +pinstripe +pint +pinto +pinworm +pioneer +pipe +pipeline +piracy +pirate +piss +pistol +pit +pita +pitch +pitcher +pitching +pith +pizza +place +placebo +placement +placode +plagiarism +plain +plaintiff +plan +plane +planet +planning +plant +plantation +planter +planula +plaster +plasterboard +plastic +plate +platelet +platform +platinum +platter +platypus +play +player +playground +playroom +playwright +plea +pleasure +pleat +pledge +plenty +plier +pliers +plight +plot +plough +plover +plow +plowman +plug +plugin +plum +plumber +plume +plunger +plywood +pneumonia +pocket +pocket-watch +pocketbook +pod +podcast +poem +poet +poetry +poignance +point +poison +poisoning +poker +polarisation +polarization +pole +polenta +police +policeman +policy +polish +politician +politics +poll +polliwog +pollutant +pollution +polo +polyester +polyp +pomegranate +pomelo +pompom +poncho +pond +pony +pool +poor +pop +popcorn +poppy +popsicle +popularity +population +populist +porcelain +porch +porcupine +pork +porpoise +port +porter +portfolio +porthole +portion +portrait +position +possession +possibility +possible +post +postage +postbox +poster +posterior +postfix +pot +potato +potential +pottery +potty +pouch +poultry +pound +pounding +poverty +powder +power +practice +practitioner +prairie +praise +pray +prayer +precedence +precedent +precipitation +precision +predecessor +preface +preference +prefix +pregnancy +prejudice +prelude +premeditation +premier +premise +premium +preoccupation +preparation +prescription +presence +present +presentation +preservation +preserves +presidency +president +press +pressroom +pressure +pressurisation +pressurization +prestige +presume +pretzel +prevalence +prevention +prey +price +pricing +pride +priest +priesthood +primary +primate +prince +princess +principal +principle +print +printer +printing +prior +priority +prison +prisoner +privacy +private +privilege +prize +prizefight +probability +probation +probe +problem +procedure +proceedings +process +processing +processor +proctor +procurement +produce +producer +product +production +productivity +profession +professional +professor +profile +profit +progenitor +program +programme +programming +progress +progression +prohibition +project +proliferation +promenade +promise +promotion +prompt +pronoun +pronunciation +proof +proof-reader +propaganda +propane +property +prophet +proponent +proportion +proposal +proposition +proprietor +prose +prosecution +prosecutor +prospect +prosperity +prostacyclin +prostanoid +prostrate +protection +protein +protest +protocol +providence +provider +province +provision +prow +proximal +proximity +prune +pruner +pseudocode +pseudoscience +psychiatrist +psychoanalyst +psychologist +psychology +ptarmigan +pub +public +publication +publicity +publisher +publishing +pudding +puddle +puffin +pug +puggle +pulley +pulse +puma +pump +pumpernickel +pumpkin +pumpkinseed +pun +punch +punctuation +punishment +pup +pupa +pupil +puppet +puppy +purchase +puritan +purity +purple +purpose +purr +purse +pursuit +push +pusher +put +puzzle +pyramid +pyridine +quadrant +quail +qualification +quality +quantity +quart +quarter +quartet +quartz +queen +query +quest +question +questioner +questionnaire +quiche +quicksand +quiet +quill +quilt +quince +quinoa +quit +quiver +quota +quotation +quote +rabbi +rabbit +raccoon +race +racer +racing +racism +racist +rack +radar +radiator +radio +radiosonde +radish +raffle +raft +rag +rage +raid +rail +railing +railroad +railway +raiment +rain +rainbow +raincoat +rainmaker +rainstorm +rainy +raise +raisin +rake +rally +ram +rambler +ramen +ramie +ranch +rancher +randomisation +randomization +range +ranger +rank +rap +rape +raspberry +rat +rate +ratepayer +rating +ratio +rationale +rations +raven +ravioli +rawhide +ray +rayon +razor +reach +reactant +reaction +read +reader +readiness +reading +real +reality +realization +realm +reamer +rear +reason +reasoning +rebel +rebellion +reboot +recall +recapitulation +receipt +receiver +reception +receptor +recess +recession +recipe +recipient +reciprocity +reclamation +recliner +recognition +recollection +recommendation +reconsideration +record +recorder +recording +recovery +recreation +recruit +rectangle +red +redesign +redhead +redirect +rediscovery +reduction +reef +refectory +reference +referendum +reflection +reform +refreshments +refrigerator +refuge +refund +refusal +refuse +regard +regime +region +regionalism +register +registration +registry +regret +regulation +regulator +rehospitalisation +rehospitalization +reindeer +reinscription +reject +relation +relationship +relative +relaxation +relay +release +reliability +relief +religion +relish +reluctance +remains +remark +reminder +remnant +remote +removal +renaissance +rent +reorganisation +reorganization +repair +reparation +repayment +repeat +replacement +replica +replication +reply +report +reporter +reporting +repository +representation +representative +reprocessing +republic +republican +reputation +request +requirement +resale +rescue +research +researcher +resemblance +reservation +reserve +reservoir +reset +residence +resident +residue +resist +resistance +resolution +resolve +resort +resource +respect +respite +response +responsibility +rest +restaurant +restoration +restriction +restroom +restructuring +result +resume +retailer +retention +rethinking +retina +retirement +retouching +retreat +retrospect +retrospective +retrospectivity +return +reunion +revascularisation +revascularization +reveal +revelation +revenant +revenge +revenue +reversal +reverse +review +revitalisation +revitalization +revival +revolution +revolver +reward +rhetoric +rheumatism +rhinoceros +rhubarb +rhyme +rhythm +rib +ribbon +rice +riddle +ride +rider +ridge +riding +rifle +right +rim +ring +ringworm +riot +rip +ripple +rise +riser +risk +rite +ritual +river +riverbed +rivulet +road +roadway +roar +roast +robe +robin +robot +robotics +rock +rocker +rocket +rocket-ship +rod +role +roll +roller +romaine +romance +roof +room +roommate +rooster +root +rope +rose +rosemary +roster +rostrum +rotation +round +roundabout +route +router +routine +row +rowboat +rowing +rubber +rubbish +rubric +ruby +ruckus +rudiment +ruffle +rug +rugby +ruin +rule +ruler +ruling +rum +rumor +run +runaway +runner +running +runway +rush +rust +rutabaga +rye +sabre +sac +sack +saddle +sadness +safari +safe +safeguard +safety +saffron +sage +sail +sailboat +sailing +sailor +saint +sake +salad +salami +salary +sale +salesman +salmon +salon +saloon +salsa +salt +salute +samovar +sampan +sample +samurai +sanction +sanctity +sanctuary +sand +sandal +sandbar +sandpaper +sandwich +sanity +sardine +sari +sarong +sash +satellite +satin +satire +satisfaction +sauce +saucer +sauerkraut +sausage +savage +savannah +saving +savings +savior +saviour +savory +saw +saxophone +scaffold +scale +scallion +scallops +scalp +scam +scanner +scarecrow +scarf +scarification +scenario +scene +scenery +scent +schedule +scheduling +schema +scheme +schizophrenic +schnitzel +scholar +scholarship +school +schoolhouse +schooner +science +scientist +scimitar +scissors +scooter +scope +score +scorn +scorpion +scotch +scout +scow +scrambled +scrap +scraper +scratch +screamer +screen +screening +screenwriting +screw +screw-up +screwdriver +scrim +scrip +script +scripture +scrutiny +sculpting +sculptural +sculpture +sea +seabass +seafood +seagull +seal +seaplane +search +seashore +seaside +season +seat +seaweed +second +secrecy +secret +secretariat +secretary +secretion +section +sectional +sector +security +sediment +seed +seeder +seeker +seep +segment +seizure +selection +self +self-confidence +self-control +self-esteem +seller +selling +semantics +semester +semicircle +semicolon +semiconductor +seminar +senate +senator +sender +senior +sense +sensibility +sensitive +sensitivity +sensor +sentence +sentencing +sentiment +sepal +separation +septicaemia +sequel +sequence +serial +series +sermon +serum +serval +servant +server +service +servitude +sesame +session +set +setback +setting +settlement +settler +severity +sewer +sex +sexuality +shack +shackle +shade +shadow +shadowbox +shakedown +shaker +shallot +shallows +shame +shampoo +shanty +shape +share +shareholder +shark +shaw +shawl +shear +shearling +sheath +shed +sheep +sheet +shelf +shell +shelter +sherbet +sherry +shield +shift +shin +shine +shingle +ship +shipper +shipping +shipyard +shirt +shirtdress +shit +shoat +shock +shoe +shoe-horn +shoehorn +shoelace +shoemaker +shoes +shoestring +shofar +shoot +shootdown +shop +shopper +shopping +shore +shoreline +short +shortage +shorts +shortwave +shot +shoulder +shout +shovel +show +show-stopper +shower +shred +shrimp +shrine +shutdown +sibling +sick +sickness +side +sideboard +sideburns +sidecar +sidestream +sidewalk +siding +siege +sigh +sight +sightseeing +sign +signal +signature +signet +significance +signify +signup +silence +silica +silicon +silk +silkworm +sill +silly +silo +silver +similarity +simple +simplicity +simplification +simvastatin +sin +singer +singing +singular +sink +sinuosity +sip +sir +sister +sister-in-law +sitar +site +situation +size +skate +skating +skean +skeleton +ski +skiing +skill +skin +skirt +skull +skullcap +skullduggery +skunk +sky +skylight +skyline +skyscraper +skywalk +slang +slapstick +slash +slate +slave +slavery +slaw +sled +sledge +sleep +sleepiness +sleeping +sleet +sleuth +slice +slide +slider +slime +slip +slipper +slippers +slope +slot +sloth +slump +smell +smelting +smile +smith +smock +smog +smoke +smoking +smolt +smuggling +snack +snail +snake +snakebite +snap +snarl +sneaker +sneakers +sneeze +sniffle +snob +snorer +snow +snowboarding +snowflake +snowman +snowmobiling +snowplow +snowstorm +snowsuit +snuck +snug +snuggle +soap +soccer +socialism +socialist +society +sociology +sock +socks +soda +sofa +softball +softdrink +softening +software +soil +soldier +sole +solicitation +solicitor +solidarity +solidity +soliloquy +solitaire +solution +solvency +sombrero +somebody +someone +someplace +somersault +something +somewhere +son +sonar +sonata +song +songbird +sonnet +soot +sophomore +soprano +sorbet +sorghum +sorrel +sorrow +sort +soul +soulmate +sound +soundness +soup +source +sourwood +sousaphone +south +southeast +souvenir +sovereignty +sow +soy +soybean +space +spacing +spade +spaghetti +span +spandex +spank +sparerib +spark +sparrow +spasm +spat +spatula +spawn +speaker +speakerphone +speaking +spear +spec +special +specialist +specialty +species +specification +spectacle +spectacles +spectrograph +spectrum +speculation +speech +speed +speedboat +spell +spelling +spelt +spending +sphere +sphynx +spice +spider +spiderling +spike +spill +spinach +spine +spiral +spirit +spiritual +spirituality +spit +spite +spleen +splendor +split +spokesman +spokeswoman +sponge +sponsor +sponsorship +spool +spoon +spork +sport +sportsman +spot +spotlight +spouse +sprag +sprat +spray +spread +spreadsheet +spree +spring +sprinkles +sprinter +sprout +spruce +spud +spume +spur +spy +spyglass +square +squash +squatter +squeegee +squid +squirrel +stab +stability +stable +stack +stacking +stadium +staff +stag +stage +stain +stair +staircase +stake +stalk +stall +stallion +stamen +stamina +stamp +stance +stand +standard +standardisation +standardization +standing +standoff +standpoint +star +starboard +start +starter +state +statement +statin +station +station-wagon +statistic +statistics +statue +status +statute +stay +steak +stealth +steam +steamroller +steel +steeple +stem +stench +stencil +step +step-aunt +step-brother +step-daughter +step-father +step-grandfather +step-grandmother +step-mother +step-sister +step-son +step-uncle +stepdaughter +stepmother +stepping-stone +stepson +stereo +stew +steward +stick +sticker +stiletto +still +stimulation +stimulus +sting +stinger +stir-fry +stitch +stitcher +stock +stock-in-trade +stockings +stole +stomach +stone +stonework +stool +stop +stopsign +stopwatch +storage +store +storey +storm +story +story-telling +storyboard +stot +stove +strait +strand +stranger +strap +strategy +straw +strawberry +strawman +stream +street +streetcar +strength +stress +stretch +strife +strike +string +strip +stripe +strobe +stroke +structure +strudel +struggle +stucco +stud +student +studio +study +stuff +stumbling +stump +stupidity +sturgeon +sty +style +styling +stylus +sub +subcomponent +subconscious +subcontractor +subexpression +subgroup +subject +submarine +submitter +subprime +subroutine +subscription +subsection +subset +subsidence +subsidiary +subsidy +substance +substitution +subtitle +suburb +subway +success +succotash +suck +sucker +suede +suet +suffocation +sugar +suggestion +suicide +suit +suitcase +suite +sulfur +sultan +sum +summary +summer +summit +sun +sunbeam +sunbonnet +sundae +sunday +sundial +sunflower +sunglasses +sunlamp +sunlight +sunrise +sunroom +sunset +sunshine +superiority +supermarket +supernatural +supervision +supervisor +supper +supplement +supplier +supply +support +supporter +suppression +supreme +surface +surfboard +surge +surgeon +surgery +surname +surplus +surprise +surround +surroundings +surrounds +survey +survival +survivor +sushi +suspect +suspenders +suspension +sustainment +sustenance +swallow +swamp +swan +swanling +swath +sweat +sweater +sweatshirt +sweatshop +sweatsuit +sweets +swell +swim +swimming +swimsuit +swine +swing +switch +switchboard +switching +swivel +sword +swordfight +swordfish +sycamore +symbol +symmetry +sympathy +symptom +syndicate +syndrome +synergy +synod +synonym +synthesis +syrup +system +t-shirt +tab +tabby +tabernacle +table +tablecloth +tablet +tabletop +tachometer +tackle +taco +tactics +tactile +tadpole +tag +tail +tailbud +tailor +tailspin +take-out +takeover +tale +talent +talk +talking +tam-o'-shanter +tamale +tambour +tambourine +tan +tandem +tangerine +tank +tank-top +tanker +tankful +tap +tape +tapioca +target +taro +tarragon +tart +task +tassel +taste +tatami +tattler +tattoo +tavern +tax +taxi +taxicab +taxpayer +tea +teacher +teaching +team +teammate +teapot +tear +tech +technician +technique +technologist +technology +tectonics +teen +teenager +teepee +telephone +telescreen +teletype +television +tell +teller +temp +temper +temperature +temple +tempo +temporariness +temporary +temptation +temptress +tenant +tendency +tender +tenement +tenet +tennis +tenor +tension +tensor +tent +tentacle +tenth +tepee +teriyaki +term +terminal +termination +terminology +termite +terrace +terracotta +terrapin +terrarium +territory +terror +terrorism +terrorist +test +testament +testimonial +testimony +testing +text +textbook +textual +texture +thanks +thaw +theater +theft +theism +theme +theology +theory +therapist +therapy +thermals +thermometer +thermostat +thesis +thickness +thief +thigh +thing +thinking +thirst +thistle +thong +thongs +thorn +thought +thousand +thread +threat +threshold +thrift +thrill +throat +throne +thrush +thrust +thug +thumb +thump +thunder +thunderbolt +thunderhead +thunderstorm +thyme +tiara +tic +tick +ticket +tide +tie +tiger +tights +tile +till +tilt +timbale +timber +time +timeline +timeout +timer +timetable +timing +timpani +tin +tinderbox +tinkle +tintype +tip +tire +tissue +titanium +title +toad +toast +toaster +tobacco +today +toe +toenail +toffee +tofu +tog +toga +toilet +tolerance +tolerant +toll +tom-tom +tomatillo +tomato +tomb +tomography +tomorrow +ton +tonality +tone +tongue +tonic +tonight +tool +toot +tooth +toothbrush +toothpaste +toothpick +top +top-hat +topic +topsail +toque +toreador +tornado +torso +torte +tortellini +tortilla +tortoise +tosser +total +tote +touch +tough-guy +tour +tourism +tourist +tournament +tow-truck +towel +tower +town +townhouse +township +toy +trace +trachoma +track +tracking +tracksuit +tract +tractor +trade +trader +trading +tradition +traditionalism +traffic +trafficker +tragedy +trail +trailer +trailpatrol +train +trainer +training +trait +tram +tramp +trance +transaction +transcript +transfer +transformation +transit +transition +translation +transmission +transom +transparency +transplantation +transport +transportation +trap +trapdoor +trapezium +trapezoid +trash +travel +traveler +tray +treasure +treasury +treat +treatment +treaty +tree +trek +trellis +tremor +trench +trend +triad +trial +triangle +tribe +tributary +trick +trigger +trigonometry +trillion +trim +trinket +trip +tripod +tritone +triumph +trolley +trombone +troop +trooper +trophy +trouble +trousers +trout +trove +trowel +truck +trumpet +trunk +trust +trustee +truth +try +tsunami +tub +tuba +tube +tuber +tug +tugboat +tuition +tulip +tumbler +tummy +tuna +tune +tune-up +tunic +tunnel +turban +turf +turkey +turmeric +turn +turning +turnip +turnover +turnstile +turret +turtle +tusk +tussle +tutu +tuxedo +tweet +tweezers +twig +twilight +twine +twins +twist +twister +twitter +type +typeface +typewriter +typhoon +ukulele +ultimatum +umbrella +unblinking +uncertainty +uncle +underclothes +underestimate +underground +underneath +underpants +underpass +undershirt +understanding +understatement +undertaker +underwear +underweight +underwire +underwriting +unemployment +unibody +uniform +uniformity +union +unique +unit +unity +universe +university +update +upgrade +uplift +upper +upstairs +upward +urge +urgency +urn +usage +use +user +usher +usual +utensil +utilisation +utility +utilization +vacation +vaccine +vacuum +vagrant +valance +valentine +validate +validity +valley +valuable +value +vampire +van +vanadyl +vane +vanilla +vanity +variability +variable +variant +variation +variety +vascular +vase +vault +vaulting +veal +vector +vegetable +vegetarian +vegetarianism +vegetation +vehicle +veil +vein +veldt +vellum +velocity +velodrome +velvet +vendor +veneer +vengeance +venison +venom +venti +venture +venue +veranda +verb +verdict +verification +vermicelli +vernacular +verse +version +vertigo +verve +vessel +vest +vestment +vet +veteran +veterinarian +veto +viability +vibe +vibraphone +vibration +vibrissae +vice +vicinity +victim +victory +video +view +viewer +vignette +villa +village +vine +vinegar +vineyard +vintage +vintner +vinyl +viola +violation +violence +violet +violin +virginal +virtue +virus +visa +viscose +vise +vision +visit +visitor +visor +vista +visual +vitality +vitamin +vitro +vivo +vixen +vodka +vogue +voice +void +vol +volatility +volcano +volleyball +volume +volunteer +volunteering +vomit +vote +voter +voting +voyage +vulture +wad +wafer +waffle +wage +wagon +waist +waistband +wait +waiter +waiting +waitress +waiver +wake +walk +walker +walking +walkway +wall +wallaby +wallet +walnut +walrus +wampum +wannabe +want +war +warden +wardrobe +warfare +warlock +warlord +warm-up +warming +warmth +warning +warrant +warren +warrior +wasabi +wash +washbasin +washcloth +washer +washtub +wasp +waste +wastebasket +wasting +watch +watcher +watchmaker +water +waterbed +watercress +waterfall +waterfront +watermelon +waterskiing +waterspout +waterwheel +wave +waveform +wax +way +weakness +wealth +weapon +wear +weasel +weather +web +webinar +webmail +webpage +website +wedding +wedge +weed +weeder +weedkiller +week +weekend +weekender +weight +weird +welcome +welfare +well +well-being +west +western +wet-bar +wetland +wetsuit +whack +whale +wharf +wheat +wheel +whelp +whey +whip +whirlpool +whirlwind +whisker +whiskey +whisper +whistle +white +whole +wholesale +wholesaler +whorl +wick +widget +widow +width +wife +wifi +wild +wildebeest +wilderness +wildlife +will +willingness +willow +win +wind +wind-chime +windage +window +windscreen +windshield +wine +winery +wing +wingman +wingtip +wink +winner +winter +wire +wiretap +wiring +wisdom +wiseguy +wish +wisteria +wit +witch +witch-hunt +withdrawal +witness +wok +wolf +woman +wombat +wonder +wont +wood +woodchuck +woodland +woodshed +woodwind +wool +woolens +word +wording +work +workbench +worker +workforce +workhorse +working +workout +workplace +workshop +world +worm +worry +worship +worshiper +worth +wound +wrap +wraparound +wrapper +wrapping +wreck +wrecker +wren +wrench +wrestler +wriggler +wrinkle +wrist +writer +writing +wrong +xylophone +yacht +yahoo +yak +yam +yang +yard +yarmulke +yarn +yawl +year +yeast +yellow +yellowjacket +yesterday +yew +yin +yoga +yogurt +yoke +yolk +young +youngster +yourself +youth +yoyo +yurt +zampone +zebra +zebrafish +zen +zephyr +zero +ziggurat +zinc +zipper +zither +zombie +zone +zoo +zoologist +zoology +zoot-suit +zucchini diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index d23b5a71ad0..1fcca3c6068 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -1046,14 +1046,6 @@ $(function() { location.reload(); }); - // Tell BYOND to give us a macro list. - // I don't know why but for some retarded reason, - // You need to activate hotkeymode before you can winget the macros in it. - runByond('byond://winset?id=mainwindow¯o=hotkeymode') - runByond('byond://winset?id=mainwindow¯o=macro') - - runByond('byond://winget?callback=wingetMacros&id=hotkeymode.*&property=command'); - /***************************************** * * KICK EVERYTHING OFF diff --git a/html/browser/autocomplete.js b/html/browser/autocomplete.js new file mode 100644 index 00000000000..1ca11553b99 --- /dev/null +++ b/html/browser/autocomplete.js @@ -0,0 +1,53 @@ +var $ = document.querySelector.bind(document); +var input; +var submitButton; +var optionsMap = {}; + +function updateTopic() { + if (!input || !submitButton) { + return; + } + + var hrefList = submitButton.getAttribute('href').split(';'); + // Topic must come last in the submit button for this to work + hrefList = hrefList.slice(0, hrefList.length - 1); + hrefList.push(optionsMap[input.value] ? 'submit=' + optionsMap[input.value] : ''); + submitButton.setAttribute('href', hrefList.join(';')); +} + +function setElements() { + input = $('#input'); + submitButton = $('#submit-button'); + var choices = $('#choices'); + + if (!input || !submitButton || !choices) { + return; + } + + + for (var i = 0; i < choices.options.length; i++) { + var name = choices.options[i].value; + var cleaned = decodeURI(name); + optionsMap[cleaned] = name; + choices.options[i].value = cleaned; + } + + input.addEventListener('keyup', function(event) { + if (event.key !== 'Enter') { + return; + } + + if (Object.keys(optionsMap).indexOf(input.value) === -1) { + // Byond doesn't let you to use enter to select + // so we need to prevent unintended submissions + return + } + + submitButton.click(); + event.preventDefault(); + }); + + input.focus(); +} + +window.onload = setElements; diff --git a/html/browser/marked.js b/html/browser/marked.js new file mode 100644 index 00000000000..6fe0e1e4e41 --- /dev/null +++ b/html/browser/marked.js @@ -0,0 +1,26 @@ +/** + * marked - a markdown parser + * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT Licensed) + * https://github.com/markedjs/marked + */ +!function(e){"use strict";var _={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:f,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,nptable:f,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|\\n*|\\n*|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:f,lheading:/^([^\n]+)\n {0,3}(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,text:/^[^\n]+/};function a(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||m.defaults,this.rules=_.normal,this.options.pedantic?this.rules=_.pedantic:this.options.gfm&&(this.options.tables?this.rules=_.tables:this.rules=_.gfm)}_._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,_.def=i(_.def).replace("label",_._label).replace("title",_._title).getRegex(),_.bullet=/(?:[*+-]|\d{1,9}\.)/,_.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,_.item=i(_.item,"gm").replace(/bull/g,_.bullet).getRegex(),_.list=i(_.list).replace(/bull/g,_.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+_.def.source+")").getRegex(),_._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",_._comment=//,_.html=i(_.html,"i").replace("comment",_._comment).replace("tag",_._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),_.paragraph=i(_.paragraph).replace("hr",_.hr).replace("heading",_.heading).replace("lheading",_.lheading).replace("tag",_._tag).getRegex(),_.blockquote=i(_.blockquote).replace("paragraph",_.paragraph).getRegex(),_.normal=d({},_),_.gfm=d({},_.normal,{fences:/^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),_.gfm.paragraph=i(_.paragraph).replace("(?!","(?!"+_.gfm.fences.source.replace("\\1","\\2")+"|"+_.list.source.replace("\\1","\\3")+"|").getRegex(),_.tables=d({},_.gfm,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),_.pedantic=d({},_.normal,{html:i("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",_._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/}),a.rules=_,a.lex=function(e,t){return new a(t).lex(e)},a.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},a.prototype.token=function(e,t){var n,r,s,i,l,o,a,h,p,u,c,g,f,d,k,m,b,x;for(e=e.replace(/^ +$/gm,"");e;)if((s=this.rules.newline.exec(e))&&(e=e.substring(s[0].length),1 ?/gm,""),x=1;b.match(/^ {0,3}>/);)x++,this.tokens.push({type:"blockquote_start"}),b=b.replace(/^ *> ?/gm,"");for(this.token(b,t),c=0;c?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:f,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,em:/^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:f,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\?@\\[^_{|}~",n.em=i(n.em).replace(/punctuation/g,n._punctuation).getRegex(),n._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,n._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,n._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,n.autolink=i(n.autolink).replace("scheme",n._scheme).replace("email",n._email).getRegex(),n._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,n.tag=i(n.tag).replace("comment",_._comment).replace("attribute",n._attribute).getRegex(),n._label=/(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|`(?!`)|[^\[\]\\`])*?/,n._href=/\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/,n._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,n.link=i(n.link).replace("label",n._label).replace("href",n._href).replace("title",n._title).getRegex(),n.reflink=i(n.reflink).replace("label",n._label).getRegex(),n.normal=d({},n),n.pedantic=d({},n.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:i(/^!?\[(label)\]\((.*?)\)/).replace("label",n._label).getRegex(),reflink:i(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",n._label).getRegex()}),n.gfm=d({},n.normal,{escape:i(n.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\/i.test(i[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(i[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(i[0])&&(this.inRawBlock=!1),e=e.substring(i[0].length),o+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):u(i[0]):i[0];else if(i=this.rules.link.exec(e)){var a=k(i[2],"()");if(-1$/,"$1"),o+=this.outputLink(i,{href:p.escapes(r),title:p.escapes(s)}),this.inLink=!1}else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),!(t=this.links[t.toLowerCase()])||!t.href){o+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,o+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),o+=this.renderer.strong(this.output(i[4]||i[3]||i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),o+=this.renderer.em(this.output(i[6]||i[5]||i[4]||i[3]||i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),o+=this.renderer.codespan(u(i[2].trim(),!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),o+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),o+=this.renderer.del(this.output(i[1]));else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),r="@"===i[2]?"mailto:"+(n=u(this.mangle(i[1]))):n=u(i[1]),o+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.inRawBlock?o+=this.renderer.text(i[0]):o+=this.renderer.text(u(this.smartypants(i[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else{if("@"===i[2])r="mailto:"+(n=u(i[0]));else{for(;l=i[0],i[0]=this.rules._backpedal.exec(i[0])[0],l!==i[0];);n=u(i[0]),r="www."===i[1]?"http://"+n:n}e=e.substring(i[0].length),o+=this.renderer.link(r,null,n)}return o},p.escapes=function(e){return e?e.replace(p.rules._escapes,"$1"):e},p.prototype.outputLink=function(e,t){var n=t.href,r=t.title?u(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,u(e[1]))},p.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},p.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,s=0;s'+(n?e:u(e,!0))+"\n":"
"+(n?e:u(e,!0))+"
"},r.prototype.blockquote=function(e){return"
\n"+e+"
\n"},r.prototype.html=function(e){return e},r.prototype.heading=function(e,t,n,r){return this.options.headerIds?"'+e+"\n":""+e+"\n"},r.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"},r.prototype.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"},r.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},r.prototype.checkbox=function(e){return" "},r.prototype.paragraph=function(e){return"

    "+e+"

    \n"},r.prototype.table=function(e,t){return t&&(t="
    "+t+""),"

    Name

    Status

    Location

    Control

    [Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model])
    \n\n"+e+"\n"+t+"
    \n"},r.prototype.tablerow=function(e){return"\n"+e+"\n"},r.prototype.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"\n"},r.prototype.strong=function(e){return""+e+""},r.prototype.em=function(e){return""+e+""},r.prototype.codespan=function(e){return""+e+""},r.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},r.prototype.del=function(e){return""+e+""},r.prototype.link=function(e,t,n){if(null===(e=l(this.options.sanitize,this.options.baseUrl,e)))return n;var r='"},r.prototype.image=function(e,t,n){if(null===(e=l(this.options.sanitize,this.options.baseUrl,e)))return n;var r=''+n+'":">"},r.prototype.text=function(e){return e},s.prototype.strong=s.prototype.em=s.prototype.codespan=s.prototype.del=s.prototype.text=function(e){return e},s.prototype.link=s.prototype.image=function(e,t,n){return""+n},s.prototype.br=function(){return""},h.parse=function(e,t){return new h(t).parse(e)},h.prototype.parse=function(e){this.inline=new p(e.links,this.options),this.inlineText=new p(e.links,d({},this.options,{renderer:new s})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},h.prototype.next=function(){return this.token=this.tokens.pop(),this.token},h.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},h.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},h.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,g(this.inlineText.output(this.token.text)),this.slugger);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,s="",i="";for(n="",e=0;e?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t))for(var n=t;this.seen[n]++,t=n+"-"+this.seen[n],this.seen.hasOwnProperty(t););return this.seen[t]=0,t},u.escapeTest=/[&<>"']/,u.escapeReplace=/[&<>"']/g,u.replacements={"&":"&","<":"<",">":">",'"':""","'":"'"},u.escapeTestNoEncode=/[<>"']|&(?!#?\w+;)/,u.escapeReplaceNoEncode=/[<>"']|&(?!#?\w+;)/g;var o={},c=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function f(){}function d(e){for(var t,n,r=1;rt)n.splice(t);else for(;n.lengthAn error occurred:

    "+u(e.message+"",!0)+"
    ";throw e}}f.exec=f,m.options=m.setOptions=function(e){return d(m.defaults,e),m},m.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new r,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tables:!0,xhtml:!1}},m.defaults=m.getDefaults(),m.Parser=h,m.parser=h.parse,m.Renderer=r,m.TextRenderer=s,m.Lexer=a,m.lexer=a.lex,m.InlineLexer=p,m.inlineLexer=p.output,m.Slugger=t,m.parse=m,"undefined"!=typeof module&&"object"==typeof exports?module.exports=m:"function"==typeof define&&define.amd?define(function(){return m}):e.marked=m}(this||("undefined"!=typeof window?window:global)); +var $ = document.querySelector.bind(document); + +function parse(node) { + for (var i = 0; i < node.childNodes.length; i++) { + parse(node.childNodes[i]); + } + + if(!node.innerHTML) { + return; + } + node.innerHTML = marked(node.innerHTML.replace(/
    /gi, '\n'), { breaks: true }); +} + +function main() { + if ($('#markdown')) { + parse($('#markdown')); + } +} + +window.onload = main; diff --git a/html/changelog.html b/html/changelog.html index 1d3eb4038b5..b639984a5a6 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,319 @@ -->
    +

    08 July 2019

    +

    Arkatos updated:

    +
      +
    • Clicking on a health doll icon will now check you for injuries
    • +
    • Rechargers now show their contents and charge status on close examine
    • +
    • Smartfridge will now try to put an item in your hands after vending, if able
    • +
    +

    AzuleUtama updated:

    +
      +
    • The cybernetic implant bundle can no longer be bought by traitors.
    • +
    +

    Citinited updated:

    +
      +
    • Alt-clicking the RPD now brings up a radial menu with rotate, flip, and delete modes accessible. The main interface remains unchanged.
    • +
    • Writing in blood can't be done while dead or incapacitated any more
    • +
    • You can't write stuff in blood at a distance any more
    • +
    +

    Couls updated:

    +
      +
    • lantern sprites
    • +
    • typo in msg
    • +
    +

    Improvedname updated:

    +
      +
    • Explorer suits now properly hide tails
    • +
    +

    JKnutson101 updated:

    +
      +
    • Fixed Construction Permits deleting themselves prematurely.
    • +
    +

    Kyep updated:

    +
      +
    • fixed a bug with biogenerator.
    • +
    +

    Markolie updated:

    +
      +
    • Ghosts can now see all PDA messages when enabled through a preference setting.
    • +
    • The Mask of Nar'Sie transformation buttons have been removed, as the mask was removed a long time ago.
    • +
    +

    Shadeykins updated:

    +
      +
    • Changed Quarantine, NT Default, Aggressive, and Corporate AI lawsets. balance: Reduced the ability for NT Default AI's to murder people just because.
    • +
    • Removed several redundancies in Aggressive lawset.
    • +
    • Fixed a few subject-verb disagreements (is -> are).
    • +
    +

    Tayyyyyyy updated:

    +
      +
    • paper supports markdown as well as pencode
    • +
    • Autocomplete for ghost buttons
    • +
    • PMs window scrollable
    • +
    • Fix a bug where a player who reconnects is still shown as disconnected
    • +
    +

    datlo updated:

    +
      +
    • Fix an antag rolling exploit.
    • +
    + +

    30 June 2019

    +

    Crazylemon64 updated:

    +
      +
    • SDQL2 no longer allows a macro argument
    • +
    + +

    28 June 2019

    +

    AffectedArc07 updated:

    +
      +
    • SSticker
    • +
    • You can no longer force-start a round unless its fully initialised.
    • +
    • Tweaks some preference orders
    • +
    • Moved a global define
    • +
    +

    Akatos updated:

    +
      +
    • Smartfridges now visually show approximate number of items inside
    • +
    +

    Arkatos updated:

    +
      +
    • Ragin' Mages gamemode should now be playable without any major issue
    • +
    • Slaughter and Laughter Demons no longer have duplicit objective shown at the Round End
    • +
    • Laughter Demon is now properly called Laughter Demon instead of Slaughter Demon in the role polls
    • +
    • Improved wording and fixed mistakes in Wizard and Ragin' Mages gamemodes
    • +
    • Wizards are now properly polled in the Ragin' Mages gamemode
    • +
    • You can no longer buy Summon Ghosts spell in the Ragin' Mages gamemode
    • +
    • You can no longer buy Bind Soul spell in the Ragin' Mages gamemode
    • +
    • Deck of tarot cards renamed to Guardian Deck in the Wizard spellbook
    • +
    • Rituals and Challenges categories merged into one in the Wizard spellbook
    • +
    • Laughter Demon is now slightly weaker compared to the Slaughter Demon
    • +
    • Bottle of Ooze now creates a magical morph instead of a normal one. Magical morph is capable of casting smoke and forcewall spells.
    • +
    • Visible ghosts will now get a special description about their visibility
    • +
    • Removed Cursed Heart from the Wizard spellbook
    • +
    • Changeling verbs replaced with action buttons
    • +
    • Changeling ability descriptions updated
    • +
    • Added custom icons for changeling action buttons
    • +
    • Added movement animation for mice, chickens and killer tomatoes
    • +
    • Added inhand sprite for eggbox
    • +
    • Added inhand sprites for all types of soaps
    • +
    • Added inhand sprite for small parcel
    • +
    • Added inhand sprite for sechailer
    • +
    • Added inhand sprite for bag of holding
    • +
    • Added new system for outputting contents of smartfridges
    • +
    • Blob split consciousness ability now requires you to directly target a node you want to turn into another sentient overmind instead of selecting a nearest one
    • +
    • Fixed and improved some descriptions regarding Blob offspring
    • +
    • Fixed a case where ghosts had an extra ghost icon visible on them
    • +
    • Fixed a case where some ghosts were too bright
    • +
    • You are now unable to swap forms with another changeling
    • +
    • You can no longer hiss while muzzled
    • +
    • Upon purchasing Augmented Eyesight changeling ability, changeling immediately receives passive version of the ability
    • +
    • Changelings in the lesser form can now toggle Augmented Eyesight ability
    • +
    • Changelings are now removed properly via Traitor Panel
    • +
    • Changelings do not get their action buttons bugged when using Swap Forms ability now
    • +
    • Action buttons should update their cooldown statuses more reliably
    • +
    • Changelings should now correctly receive their action buttons
    • +
    • Changelings now do not steal action buttons from other changelings
    • +
    • Added new Boo! spell icon
    • +
    +

    Christasmurf updated:

    +
      +
    • Fixes a random pixel on the leather shoes
    • +
    +

    Citinited updated:

    +
      +
    • Boo affects APCs again
    • +
    • Boo no longer fully charges when you enter your corpse
    • +
    • The button to close radial menus is much more obvious and easily-clickable now
    • +
    • Destroying a disposals trunk should no longer occasionally delete things held inside it.
    • +
    • Fixes conveyor belts not moving items spawned via an autolathe. (And other possible behaviours when machines switch between speed and normal processes)
    • +
    • Ports liquid dispenser sprites from tgstation.
    • +
    +

    Couls updated:

    +
      +
    • Only names from the manifest will be used for syndicate code phrases
    • +
    • randomly generated people names from syndicate code phrases
    • +
    • Medical category to exosuit fabricator with implants and cybernetics
    • +
    • t-t-t-typo!
    • +
    • codephrase names no longer appear blank
    • +
    +

    EmanTheAlmighty updated:

    +
      +
    • Admin made cultists can now properly summon their Gods if the gamemode wasn't initially Cult.
    • +
    +

    Evankhell561 updated:

    +
      +
    • Portable Seed Extractor designon the protolathe.
    • +
    +

    Fethas updated:

    +
      +
    • Fixes an oversight from the lavaland port invovling Laz injectors and sentience typing that didn't carry over from tg.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Future proofs the coming Ticker subsystem
    • +
    • Removes the Process Scheduler
    • +
    +

    Improvedname updated:

    +
      +
    • Cargo miner starter kit crate will no longer include a ID
    • +
    +

    Kyep updated:

    +
      +
    • Ported XKeyScore from TG.
    • +
    • New system to securely link ingame/forum accounts
    • +
    • Removed old insecure 'link discord account' system
    • +
    • unanchored vending machines will no longer generate a runtime error when throwing products at people.
    • +
    • Disarming/grabbing a door with IDSCAN disabled no longer results in a can_admin_interact runtime error.
    • +
    • Terror Spiders no longer trigger their special attack when nuzzling someone on help intent.
    • +
    +

    Markolie updated:

    +
      +
    • Chameleon items now use the appropriate species icon.
    • +
    • Lighting now respects color blindness again.
    • +
    • pAI flashlights now work properly.
    • +
    • Rotatium can now be created properly.
    • +
    • Ghosts can now transition through space again. This is now done by clicking on the edge of space.
    • +
    • Added custom explorer gas mask sprites for Grey/Drask.
    • +
    • Added a lantern to the Hermit cave.
    • +
    • Added a bone setter, bone gel, FixOVein, sterile masks and sterile gloves to the Lavaland Syndicate base.
    • +
    • The pickaxes on the Lavaland labor camp have been replaced with safety variants. The flashlights have been replaced with lanterns.
    • +
    • Fixed many species missing sprites for explorer gas masks and jumpsuits. They now use the humans icons until we have custom sprites.
    • +
    • Resolved an issue with piping not working on the Lavaland mining bases.
    • +
    • Fixed all items being free in the mining vendor.
    • +
    • Fixed improper wiring to the turbine in the Lavaland Syndicate base.
    • +
    • Fixed the Lavaland Syndicate base oxygen sensor not working.
    • +
    • Moved the pipe dispenser in the Lavaland Syndicate base so it doesn't clip with tables.
    • +
    • Fixed the Lavaland Syndicate base incinerator doors not working.
    • +
    • Ash Walkers now once more have fine manipulation. Their lack of fine manipulation caused unintended side effects (such as them being unable to mine).
    • +
    • Ash Walkers (and other ghost spawner roles) can no longer be antagonist targets or become antagonists through the antagonist creation.
    • +
    • Fixed the Lavaland Syndicate base incinerator buttons not working.
    • +
    • Fixed the Syndicate communication agent spawning with a broken voice changer mask.
    • +
    • Fixed the Disk Compartmentalizer not having a sprite.
    • +
    • The Ancient Goliath now has a small chance of spawning instead of regular goliaths.
    • +
    • Survival capsules now have a NanoMed.
    • +
    • Water bottles now behave as glass containers.
    • +
    • The behaviour of glass reagent containers has changed. When used on non-mobs, contents will now only be spilled on harm intent. When used on mobs, on any intent aside from harm the contents will be fed to the mob like regular drinks. On harm intent it will still be spilled.
    • +
    • Hairless hide can now be made wet using most sources of water (minimum volume of 10), instead of just washing machines.
    • +
    • Added some additional offstation role checks to ensure ghost spawner roles don't become antagonists, are kidnap targets or are counted towards station goals.
    • +
    • Fixed some piping in the Lavaland Syndicate base incinerator and made sure the vault door starts locked.
    • +
    • Fixed the Lavaland swarmers getting stuck on propulsion.
    • +
    • Fix goliath tentacles sometimes being left behind.
    • +
    • The walls around the Lavaland Syndicate base turbine have been coated, to prevent them from starting a plasma fire in the base.
    • +
    • Syndicate agents can now access the air alarms on the Lavaland Syndicate base.
    • +
    • Air alarm control computers can no longer access the air alarms on the Lavaland Syndicate base.
    • +
    • Fixed the disk compartmentalizer/drying rack missing a sprite under certain circumstances.
    • +
    • Fixed the Lavaland Syndicate base triggering atmospherics alerts.
    • +
    • You can now properly place tiles on basalt.
    • +
    • An exploit with the sheet multiplier has been fixed.
    • +
    • Portals can now be activated by clicking on them with or without an object. Ghosts can now also click on them to be taken to their destination.
    • +
    • Portals now warn admins when they are used to teleport megafauna.
    • +
    • The singularity can now eat basalt and chasms on Lavaland. They get turned into lava.
    • +
    • AI swarmers will no longer get stuck on effects (such as blood).
    • +
    • Fixed the spectral blade turning all ghosts visible.
    • +
    • Fixed a runtime with assigning outfits to mindless mobs.
    • +
    • Fixed certain alarms triggering despite being outside of station contact and the Syndicate base still triggering fire alarms.
    • +
    • Fixed being unable to put the wormhole jaunter in the belt slot.
    • +
    • Fixed the disk compartmentalizer not accepting disks.
    • +
    • Gutlunches and Gubbucks will now reproduce properly.
    • +
    • The necropolis chest cult clothing drop no longer spawns with a cult hood as well, as that's part of the suit itself.
    • +
    • Goliath steaks can now be eaten properly.
    • +
    • Fixed a stray light on the beach ruin.
    • +
    • Lavaland ruins should no longer spawn on the Labor Camp.
    • +
    • Ancient goliaths will now properly randomly spawn tentacles.
    • +
    • The labor camp will now spawn properly with a processing console.
    • +
    • Water turfs in the beach ruin (and other water turfs that previously didn't do so) will now properly apply water to you.
    • +
    • Ash flora is now anchored.
    • +
    • Gutlunches will now eat properly.
    • +
    • The tesla can no longer travel through wormholes.
    • +
    • Fixed an issue with honkbot construction.
    • +
    +

    Markolie and Ionward updated:

    +
      +
    • Added Tajaran, Vulpkanin, Unathi and Vox sprites for the explorer gas mask (thanks to Ionward!)
    • +
    • Added custom species sprites for the explorer suits and hoods (thanks to Ionward!)
    • +
    • Added missing surgical tools and a pet vendor to the animal hospital.
    • +
    • Added a custom cigarette vendor to the beach biodome ruin.
    • +
    • Added an autolathe and RPD to the Lavaland Syndicate base. Also added a custom cigarette vendor and made the vendors not charge money.
    • +
    • Added tiny fans to the mining base and labor camp exist.
    • +
    • A separate jobban for ghost roles has been added.
    • +
    • The alternative sink now has directional sprites. This resolves an issue with shelters having sinks facing the wrong way.
    • +
    • Fixed the Syndicate sleepers on the Lavaland Syndicate base pointing the wrong way when a ghost role spawns in.
    • +
    • Fixed Lava being removed by the staff of lava not working. Also added a missing warning effect when the staff is turning regular turf into lava.
    • +
    • Fixed random bookcases not spawning books (hopefully).
    • +
    • Fixed surgical drapes not having a sprite.
    • +
    • Fixed being unable to modify the GPS tag of shelters.
    • +
    • Fixed the Lavaland swarmers not eating anything.
    • +
    • The ash drake swoop attack is no longer incredibly loud.
    • +
    • The Syndicate base self-destruct is now much more powerful and capable of destroying the entire base.
    • +
    • The flavor text of Ash Walkers and Syndicate operatives now clarifies what they can('t) do.
    • +
    • Ash walkers can no longer use machinery.
    • +
    +

    Ported by Markolie and CornMyCob. Developed by many /tg/ coders updated:

    +
      +
    • The mining asteroid has been replaced with Lavaland.
    • +
    +

    Shadeykins updated:

    +
      +
    • Fixes a paper exploit.
    • +
    • Fixes rogue pixels on breath masks/gas masks for Plasmamen.
    • +
    +

    TDSSS updated:

    +
      +
    • Vampire rejuv wakes you up if you're asleep now
    • +
    • Cling epinephrine wakes you up if you're asleep now
    • +
    • Sling glare popup no longer lists invalid targets for glaring
    • +
    +

    Tayyyyyyy updated:

    +
      +
    • Messages window (My PMs in OOC tab)
    • +
    • You no longer have to wait on others for ERT spawning
    • +
    • Admin jobs no longer announced
    • +
    +

    Terilia updated:

    +
      +
    • Added the Donksoft sniper into the Trader spawnpool.
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Changed admin take ticket color from neon green to Asay pink
    • +
    • Manual bans now auto-note
    • +
    • Stops projectiles using the legacy system such as emitters from hurting shield blobs due to an exploit where it would always hit or go through.
    • +
    +

    craftxbox updated:

    +
      +
    • Highlight string uses regex
    • +
    • Removed jquery mark
    • +
    +

    datlo updated:

    +
      +
    • The Syndicate will no longer hire golems as agents.
    • +
    • Banana juice and Banana honk will now heal everyone with the Comic Sans mutation instead of checking for the clown job
    • +
    • Nothing will now check if the player has an active vow of silence instead of checking for the mime job
    • +
    • Ghosts will no longer get the wrong role offered when a nukie spawns a borg and will properly be informed whether they will spawn as a nuke ops or a syndi cyborg.
    • +
    +

    dovydas12345 updated:

    +
      +
    • Fixes cryopod removing ambulance, secway keys
    • +
    • Fixes cryopod recovering the invisible headpocket item
    • +
    +

    farie82 updated:

    +
      +
    • Can't use cuffs now while you have antidrop
    • +
    • can_equip now checks if you have the limbs required to equip something
    • +
    • Reverts the string highlighting done by regex
    • +
    +

    iantine updated:

    +
      +
    • Skrell *warble emote
    • +
    +

    uc_guy updated:

    +
      +
    • Theft objective locations hints now ignore the Centcomm Z level.
    • +
    • Adv. Pinpointer no longer targets items in Centcom Z level.
    • +
    • Fixed "Venus Human Traps" being invisible.
    • +
    +

    10 May 2019

    AffectedArc07 updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d0e51aa9571..49e86db023d 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10162,3 +10162,295 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscdel: Some of space hotel's functions. - rscdel: Bodysnatch gland. - tweak: process_ai has been deprecated +2019-06-28: + AffectedArc07: + - rscadd: SSticker + - tweak: You can no longer force-start a round unless its fully initialised. + - tweak: Tweaks some preference orders + - tweak: Moved a global define + Akatos: + - tweak: Smartfridges now visually show approximate number of items inside + Arkatos: + - bugfix: Ragin' Mages gamemode should now be playable without any major issue + - bugfix: Slaughter and Laughter Demons no longer have duplicit objective shown + at the Round End + - bugfix: Laughter Demon is now properly called Laughter Demon instead of Slaughter + Demon in the role polls + - spellcheck: Improved wording and fixed mistakes in Wizard and Ragin' Mages gamemodes + - tweak: Wizards are now properly polled in the Ragin' Mages gamemode + - tweak: You can no longer buy Summon Ghosts spell in the Ragin' Mages gamemode + - tweak: You can no longer buy Bind Soul spell in the Ragin' Mages gamemode + - tweak: Deck of tarot cards renamed to Guardian Deck in the Wizard spellbook + - tweak: Rituals and Challenges categories merged into one in the Wizard spellbook + - tweak: Laughter Demon is now slightly weaker compared to the Slaughter Demon + - tweak: Bottle of Ooze now creates a magical morph instead of a normal one. Magical + morph is capable of casting smoke and forcewall spells. + - tweak: Visible ghosts will now get a special description about their visibility + - rscdel: Removed Cursed Heart from the Wizard spellbook + - rscadd: Changeling verbs replaced with action buttons + - tweak: Changeling ability descriptions updated + - imageadd: Added custom icons for changeling action buttons + - imageadd: Added movement animation for mice, chickens and killer tomatoes + - imageadd: Added inhand sprite for eggbox + - imageadd: Added inhand sprites for all types of soaps + - imageadd: Added inhand sprite for small parcel + - imageadd: Added inhand sprite for sechailer + - imageadd: Added inhand sprite for bag of holding + - tweak: Added new system for outputting contents of smartfridges + - tweak: Blob split consciousness ability now requires you to directly target a + node you want to turn into another sentient overmind instead of selecting a + nearest one + - spellcheck: Fixed and improved some descriptions regarding Blob offspring + - bugfix: Fixed a case where ghosts had an extra ghost icon visible on them + - bugfix: Fixed a case where some ghosts were too bright + - bugfix: You are now unable to swap forms with another changeling + - bugfix: You can no longer hiss while muzzled + - tweak: Upon purchasing Augmented Eyesight changeling ability, changeling immediately + receives passive version of the ability + - tweak: Changelings in the lesser form can now toggle Augmented Eyesight ability + - bugfix: Changelings are now removed properly via Traitor Panel + - bugfix: Changelings do not get their action buttons bugged when using Swap Forms + ability now + - bugfix: Action buttons should update their cooldown statuses more reliably + - bugfix: Changelings should now correctly receive their action buttons + - bugfix: Changelings now do not steal action buttons from other changelings + - imageadd: Added new Boo! spell icon + Christasmurf: + - bugfix: Fixes a random pixel on the leather shoes + Citinited: + - bugfix: Boo affects APCs again + - bugfix: Boo no longer fully charges when you enter your corpse + - tweak: The button to close radial menus is much more obvious and easily-clickable + now + - bugfix: Destroying a disposals trunk should no longer occasionally delete things + held inside it. + - bugfix: Fixes conveyor belts not moving items spawned via an autolathe. (And other + possible behaviours when machines switch between speed and normal processes) + - imageadd: Ports liquid dispenser sprites from tgstation. + Couls: + - rscadd: Only names from the manifest will be used for syndicate code phrases + - rscdel: randomly generated people names from syndicate code phrases + - rscadd: Medical category to exosuit fabricator with implants and cybernetics + - bugfix: t-t-t-typo! + - bugfix: codephrase names no longer appear blank + EmanTheAlmighty: + - tweak: Admin made cultists can now properly summon their Gods if the gamemode + wasn't initially Cult. + Evankhell561: + - bugfix: Portable Seed Extractor designon the protolathe. + Fethas: + - bugfix: Fixes an oversight from the lavaland port invovling Laz injectors and + sentience typing that didn't carry over from tg. + Fox McCloud: + - bugfix: Future proofs the coming Ticker subsystem + - rscdel: Removes the Process Scheduler + Improvedname: + - tweak: Cargo miner starter kit crate will no longer include a ID + Kyep: + - rscadd: Ported XKeyScore from TG. + - rscadd: New system to securely link ingame/forum accounts + - rscdel: Removed old insecure 'link discord account' system + - bugfix: unanchored vending machines will no longer generate a runtime error when + throwing products at people. + - bugfix: Disarming/grabbing a door with IDSCAN disabled no longer results in a + can_admin_interact runtime error. + - bugfix: Terror Spiders no longer trigger their special attack when nuzzling someone + on help intent. + Markolie: + - bugfix: Chameleon items now use the appropriate species icon. + - bugfix: Lighting now respects color blindness again. + - bugfix: pAI flashlights now work properly. + - bugfix: Rotatium can now be created properly. + - bugfix: Ghosts can now transition through space again. This is now done by clicking + on the edge of space. + - rscadd: Added custom explorer gas mask sprites for Grey/Drask. + - rscadd: Added a lantern to the Hermit cave. + - rscadd: Added a bone setter, bone gel, FixOVein, sterile masks and sterile gloves + to the Lavaland Syndicate base. + - rscadd: The pickaxes on the Lavaland labor camp have been replaced with safety + variants. The flashlights have been replaced with lanterns. + - bugfix: Fixed many species missing sprites for explorer gas masks and jumpsuits. + They now use the humans icons until we have custom sprites. + - bugfix: Resolved an issue with piping not working on the Lavaland mining bases. + - bugfix: Fixed all items being free in the mining vendor. + - bugfix: Fixed improper wiring to the turbine in the Lavaland Syndicate base. + - bugfix: Fixed the Lavaland Syndicate base oxygen sensor not working. + - bugfix: Moved the pipe dispenser in the Lavaland Syndicate base so it doesn't + clip with tables. + - bugfix: Fixed the Lavaland Syndicate base incinerator doors not working. + - tweak: Ash Walkers now once more have fine manipulation. Their lack of fine manipulation + caused unintended side effects (such as them being unable to mine). + - bugfix: Ash Walkers (and other ghost spawner roles) can no longer be antagonist + targets or become antagonists through the antagonist creation. + - bugfix: Fixed the Lavaland Syndicate base incinerator buttons not working. + - bugfix: Fixed the Syndicate communication agent spawning with a broken voice changer + mask. + - bugfix: Fixed the Disk Compartmentalizer not having a sprite. + - rscadd: The Ancient Goliath now has a small chance of spawning instead of regular + goliaths. + - rscadd: Survival capsules now have a NanoMed. + - tweak: Water bottles now behave as glass containers. + - tweak: The behaviour of glass reagent containers has changed. When used on non-mobs, + contents will now only be spilled on harm intent. When used on mobs, on any + intent aside from harm the contents will be fed to the mob like regular drinks. + On harm intent it will still be spilled. + - tweak: Hairless hide can now be made wet using most sources of water (minimum + volume of 10), instead of just washing machines. + - bugfix: Added some additional offstation role checks to ensure ghost spawner roles + don't become antagonists, are kidnap targets or are counted towards station + goals. + - bugfix: Fixed some piping in the Lavaland Syndicate base incinerator and made + sure the vault door starts locked. + - bugfix: Fixed the Lavaland swarmers getting stuck on propulsion. + - bugfix: Fix goliath tentacles sometimes being left behind. + - bugfix: The walls around the Lavaland Syndicate base turbine have been coated, + to prevent them from starting a plasma fire in the base. + - bugfix: Syndicate agents can now access the air alarms on the Lavaland Syndicate + base. + - bugfix: Air alarm control computers can no longer access the air alarms on the + Lavaland Syndicate base. + - bugfix: Fixed the disk compartmentalizer/drying rack missing a sprite under certain + circumstances. + - bugfix: Fixed the Lavaland Syndicate base triggering atmospherics alerts. + - bugfix: You can now properly place tiles on basalt. + - bugfix: An exploit with the sheet multiplier has been fixed. + - rscadd: Portals can now be activated by clicking on them with or without an object. + Ghosts can now also click on them to be taken to their destination. + - rscadd: Portals now warn admins when they are used to teleport megafauna. + - tweak: The singularity can now eat basalt and chasms on Lavaland. They get turned + into lava. + - bugfix: AI swarmers will no longer get stuck on effects (such as blood). + - bugfix: Fixed the spectral blade turning all ghosts visible. + - bugfix: Fixed a runtime with assigning outfits to mindless mobs. + - bugfix: Fixed certain alarms triggering despite being outside of station contact + and the Syndicate base still triggering fire alarms. + - bugfix: Fixed being unable to put the wormhole jaunter in the belt slot. + - bugfix: Fixed the disk compartmentalizer not accepting disks. + - bugfix: Gutlunches and Gubbucks will now reproduce properly. + - bugfix: The necropolis chest cult clothing drop no longer spawns with a cult hood + as well, as that's part of the suit itself. + - bugfix: Goliath steaks can now be eaten properly. + - bugfix: Fixed a stray light on the beach ruin. + - bugfix: Lavaland ruins should no longer spawn on the Labor Camp. + - bugfix: Ancient goliaths will now properly randomly spawn tentacles. + - bugfix: The labor camp will now spawn properly with a processing console. + - bugfix: Water turfs in the beach ruin (and other water turfs that previously didn't + do so) will now properly apply water to you. + - bugfix: Ash flora is now anchored. + - bugfix: Gutlunches will now eat properly. + - bugfix: The tesla can no longer travel through wormholes. + - bugfix: Fixed an issue with honkbot construction. + Markolie and Ionward: + - rscadd: Added Tajaran, Vulpkanin, Unathi and Vox sprites for the explorer gas + mask (thanks to Ionward!) + - rscadd: Added custom species sprites for the explorer suits and hoods (thanks + to Ionward!) + - rscadd: Added missing surgical tools and a pet vendor to the animal hospital. + - rscadd: Added a custom cigarette vendor to the beach biodome ruin. + - rscadd: Added an autolathe and RPD to the Lavaland Syndicate base. Also added + a custom cigarette vendor and made the vendors not charge money. + - rscadd: Added tiny fans to the mining base and labor camp exist. + - rscadd: A separate jobban for ghost roles has been added. + - bugfix: The alternative sink now has directional sprites. This resolves an issue + with shelters having sinks facing the wrong way. + - bugfix: Fixed the Syndicate sleepers on the Lavaland Syndicate base pointing the + wrong way when a ghost role spawns in. + - bugfix: Fixed Lava being removed by the staff of lava not working. Also added + a missing warning effect when the staff is turning regular turf into lava. + - bugfix: Fixed random bookcases not spawning books (hopefully). + - bugfix: Fixed surgical drapes not having a sprite. + - bugfix: Fixed being unable to modify the GPS tag of shelters. + - bugfix: Fixed the Lavaland swarmers not eating anything. + - bugfix: The ash drake swoop attack is no longer incredibly loud. + - tweak: The Syndicate base self-destruct is now much more powerful and capable + of destroying the entire base. + - tweak: The flavor text of Ash Walkers and Syndicate operatives now clarifies what + they can('t) do. + - tweak: Ash walkers can no longer use machinery. + Ported by Markolie and CornMyCob. Developed by many /tg/ coders: + - rscadd: The mining asteroid has been replaced with Lavaland. + Shadeykins: + - bugfix: Fixes a paper exploit. + - bugfix: Fixes rogue pixels on breath masks/gas masks for Plasmamen. + TDSSS: + - tweak: Vampire rejuv wakes you up if you're asleep now + - tweak: Cling epinephrine wakes you up if you're asleep now + - tweak: Sling glare popup no longer lists invalid targets for glaring + Tayyyyyyy: + - rscadd: Messages window (My PMs in OOC tab) + - tweak: You no longer have to wait on others for ERT spawning + - bugfix: Admin jobs no longer announced + Terilia: + - rscadd: Added the Donksoft sniper into the Trader spawnpool. + Ty-Omaha: + - tweak: Changed admin take ticket color from neon green to Asay pink + - bugfix: Manual bans now auto-note + - bugfix: Stops projectiles using the legacy system such as emitters from hurting + shield blobs due to an exploit where it would always hit or go through. + craftxbox: + - tweak: Highlight string uses regex + - rscdel: Removed jquery mark + datlo: + - bugfix: The Syndicate will no longer hire golems as agents. + - tweak: Banana juice and Banana honk will now heal everyone with the Comic Sans + mutation instead of checking for the clown job + - tweak: Nothing will now check if the player has an active vow of silence instead + of checking for the mime job + - bugfix: Ghosts will no longer get the wrong role offered when a nukie spawns a + borg and will properly be informed whether they will spawn as a nuke ops or + a syndi cyborg. + dovydas12345: + - bugfix: Fixes cryopod removing ambulance, secway keys + - bugfix: Fixes cryopod recovering the invisible headpocket item + farie82: + - bugfix: Can't use cuffs now while you have antidrop + - bugfix: can_equip now checks if you have the limbs required to equip something + - rscdel: Reverts the string highlighting done by regex + iantine: + - rscadd: Skrell *warble emote + uc_guy: + - bugfix: Theft objective locations hints now ignore the Centcomm Z level. + - bugfix: Adv. Pinpointer no longer targets items in Centcom Z level. + - bugfix: Fixed "Venus Human Traps" being invisible. +2019-06-30: + Crazylemon64: + - rscdel: SDQL2 no longer allows a macro argument +2019-07-08: + Arkatos: + - tweak: Clicking on a health doll icon will now check you for injuries + - rscadd: Rechargers now show their contents and charge status on close examine + - tweak: Smartfridge will now try to put an item in your hands after vending, if + able + AzuleUtama: + - bugfix: The cybernetic implant bundle can no longer be bought by traitors. + Citinited: + - rscadd: Alt-clicking the RPD now brings up a radial menu with rotate, flip, and + delete modes accessible. The main interface remains unchanged. + - bugfix: Writing in blood can't be done while dead or incapacitated any more + - bugfix: You can't write stuff in blood at a distance any more + Couls: + - imageadd: lantern sprites + - bugfix: typo in msg + Improvedname: + - bugfix: Explorer suits now properly hide tails + JKnutson101: + - bugfix: Fixed Construction Permits deleting themselves prematurely. + Kyep: + - bugfix: fixed a bug with biogenerator. + Markolie: + - rscadd: Ghosts can now see all PDA messages when enabled through a preference + setting. + - rscdel: The Mask of Nar'Sie transformation buttons have been removed, as the mask + was removed a long time ago. + Shadeykins: + - tweak: 'Changed Quarantine, NT Default, Aggressive, and Corporate AI lawsets. + balance: Reduced the ability for NT Default AI''s to murder people just because.' + - bugfix: Removed several redundancies in Aggressive lawset. + - spellcheck: Fixed a few subject-verb disagreements (is -> are). + Tayyyyyyy: + - tweak: paper supports markdown as well as pencode + - rscadd: Autocomplete for ghost buttons + - tweak: PMs window scrollable + - bugfix: Fix a bug where a player who reconnects is still shown as disconnected + datlo: + - bugfix: Fix an antag rolling exploit. diff --git a/html/changelogs/AutoChangeLog-pr-11125.yml b/html/changelogs/AutoChangeLog-pr-11125.yml new file mode 100644 index 00000000000..2208cf5854c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11125.yml @@ -0,0 +1,8 @@ +author: "Quantum-M" +delete-after: True +changes: + - rscadd: "New sprites for vampires being \"hungry\"." + - rscadd: "New sprite for vampire usable blood count." + - rscadd: "New sprites for the safety muzzle." + - tweak: "Safety muzzle (aka the anti-bitting one) can no longer be resisted out of." + - tweak: "Vampires can now suck blood from monkey mobs (e.g. monkeys, stoks, etc.) for sustenance but do not get blood power points." diff --git a/html/changelogs/AutoChangeLog-pr-11196.yml b/html/changelogs/AutoChangeLog-pr-11196.yml deleted file mode 100644 index fc5f502d62f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11196.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ported by Markolie and CornMyCob. Developed by many /tg/ coders" -delete-after: True -changes: - - rscadd: "The mining asteroid has been replaced with Lavaland." diff --git a/html/changelogs/AutoChangeLog-pr-11358.yml b/html/changelogs/AutoChangeLog-pr-11358.yml new file mode 100644 index 00000000000..ed5662b1047 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11358.yml @@ -0,0 +1,8 @@ +author: "Couls" +delete-after: True +changes: + - rscadd: "Diagonal movement" + - rscadd: "Input subsystem(numpad targetting, press numpad 8 multiple times to target eyes and mouth, numpad 6 or 4 to target arms and press them again to target hands and numpad 1 or 3 to target legs and press them again to target feet) taken from https://github.com/tgstation/tgstation/pull/32751" + - rscadd: "change confused status to have you move diagonally randomly in the direction you're headed if not too confused(now you can drunkenly walk down the hall)" + - rscadd: "clients are now children of datums like everything else in BYOND taken from https://github.com/tgstation/tgstation/pull/20394" + - rscadd: "AZERTY and numpad targetting preferences" diff --git a/html/changelogs/AutoChangeLog-pr-11359.yml b/html/changelogs/AutoChangeLog-pr-11359.yml deleted file mode 100644 index 3f93a5677ef..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11359.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - rscadd: "Ported XKeyScore from TG." - - rscadd: "New system to securely link ingame/forum accounts" - - rscdel: "Removed old insecure 'link discord account' system" diff --git a/html/changelogs/AutoChangeLog-pr-11368.yml b/html/changelogs/AutoChangeLog-pr-11368.yml deleted file mode 100644 index f2d543bae3a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11368.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "SSticker" - - tweak: "You can no longer force-start a round unless its fully initialised." diff --git a/html/changelogs/AutoChangeLog-pr-11421.yml b/html/changelogs/AutoChangeLog-pr-11421.yml deleted file mode 100644 index 83e285205c3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11421.yml +++ /dev/null @@ -1,16 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - bugfix: "Ragin' Mages gamemode should now be playable without any major issue" - - bugfix: "Slaughter and Laughter Demons no longer have duplicit objective shown at the Round End" - - bugfix: "Laughter Demon is now properly called Laughter Demon instead of Slaughter Demon in the role polls" - - spellcheck: "Improved wording and fixed mistakes in Wizard and Ragin' Mages gamemodes" - - tweak: "Wizards are now properly polled in the Ragin' Mages gamemode" - - tweak: "You can no longer buy Summon Ghosts spell in the Ragin' Mages gamemode" - - tweak: "You can no longer buy Bind Soul spell in the Ragin' Mages gamemode" - - tweak: "Deck of tarot cards renamed to Guardian Deck in the Wizard spellbook" - - tweak: "Rituals and Challenges categories merged into one in the Wizard spellbook" - - tweak: "Laughter Demon is now slightly weaker compared to the Slaughter Demon" - - tweak: "Bottle of Ooze now creates a magical morph instead of a normal one. Magical morph is capable of casting smoke and forcewall spells." - - tweak: "Visible ghosts will now get a special description about their visibility" - - rscdel: "Removed Cursed Heart from the Wizard spellbook" diff --git a/html/changelogs/AutoChangeLog-pr-11438.yml b/html/changelogs/AutoChangeLog-pr-11438.yml deleted file mode 100644 index a276198bfa9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11438.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "EmanTheAlmighty" -delete-after: True -changes: - - tweak: "Admin made cultists can now properly summon their Gods if the gamemode wasn't initially Cult." diff --git a/html/changelogs/AutoChangeLog-pr-11439.yml b/html/changelogs/AutoChangeLog-pr-11439.yml deleted file mode 100644 index c5352502c88..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11439.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Changeling verbs replaced with action buttons" - - tweak: "Changeling ability descriptions updated" - - imageadd: "Added custom icons for changeling action buttons" diff --git a/html/changelogs/AutoChangeLog-pr-11444.yml b/html/changelogs/AutoChangeLog-pr-11444.yml deleted file mode 100644 index 08ad07a902d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11444.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "unanchored vending machines will no longer generate a runtime error when throwing products at people." diff --git a/html/changelogs/AutoChangeLog-pr-11460.yml b/html/changelogs/AutoChangeLog-pr-11460.yml deleted file mode 100644 index b4fd18328dd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11460.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - imageadd: "Added movement animation for mice, chickens and killer tomatoes" diff --git a/html/changelogs/AutoChangeLog-pr-11465.yml b/html/changelogs/AutoChangeLog-pr-11465.yml deleted file mode 100644 index a38d2a20e15..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11465.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Can't use cuffs now while you have antidrop" diff --git a/html/changelogs/AutoChangeLog-pr-11466.yml b/html/changelogs/AutoChangeLog-pr-11466.yml deleted file mode 100644 index 0cf1c132b42..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11466.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Chameleon items now use the appropriate species icon." diff --git a/html/changelogs/AutoChangeLog-pr-11472.yml b/html/changelogs/AutoChangeLog-pr-11472.yml deleted file mode 100644 index acfaebf6e7f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11472.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - rscadd: "Only names from the manifest will be used for syndicate code phrases" - - rscdel: "randomly generated people names from syndicate code phrases" diff --git a/html/changelogs/AutoChangeLog-pr-11476.yml b/html/changelogs/AutoChangeLog-pr-11476.yml deleted file mode 100644 index 540d77e7bf3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11476.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - imageadd: "Added inhand sprite for eggbox" - - imageadd: "Added inhand sprites for all types of soaps" - - imageadd: "Added inhand sprite for small parcel" - - imageadd: "Added inhand sprite for sechailer" - - imageadd: "Added inhand sprite for bag of holding" diff --git a/html/changelogs/AutoChangeLog-pr-11477.yml b/html/changelogs/AutoChangeLog-pr-11477.yml deleted file mode 100644 index 756b6c1e4e4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11477.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Added new system for outputting contents of smartfridges" diff --git a/html/changelogs/AutoChangeLog-pr-11479.yml b/html/changelogs/AutoChangeLog-pr-11479.yml deleted file mode 100644 index efa34ac077d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11479.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "TDSSS" -delete-after: True -changes: - - tweak: "Vampire rejuv wakes you up if you're asleep now" - - tweak: "Cling epinephrine wakes you up if you're asleep now" diff --git a/html/changelogs/AutoChangeLog-pr-11480.yml b/html/changelogs/AutoChangeLog-pr-11480.yml deleted file mode 100644 index a4fcc50ceaa..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11480.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Tayyyyyyy" -delete-after: True -changes: - - rscadd: "Messages window (My PMs in OOC tab)" diff --git a/html/changelogs/AutoChangeLog-pr-11482.yml b/html/changelogs/AutoChangeLog-pr-11482.yml deleted file mode 100644 index 65cc53a7f97..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11482.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TDSSS" -delete-after: True -changes: - - tweak: "Sling glare popup no longer lists invalid targets for glaring" diff --git a/html/changelogs/AutoChangeLog-pr-11483.yml b/html/changelogs/AutoChangeLog-pr-11483.yml deleted file mode 100644 index 635f5efede9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11483.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "datlo" -delete-after: True -changes: - - bugfix: "The Syndicate will no longer hire golems as agents." - - tweak: "Banana juice and Banana honk will now heal everyone with the Comic Sans mutation instead of checking for the clown job" - - tweak: "Nothing will now check if the player has an active vow of silence instead of checking for the mime job" diff --git a/html/changelogs/AutoChangeLog-pr-11484.yml b/html/changelogs/AutoChangeLog-pr-11484.yml new file mode 100644 index 00000000000..a6237397de8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11484.yml @@ -0,0 +1,4 @@ +author: "KasparoVy" +delete-after: True +changes: + - rscadd: "Re-adds the ability to see in the dark. Adds overlays for each level of darksight (>=8,7,6,5,4,3,<=2)." diff --git a/html/changelogs/AutoChangeLog-pr-11486.yml b/html/changelogs/AutoChangeLog-pr-11486.yml deleted file mode 100644 index c854e1f9c4c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11486.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Tayyyyyyy" -delete-after: True -changes: - - tweak: "You no longer have to wait on others for ERT spawning" diff --git a/html/changelogs/AutoChangeLog-pr-11508.yml b/html/changelogs/AutoChangeLog-pr-11508.yml deleted file mode 100644 index ebe3ed56455..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11508.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "datlo" -delete-after: True -changes: - - bugfix: "Ghosts will no longer get the wrong role offered when a nukie -spawns a borg and will properly be informed whether they will spawn as a -nuke ops or a syndi cyborg." diff --git a/html/changelogs/AutoChangeLog-pr-11511.yml b/html/changelogs/AutoChangeLog-pr-11511.yml deleted file mode 100644 index c32d89bc2fc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11511.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Lighting now respects color blindness again." - - bugfix: "pAI flashlights now work properly." diff --git a/html/changelogs/AutoChangeLog-pr-11518.yml b/html/changelogs/AutoChangeLog-pr-11518.yml deleted file mode 100644 index 0ad85e1e84a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11518.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "can_equip now checks if you have the limbs required to equip something" diff --git a/html/changelogs/AutoChangeLog-pr-11520.yml b/html/changelogs/AutoChangeLog-pr-11520.yml deleted file mode 100644 index ffc477deba7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11520.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Citinited" -delete-after: True -changes: - - bugfix: "Boo affects APCs again" - - bugfix: "Boo no longer fully charges when you enter your corpse" diff --git a/html/changelogs/AutoChangeLog-pr-11521.yml b/html/changelogs/AutoChangeLog-pr-11521.yml deleted file mode 100644 index 48a73a71cac..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11521.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Blob split consciousness ability now requires you to directly target a node you want to turn into another sentient overmind instead of selecting a nearest one" - - spellcheck: "Fixed and improved some descriptions regarding Blob offspring" diff --git a/html/changelogs/AutoChangeLog-pr-11523.yml b/html/changelogs/AutoChangeLog-pr-11523.yml deleted file mode 100644 index 654203e359b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11523.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Future proofs the coming Ticker subsystem" diff --git a/html/changelogs/AutoChangeLog-pr-11524.yml b/html/changelogs/AutoChangeLog-pr-11524.yml deleted file mode 100644 index e1036ef70a7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11524.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscdel: "Removes the Process Scheduler" diff --git a/html/changelogs/AutoChangeLog-pr-11529.yml b/html/changelogs/AutoChangeLog-pr-11529.yml deleted file mode 100644 index 6de125cb71f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11529.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Citinited" -delete-after: True -changes: - - tweak: "The button to close radial menus is much more obvious and easily-clickable now" diff --git a/html/changelogs/AutoChangeLog-pr-11533.yml b/html/changelogs/AutoChangeLog-pr-11533.yml deleted file mode 100644 index e1708e5901c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11533.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Rotatium can now be created properly." diff --git a/html/changelogs/AutoChangeLog-pr-11536.yml b/html/changelogs/AutoChangeLog-pr-11536.yml deleted file mode 100644 index 0fba2aa34e5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11536.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "dovydas12345" -delete-after: True -changes: - - bugfix: "Fixes cryopod removing ambulance, secway keys" - - bugfix: "Fixes cryopod recovering the invisible headpocket item" diff --git a/html/changelogs/AutoChangeLog-pr-11537.yml b/html/changelogs/AutoChangeLog-pr-11537.yml deleted file mode 100644 index 304766c2b8d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11537.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Akatos" -delete-after: True -changes: - - tweak: "Smartfridges now visually show approximate number of items inside" diff --git a/html/changelogs/AutoChangeLog-pr-11541.yml b/html/changelogs/AutoChangeLog-pr-11541.yml deleted file mode 100644 index a317a29455f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11541.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Tayyyyyyy" -delete-after: True -changes: - - bugfix: "Admin jobs no longer announced" diff --git a/html/changelogs/AutoChangeLog-pr-11546.yml b/html/changelogs/AutoChangeLog-pr-11546.yml deleted file mode 100644 index 33a522e1d19..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11546.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Shadeykins" -delete-after: True -changes: - - bugfix: "Fixes a paper exploit." diff --git a/html/changelogs/AutoChangeLog-pr-11547.yml b/html/changelogs/AutoChangeLog-pr-11547.yml deleted file mode 100644 index d3cd23d8632..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11547.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - tweak: "Tweaks some preference orders" diff --git a/html/changelogs/AutoChangeLog-pr-11551.yml b/html/changelogs/AutoChangeLog-pr-11551.yml deleted file mode 100644 index 5770e7a1488..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11551.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - bugfix: "Fixed a case where ghosts had an extra ghost icon visible on them" - - bugfix: "Fixed a case where some ghosts were too bright" diff --git a/html/changelogs/AutoChangeLog-pr-11553.yml b/html/changelogs/AutoChangeLog-pr-11553.yml deleted file mode 100644 index 9954dccfd28..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11553.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ty-Omaha" -delete-after: True -changes: - - tweak: "Changed admin take ticket color from neon green to Asay pink" diff --git a/html/changelogs/AutoChangeLog-pr-11554.yml b/html/changelogs/AutoChangeLog-pr-11554.yml deleted file mode 100644 index 4923c690400..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11554.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - bugfix: "You are now unable to swap forms with another changeling" diff --git a/html/changelogs/AutoChangeLog-pr-11555.yml b/html/changelogs/AutoChangeLog-pr-11555.yml deleted file mode 100644 index 63ff2434d6e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11555.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - bugfix: "You can no longer hiss while muzzled" diff --git a/html/changelogs/AutoChangeLog-pr-11556.yml b/html/changelogs/AutoChangeLog-pr-11556.yml deleted file mode 100644 index 246cc070f24..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11556.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - tweak: "Moved a global define" diff --git a/html/changelogs/AutoChangeLog-pr-11559.yml b/html/changelogs/AutoChangeLog-pr-11559.yml deleted file mode 100644 index 5bb8465ec94..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11559.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Upon purchasing Augmented Eyesight changeling ability, changeling immediately receives passive version of the ability" - - tweak: "Changelings in the lesser form can now toggle Augmented Eyesight ability" - - bugfix: "Changelings are now removed properly via Traitor Panel" - - bugfix: "Changelings do not get their action buttons bugged when using Swap Forms ability now" - - bugfix: "Action buttons should update their cooldown statuses more reliably" diff --git a/html/changelogs/AutoChangeLog-pr-11566.yml b/html/changelogs/AutoChangeLog-pr-11566.yml new file mode 100644 index 00000000000..09138dc9324 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11566.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "You can ctrl-click any action button to lock/unlock its position" + - tweak: "All actions buttons now start with their position locked" diff --git a/html/changelogs/AutoChangeLog-pr-11573.yml b/html/changelogs/AutoChangeLog-pr-11573.yml deleted file mode 100644 index bb4c67a6cc3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11573.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Shadeykins" -delete-after: True -changes: - - bugfix: "Fixes rogue pixels on breath masks/gas masks for Plasmamen." diff --git a/html/changelogs/AutoChangeLog-pr-11574.yml b/html/changelogs/AutoChangeLog-pr-11574.yml deleted file mode 100644 index 0acc59e9621..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11574.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Christasmurf" -delete-after: True -changes: - - bugfix: "Fixes a random pixel on the leather shoes" diff --git a/html/changelogs/AutoChangeLog-pr-11582.yml b/html/changelogs/AutoChangeLog-pr-11582.yml deleted file mode 100644 index 455dfcea14e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11582.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "uc_guy" -delete-after: True -changes: - - bugfix: "Fixed \"Venus Human Traps\" being invisible." diff --git a/html/changelogs/AutoChangeLog-pr-11584.yml b/html/changelogs/AutoChangeLog-pr-11584.yml deleted file mode 100644 index 83db80c473f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11584.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Ghosts can now transition through space again. This is now done by clicking on the edge of space." diff --git a/html/changelogs/AutoChangeLog-pr-11585.yml b/html/changelogs/AutoChangeLog-pr-11585.yml deleted file mode 100644 index 053b6deb819..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11585.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - bugfix: "Changelings should now correctly receive their action buttons" - - bugfix: "Changelings now do not steal action buttons from other changelings" diff --git a/html/changelogs/AutoChangeLog-pr-11605.yml b/html/changelogs/AutoChangeLog-pr-11605.yml new file mode 100644 index 00000000000..46c791aaa32 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11605.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - tweak: "Reworks the biohazard event to have a chance of giving a randomized advanced disease with 6 varying symptoms instead of a preset disease." diff --git a/html/changelogs/AutoChangeLog-pr-11606.yml b/html/changelogs/AutoChangeLog-pr-11606.yml new file mode 100644 index 00000000000..ff4cade715f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11606.yml @@ -0,0 +1,12 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "Humans and mice that are secretly blobs now have an antagHUD icon." + - tweak: "All hivemind languages now display follow links to ghosts." + - bugfix: "Announcements, whispers (with ghost ears) and cultist messages are no longer displayed in the lobby." + - bugfix: "The sentience event no longer triggers a huge number of ghost polling messages." + - bugfix: "When xenomorphs are damaged, their health HUD now updates properly." + - bugfix: "Custom title for ghost notifications now work properly." + - bugfix: "Fixed double admin commands in the grenade priming message." + - tweak: "Ghosts will now always see whispers/zero pressure speaking if they're on the screen with the mob speaking." + - tweak: "Ghosts with ghost sight enabled will no longer see emotes from clientless mobs." diff --git a/html/changelogs/AutoChangeLog-pr-11611.yml b/html/changelogs/AutoChangeLog-pr-11611.yml new file mode 100644 index 00000000000..b9bf93fafa2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11611.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - rscadd: "Blindfolds are now craftable from 3 cloth. For those vampire prisoners you want to keep in check" diff --git a/html/changelogs/AutoChangeLog-pr-11612.yml b/html/changelogs/AutoChangeLog-pr-11612.yml new file mode 100644 index 00000000000..3403b988c69 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11612.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - tweak: "Empty beaker button from the PANDEMIC is now replaced with Empty and eject beaker" diff --git a/html/changelogs/AutoChangeLog-pr-11620.yml b/html/changelogs/AutoChangeLog-pr-11620.yml deleted file mode 100644 index 6511722a427..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11620.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Citinited" -delete-after: True -changes: - - bugfix: "Fixes conveyor belts not moving items spawned via an autolathe. (And other possible behaviours when machines switch between speed and normal processes)" diff --git a/html/changelogs/AutoChangeLog-pr-11628.yml b/html/changelogs/AutoChangeLog-pr-11628.yml deleted file mode 100644 index 165e24173b7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11628.yml +++ /dev/null @@ -1,14 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "Added custom explorer gas mask sprites for Grey/Drask." - - rscadd: "Added a lantern to the Hermit cave." - - rscadd: "Added a bone setter, bone gel, FixOVein, sterile masks and sterile gloves to the Lavaland Syndicate base." - - rscadd: "The pickaxes on the Lavaland labor camp have been replaced with safety variants. The flashlights have been replaced with lanterns." - - bugfix: "Fixed many species missing sprites for explorer gas masks and jumpsuits. They now use the humans icons until we have custom sprites." - - bugfix: "Resolved an issue with piping not working on the Lavaland mining bases." - - bugfix: "Fixed all items being free in the mining vendor." - - bugfix: "Fixed improper wiring to the turbine in the Lavaland Syndicate base." - - bugfix: "Fixed the Lavaland Syndicate base oxygen sensor not working." - - bugfix: "Moved the pipe dispenser in the Lavaland Syndicate base so it doesn't clip with tables." - - bugfix: "Fixed the Lavaland Syndicate base incinerator doors not working." diff --git a/html/changelogs/AutoChangeLog-pr-11630.yml b/html/changelogs/AutoChangeLog-pr-11630.yml deleted file mode 100644 index 043b23d37ac..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11630.yml +++ /dev/null @@ -1,21 +0,0 @@ -author: "Markolie and Ionward" -delete-after: True -changes: - - rscadd: "Added Tajaran, Vulpkanin, Unathi and Vox sprites for the explorer gas mask (thanks to Ionward!)" - - rscadd: "Added custom species sprites for the explorer suits and hoods (thanks to Ionward!)" - - rscadd: "Added missing surgical tools and a pet vendor to the animal hospital." - - rscadd: "Added a custom cigarette vendor to the beach biodome ruin." - - rscadd: "Added an autolathe and RPD to the Lavaland Syndicate base. Also added a custom cigarette vendor and made the vendors not charge money." - - rscadd: "Added tiny fans to the mining base and labor camp exist." - - rscadd: "A separate jobban for ghost roles has been added." - - bugfix: "The alternative sink now has directional sprites. This resolves an issue with shelters having sinks facing the wrong way." - - bugfix: "Fixed the Syndicate sleepers on the Lavaland Syndicate base pointing the wrong way when a ghost role spawns in." - - bugfix: "Fixed Lava being removed by the staff of lava not working. Also added a missing warning effect when the staff is turning regular turf into lava." - - bugfix: "Fixed random bookcases not spawning books (hopefully)." - - bugfix: "Fixed surgical drapes not having a sprite." - - bugfix: "Fixed being unable to modify the GPS tag of shelters." - - bugfix: "Fixed the Lavaland swarmers not eating anything." - - bugfix: "The ash drake swoop attack is no longer incredibly loud." - - tweak: "The Syndicate base self-destruct is now much more powerful and capable of destroying the entire base." - - tweak: "The flavor text of Ash Walkers and Syndicate operatives now clarifies what they can('t) do." - - tweak: "Ash walkers can no longer use machinery." diff --git a/html/changelogs/AutoChangeLog-pr-11634.yml b/html/changelogs/AutoChangeLog-pr-11634.yml new file mode 100644 index 00000000000..c51b73a64ae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11634.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "The prison labor point system has been refactored so it works properly." diff --git a/html/changelogs/AutoChangeLog-pr-11641.yml b/html/changelogs/AutoChangeLog-pr-11641.yml deleted file mode 100644 index 8a74e6e0461..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11641.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - tweak: "Ash Walkers now once more have fine manipulation. Their lack of fine manipulation caused unintended side effects (such as them being unable to mine)." - - bugfix: "Ash Walkers (and other ghost spawner roles) can no longer be antagonist targets or become antagonists through the antagonist creation." - - bugfix: "Fixed the Lavaland Syndicate base incinerator buttons not working." - - bugfix: "Fixed the Syndicate communication agent spawning with a broken voice changer mask." - - bugfix: "Fixed the Disk Compartmentalizer not having a sprite." diff --git a/html/changelogs/AutoChangeLog-pr-11643.yml b/html/changelogs/AutoChangeLog-pr-11643.yml deleted file mode 100644 index 74fa2f18b4e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11643.yml +++ /dev/null @@ -1,18 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "The Ancient Goliath now has a small chance of spawning instead of regular goliaths." - - rscadd: "Survival capsules now have a NanoMed." - - tweak: "Water bottles now behave as glass containers." - - tweak: "The behaviour of glass reagent containers has changed. When used on non-mobs, contents will now only be spilled on harm intent. When used on mobs, on any intent aside from harm the contents will be fed to the mob like regular drinks. On harm intent it will still be spilled." - - tweak: "Hairless hide can now be made wet using most sources of water (minimum volume of 10), instead of just washing machines." - - bugfix: "Added some additional offstation role checks to ensure ghost spawner roles don't become antagonists, are kidnap targets or are counted towards station goals." - - bugfix: "Fixed some piping in the Lavaland Syndicate base incinerator and made sure the vault door starts locked." - - bugfix: "Fixed the Lavaland swarmers getting stuck on propulsion." - - bugfix: "Fix goliath tentacles sometimes being left behind." - - bugfix: "The walls around the Lavaland Syndicate base turbine have been coated, to prevent them from starting a plasma fire in the base." - - bugfix: "Syndicate agents can now access the air alarms on the Lavaland Syndicate base." - - bugfix: "Air alarm control computers can no longer access the air alarms on the Lavaland Syndicate base." - - bugfix: "Fixed the disk compartmentalizer/drying rack missing a sprite under certain circumstances." - - bugfix: "Fixed the Lavaland Syndicate base triggering atmospherics alerts." - - bugfix: "You can now properly place tiles on basalt." diff --git a/html/changelogs/AutoChangeLog-pr-11653.yml b/html/changelogs/AutoChangeLog-pr-11653.yml new file mode 100644 index 00000000000..141c0adf1be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11653.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - tweak: "change how bone breakage is calculated" diff --git a/html/changelogs/AutoChangeLog-pr-11656.yml b/html/changelogs/AutoChangeLog-pr-11656.yml deleted file mode 100644 index 5b0a8408162..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11656.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "An exploit with the sheet multiplier has been fixed." diff --git a/html/changelogs/AutoChangeLog-pr-11658.yml b/html/changelogs/AutoChangeLog-pr-11658.yml new file mode 100644 index 00000000000..a7deadb4af8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11658.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "Plating can now be removed (exposing the baseturf) using a welder." diff --git a/html/changelogs/AutoChangeLog-pr-11664.yml b/html/changelogs/AutoChangeLog-pr-11664.yml deleted file mode 100644 index 8acfb84a4f9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11664.yml +++ /dev/null @@ -1,21 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "Portals can now be activated by clicking on them with or without an object. Ghosts can now also click on them to be taken to their destination." - - rscadd: "Portals now warn admins when they are used to teleport megafauna." - - tweak: "The singularity can now eat basalt and chasms on Lavaland. They get turned into lava." - - bugfix: "AI swarmers will no longer get stuck on effects (such as blood)." - - bugfix: "Fixed the spectral blade turning all ghosts visible." - - bugfix: "Fixed a runtime with assigning outfits to mindless mobs." - - bugfix: "Fixed certain alarms triggering despite being outside of station contact and the Syndicate base still triggering fire alarms." - - bugfix: "Fixed being unable to put the wormhole jaunter in the belt slot." - - bugfix: "Fixed the disk compartmentalizer not accepting disks." - - bugfix: "Gutlunches and Gubbucks will now reproduce properly." - - bugfix: "The necropolis chest cult clothing drop no longer spawns with a cult hood as well, as that's part of the suit itself." - - bugfix: "Goliath steaks can now be eaten properly." - - bugfix: "Fixed a stray light on the beach ruin." - - bugfix: "Lavaland ruins should no longer spawn on the Labor Camp." - - bugfix: "Ancient goliaths will now properly randomly spawn tentacles." - - bugfix: "The labor camp will now spawn properly with a processing console." - - bugfix: "Water turfs in the beach ruin (and other water turfs that previously didn't do so) will now properly apply water to you." - - bugfix: "Ash flora is now anchored." diff --git a/html/changelogs/AutoChangeLog-pr-11674.yml b/html/changelogs/AutoChangeLog-pr-11674.yml new file mode 100644 index 00000000000..5c9edc40e27 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11674.yml @@ -0,0 +1,4 @@ +author: "DoctorDrugs" +delete-after: True +changes: + - rscadd: "Adds additional roundstart miner slots and the additional gear required for them to do their jobs" diff --git a/html/changelogs/AutoChangeLog-pr-11676.yml b/html/changelogs/AutoChangeLog-pr-11676.yml deleted file mode 100644 index cf6f4267e66..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11676.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Terilia" -delete-after: True -changes: - - rscadd: "Added the Donksoft sniper into the Trader spawnpool." diff --git a/html/changelogs/AutoChangeLog-pr-11684.yml b/html/changelogs/AutoChangeLog-pr-11684.yml new file mode 100644 index 00000000000..0f1250497f2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11684.yml @@ -0,0 +1,4 @@ +author: "IAmBigCoat" +delete-after: True +changes: + - tweak: "Added explosion warnings to medbeams, because medbeams can cause explosions. DON'T CROSS THE BEAMS!" diff --git a/html/changelogs/AutoChangeLog-pr-11687.yml b/html/changelogs/AutoChangeLog-pr-11687.yml new file mode 100644 index 00000000000..b6ceea4d139 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11687.yml @@ -0,0 +1,5 @@ +author: "Kyep" +delete-after: True +changes: + - rscadd: "Round time (h:mm) and station security level (green/red/blue/etc) are now visible on our server hub entry." + - tweak: "Round time is now visible to all player-controlled mobs in their status panel (including simple animals)." diff --git a/html/changelogs/AutoChangeLog-pr-11695.yml b/html/changelogs/AutoChangeLog-pr-11695.yml new file mode 100644 index 00000000000..d3208ba926b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11695.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "All remaining Lavaland ruins have been ported over from /tg/." diff --git a/html/changelogs/AutoChangeLog-pr-11696.yml b/html/changelogs/AutoChangeLog-pr-11696.yml new file mode 100644 index 00000000000..b52c32cd755 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11696.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "All chairs on shuttles have been replaced with brand new shuttle chairs." diff --git a/html/changelogs/AutoChangeLog-pr-11697.yml b/html/changelogs/AutoChangeLog-pr-11697.yml new file mode 100644 index 00000000000..03370b18a45 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11697.yml @@ -0,0 +1,8 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "Tribal splints have been added to the game, which can be crafted with two bones and one piece of sinew." + - rscadd: "The Lavaland Syndicate base now has a defibrillator and mounted defibrillator. The animal hospital now has a mounted defibrillator." + - tweak: "The Ash Walker storage area now comes with an advanced medkit instead of a regular one and one set of medical splints. It also comes with aloe vera, comfrey and wheat seeds." + - tweak: "The water tank in the Ash Walker nest has been replaced with a puddle." + - tweak: "The items in vending machines on the beach ruin and animal hospital are now free." diff --git a/html/changelogs/AutoChangeLog-pr-11732.yml b/html/changelogs/AutoChangeLog-pr-11732.yml new file mode 100644 index 00000000000..8f44fc99dae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11732.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - rscadd: "Adds the AFK auto cryo system. By default it won't affect players unless they activate it themselves by setting the preference in their game preferences tab." diff --git a/html/changelogs/AutoChangeLog-pr-11804.yml b/html/changelogs/AutoChangeLog-pr-11804.yml new file mode 100644 index 00000000000..355e6f0a32e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11804.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "Fixed an issue where slimes wouldn't take damage from water in space." diff --git a/html/changelogs/AutoChangeLog-pr-11805.yml b/html/changelogs/AutoChangeLog-pr-11805.yml new file mode 100644 index 00000000000..32aeba3f9eb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11805.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "It is no longer possible to unanchor the surivval pod storage units." diff --git a/html/changelogs/AutoChangeLog-pr-11806.yml b/html/changelogs/AutoChangeLog-pr-11806.yml new file mode 100644 index 00000000000..f70b8e32b82 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11806.yml @@ -0,0 +1,4 @@ +author: "Tayyyyyyy" +delete-after: True +changes: + - bugfix: "autocomplete input mishandling single quotes (you can teleport to Wizard's den now)" diff --git a/html/changelogs/AutoChangeLog-pr-11812.yml b/html/changelogs/AutoChangeLog-pr-11812.yml new file mode 100644 index 00000000000..e5bad933f7e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11812.yml @@ -0,0 +1,5 @@ +author: "Couls" +delete-after: True +changes: + - rscadd: "adds a line to alert people as to why they're not getting blood from the monkeys" + - bugfix: "The vampires are finally off their monkey diet, theycan now suck blood from players and humanized monkeys" diff --git a/html/changelogs/AutoChangeLog-pr-11821.yml b/html/changelogs/AutoChangeLog-pr-11821.yml new file mode 100644 index 00000000000..2a98f4dbae6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11821.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - bugfix: "Symptoms are now correctly generated for level 7 biohazards" diff --git a/html/changelogs/AutoChangeLog-pr-11825.yml b/html/changelogs/AutoChangeLog-pr-11825.yml new file mode 100644 index 00000000000..ca3de2da45c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11825.yml @@ -0,0 +1,4 @@ +author: "Ty-Omaha" +delete-after: True +changes: + - tweak: "Reworded permanent bans to non-expiring bans." diff --git a/html/changelogs/AutoChangeLog-pr-11829.yml b/html/changelogs/AutoChangeLog-pr-11829.yml new file mode 100644 index 00000000000..7af1b527603 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11829.yml @@ -0,0 +1,9 @@ +author: "Couls" +delete-after: True +changes: + - tweak: "Borgs can now cycle modules with X again" + - tweak: "Ahelp message is less confusing" + - tweak: "F2 (say) F3(ooc) F4(me) buttons have been restored +tweak:when numpad targetting is off you can use numpad 1-4 to change intents +tweak:pressing shift before any of the intent buttons doesn't change intents(for people with shift+1-4 macros) +tweak:backspace now sets the focus to the chat bar" diff --git a/html/changelogs/AutoChangeLog-pr-11836.yml b/html/changelogs/AutoChangeLog-pr-11836.yml new file mode 100644 index 00000000000..24758efc273 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11836.yml @@ -0,0 +1,4 @@ +author: "TheSardele" +delete-after: True +changes: + - tweak: "Lowers throwforce of drinking cartons from 15 to 0" diff --git a/html/changelogs/AutoChangeLog-pr-11851.yml b/html/changelogs/AutoChangeLog-pr-11851.yml new file mode 100644 index 00000000000..47a8eb82c03 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11851.yml @@ -0,0 +1,4 @@ +author: "Allfd" +delete-after: True +changes: + - tweak: "Panthers can now see in the dark." diff --git a/html/changelogs/AutoChangeLog-pr-11852.yml b/html/changelogs/AutoChangeLog-pr-11852.yml new file mode 100644 index 00000000000..5d94998f148 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11852.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - bugfix: "fixes the runtime caused by running keyloop for clients" diff --git a/html/changelogs/AutoChangeLog-pr-11856.yml b/html/changelogs/AutoChangeLog-pr-11856.yml new file mode 100644 index 00000000000..cefc38d19db --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11856.yml @@ -0,0 +1,5 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "Drinking from a beaker now only applies the effect of five units of the ingested chemical, instead of the entire volume of the beaker." + - bugfix: "Resolved an issue where beaker attack logs were reversed." diff --git a/html/changelogs/AutoChangeLog-pr-11861.yml b/html/changelogs/AutoChangeLog-pr-11861.yml new file mode 100644 index 00000000000..c430f657cbf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11861.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - bugfix: "Preferences not saving properly" diff --git a/html/changelogs/AutoChangeLog-pr-11864.yml b/html/changelogs/AutoChangeLog-pr-11864.yml new file mode 100644 index 00000000000..7f0a98c7c36 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11864.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "Moving through portals very quickly no longer breaks movement." diff --git a/html/changelogs/AutoChangeLog-pr-11567.yml b/html/changelogs/AutoChangeLog-pr-11867.yml similarity index 56% rename from html/changelogs/AutoChangeLog-pr-11567.yml rename to html/changelogs/AutoChangeLog-pr-11867.yml index 8e0769768f9..f18b03fc944 100644 --- a/html/changelogs/AutoChangeLog-pr-11567.yml +++ b/html/changelogs/AutoChangeLog-pr-11867.yml @@ -1,4 +1,4 @@ author: "Couls" delete-after: True changes: - - bugfix: "t-t-t-typo!" + - rscadd: "Restore hotkey mode" diff --git a/html/changelogs/AutoChangeLog-pr-11872.yml b/html/changelogs/AutoChangeLog-pr-11872.yml new file mode 100644 index 00000000000..066c6bb27ea --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11872.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - bugfix: "Q no longer drops items as a cyborg on AZERTY mode" diff --git a/html/changelogs/AutoChangeLog-pr-11873.yml b/html/changelogs/AutoChangeLog-pr-11873.yml new file mode 100644 index 00000000000..40626a2525b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11873.yml @@ -0,0 +1,4 @@ +author: "SteelSlayer" +delete-after: True +changes: + - bugfix: "The AI's robot control window now allows you to see and interact with available bots again" diff --git a/html/changelogs/AutoChangeLog-pr-11886.yml b/html/changelogs/AutoChangeLog-pr-11886.yml new file mode 100644 index 00000000000..e0d2c5fe116 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11886.yml @@ -0,0 +1,4 @@ +author: "TheSardele" +delete-after: True +changes: + - bugfix: "It is no longer possible to raise zero to -infinity fingers using the *signal emote" diff --git a/html/changelogs/AutoChangeLog-pr-11920.yml b/html/changelogs/AutoChangeLog-pr-11920.yml new file mode 100644 index 00000000000..224cb3173f7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11920.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - bugfix: "typing indicators show up again" diff --git a/html/changelogs/AutoChangeLog-pr-11933.yml b/html/changelogs/AutoChangeLog-pr-11933.yml new file mode 100644 index 00000000000..29692d6a1d7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11933.yml @@ -0,0 +1,4 @@ +author: "and DominikPanic" +delete-after: True +changes: + - bugfix: "Limits IC notes" diff --git a/html/changelogs/AutoChangeLog-pr-11935.yml b/html/changelogs/AutoChangeLog-pr-11935.yml new file mode 100644 index 00000000000..2c480fcd02f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11935.yml @@ -0,0 +1,4 @@ +author: "Ty-Omaha" +delete-after: True +changes: + - tweak: "Gave plastic surgery to line 364 of atoms.dm" diff --git a/html/changelogs/AutoChangeLog-pr-11938.yml b/html/changelogs/AutoChangeLog-pr-11938.yml new file mode 100644 index 00000000000..80b8fe04530 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11938.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "The syndicate can't use meta warfare no more. Advanced pinpointers no longer crash the server" diff --git a/html/changelogs/AutoChangeLog-pr-11946.yml b/html/changelogs/AutoChangeLog-pr-11946.yml new file mode 100644 index 00000000000..980f1fa2c52 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11946.yml @@ -0,0 +1,4 @@ +author: "TheSardele" +delete-after: True +changes: + - bugfix: "Earmuffs now properly protect you from vampire screeches no matter what you are wearing on your other ear" diff --git a/html/changelogs/AutoChangeLog-pr-11970.yml b/html/changelogs/AutoChangeLog-pr-11970.yml new file mode 100644 index 00000000000..ee787e9e99a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11970.yml @@ -0,0 +1,4 @@ +author: "datlo" +delete-after: True +changes: + - bugfix: "Fix some cases of traitors getting conflicting objectives, such as assassinating and protecting the same target." diff --git a/html/changelogs/AutoChangeLog-pr-11976.yml b/html/changelogs/AutoChangeLog-pr-11976.yml new file mode 100644 index 00000000000..b5916a16347 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11976.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes being able to sharpen toy double-bladed energy swords" diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index ea66e024a19..d3976bfff61 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 26cc4faf2ee..0167380d885 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/critter.dmi b/icons/mob/critter.dmi index 7bf89c1aab1..ddb2ebe5822 100644 Binary files a/icons/mob/critter.dmi and b/icons/mob/critter.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 409cf04e862..7f84b29d04e 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index b7f6b5c8f6a..849db6579a5 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index ae285a5453a..47cb86a2c89 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 8b949a8e732..e4630c2764e 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 08aca040280..8027568e31b 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/nest.dmi b/icons/mob/nest.dmi index 7dab335929e..d838ef6c5da 100644 Binary files a/icons/mob/nest.dmi and b/icons/mob/nest.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 60488151158..b18cb799817 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen_full.dmi index 595b870a172..d1aa736b352 100644 Binary files a/icons/mob/screen_full.dmi and b/icons/mob/screen_full.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 62f732a224f..6209ce84949 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/mob/species/drask/mask.dmi b/icons/mob/species/drask/mask.dmi index dffedfb1c78..9b9c341feb3 100644 Binary files a/icons/mob/species/drask/mask.dmi and b/icons/mob/species/drask/mask.dmi differ diff --git a/icons/mob/species/drask/uniform.dmi b/icons/mob/species/drask/uniform.dmi index d29b598dec3..ab315263ed9 100644 Binary files a/icons/mob/species/drask/uniform.dmi and b/icons/mob/species/drask/uniform.dmi differ diff --git a/icons/mob/species/grey/mask.dmi b/icons/mob/species/grey/mask.dmi index 112895a6009..6d13b33c4bf 100644 Binary files a/icons/mob/species/grey/mask.dmi and b/icons/mob/species/grey/mask.dmi differ diff --git a/icons/mob/species/grey/uniform.dmi b/icons/mob/species/grey/uniform.dmi index e71e020ff4a..ddf0250fdc5 100644 Binary files a/icons/mob/species/grey/uniform.dmi and b/icons/mob/species/grey/uniform.dmi differ diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi index 3b2c1891c07..f73989fe9b0 100644 Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi index 5274697cdc1..ba9be383855 100644 Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi index b836b78538f..7023b2c3247 100644 Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi index b8169f9bd51..18a3e07ce76 100644 Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi index 43b527266b8..e50c3421fb0 100644 Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index e5102b7eee9..69f9e04895e 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi index 1bfe6c2a25e..dba239a064f 100644 Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi new file mode 100644 index 00000000000..c147f01fdff Binary files /dev/null and b/icons/obj/clockwork_objects.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 1bfe41618c4..a20cf61eb33 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index f158b1df20d..b3a04ce73bf 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index c39331ce8d4..78586b72dfc 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 469934ca932..f48f0e9f07a 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/hand_of_god_structures.dmi b/icons/obj/hand_of_god_structures.dmi new file mode 100644 index 00000000000..4f18b2e68d4 Binary files /dev/null and b/icons/obj/hand_of_god_structures.dmi differ diff --git a/icons/obj/interface.dmi b/icons/obj/interface.dmi index 3b64561d5e0..631bba214c8 100644 Binary files a/icons/obj/interface.dmi and b/icons/obj/interface.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 0cfe6dc554c..05a5768ce89 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index a0486389b74..cd2c6da08ee 100644 Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ diff --git a/icons/obj/lavaland/dead_ratvar.dmi b/icons/obj/lavaland/dead_ratvar.dmi new file mode 100644 index 00000000000..5e6e9087bd0 Binary files /dev/null and b/icons/obj/lavaland/dead_ratvar.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index f57c6ded447..f28e5f83a33 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/puzzle.dmi b/icons/obj/puzzle.dmi new file mode 100644 index 00000000000..f623142beb4 Binary files /dev/null and b/icons/obj/puzzle.dmi differ diff --git a/icons/obj/smooth_structures/catwalk_clockwork.dmi b/icons/obj/smooth_structures/catwalk_clockwork.dmi new file mode 100644 index 00000000000..ecef1df3897 Binary files /dev/null and b/icons/obj/smooth_structures/catwalk_clockwork.dmi differ diff --git a/icons/obj/smooth_structures/catwalk_clockwork_large.dmi b/icons/obj/smooth_structures/catwalk_clockwork_large.dmi new file mode 100644 index 00000000000..675ebd91f6d Binary files /dev/null and b/icons/obj/smooth_structures/catwalk_clockwork_large.dmi differ diff --git a/icons/obj/smooth_structures/lattice_clockwork.dmi b/icons/obj/smooth_structures/lattice_clockwork.dmi new file mode 100644 index 00000000000..23beeecb276 Binary files /dev/null and b/icons/obj/smooth_structures/lattice_clockwork.dmi differ diff --git a/icons/obj/smooth_structures/lattice_clockwork_large.dmi b/icons/obj/smooth_structures/lattice_clockwork_large.dmi new file mode 100644 index 00000000000..3b035d8736b Binary files /dev/null and b/icons/obj/smooth_structures/lattice_clockwork_large.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 411f371af9b..400b42105f4 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/walls/clockwork_wall.dmi b/icons/turf/walls/clockwork_wall.dmi new file mode 100644 index 00000000000..8263e901d00 Binary files /dev/null and b/icons/turf/walls/clockwork_wall.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 0bec55ef51c..8edded38e93 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -96,27 +96,6 @@ src << link(config.donationsurl) else to_chat(src, "The rules URL is not set in the server configuration.") - -/client/verb/hotkey_mode() - set name = "Set Hotkey Mode" - set category = "Preferences" - - var/list/hotkey_modes = list() - for(var/hotkey_mode in subtypesof(/datum/hotkey_mode)) - var/datum/hotkey_mode/H = hotkey_mode - hotkey_modes[initial(H.name)] = H - - var/chosen_mode_name = input("Choose your preferred hotkey mode.", "Hotkey mode selection") as null|anything in hotkey_modes - if(!chosen_mode_name) - return - - var/datum/hotkey_mode/chosen_mode = hotkey_modes[chosen_mode_name] - var/datum/hotkey_mode/hotkey_mode = new chosen_mode(src) - - hotkey_mode.set_winset_values() - to_chat(usr, "Your hotkey mode has been changed to [hotkey_mode.name].") - - qdel(hotkey_mode) /client/verb/hotkeys_help() set name = "Hotkey Help" @@ -144,56 +123,58 @@ Admin ghost: /mob/proc/hotkey_help() var/hotkey_mode = {" Hotkey-Mode: (hotkey-mode must be on) -\tTAB = Toggle Hotkey Mode -\ta = Move Left -\ts = Move Down -\td = Move Right -\tw = Move Up -\tq = Drop Item -\te = Equip Item -\tr = Throw Item -\tm = Me -\tt = Say -\to = OOC -\tb = Resist -\tx = Swap Hands -\tz = Activate Held Object (or y) -\tf = Cycle Intents Left -\tg = Cycle Intents Right -\t1 = Help Intent -\t2 = Disarm Intent -\t3 = Grab Intent -\t4 = Harm Intent +\tTAB = toggle hotkey-mode +\tA = left +\tS = down +\tD = right +\tW = up +\tQ = drop +\tE = equip +\tR = throw +\tM = me +\tT = say +\tO = OOC +\tB = resist +\tH = Holster/unholster gun if you have a holster +\tX = swap-hand +\tZ = activate held object (or y) +\tF = cycle-intents-left +\tG = cycle-intents-right +\t1 = help-intent +\t2 = disarm-intent +\t3 = grab-intent +\t4 = harm-intent +\tNumpad = Body target selection (Press 8 repeatedly for Head->Eyes->Mouth) +\tAlt(HOLD) = Alter movement intent "} var/other = {" Any-Mode: (hotkey doesn't need to be on) -\tCtrl+a = Move Left -\tCtrl+s = Move Down -\tCtrl+d = Move Right -\tCtrl+w = Move Up -\tCtrl+q = Drop Item -\tCtrl+e = Equip Item -\tCtrl+r = Throw Item -\tCtrl+b = Resist -\tCtrl+o = OOC -\tCtrl+x = Swap Hands -\tCtrl+z = Activate Held Object (or Ctrl+y) -\tCtrl+f = Cycle Intents Left -\tCtrl+g = Cycle Intents Right -\tCtrl+1 = Help Intent -\tCtrl+2 = Disarm Intent -\tCtrl+3 = Grab Intent -\tCtrl+4 = Harm Intent -\tDEL = Pull -\tINS = Cycle Intents Right -\tHOME = Drop Item -\tPGUP = Swap Hands -\tPGDN = Activate Held Object -\tEND = Throw Item -\tF2 = OOC -\tF3 = Say -\tF4 = Me +\tCtrl+A = left +\tCtrl+S = down +\tCtrl+D = right +\tCtrl+W = up +\tCtrl+Q = drop +\tCtrl+E = equip +\tCtrl+R = throw +\tCtrl+B = resist +\tCtrl+H = stop pulling +\tCtrl+O = OOC +\tCtrl+X = swap-hand +\tCtrl+Z = activate held object (or Ctrl+y) +\tCtrl+F = cycle-intents-left +\tCtrl+G = cycle-intents-right +\tCtrl+1 = help-intent +\tCtrl+2 = disarm-intent +\tCtrl+3 = grab-intent +\tCtrl+4 = harm-intent +\tDEL = stop pulling +\tINS = cycle-intents-right +\tHOME = drop +\tPGUP = swap-hand +\tPGDN = activate held object +\tEND = throw +\tCtrl+Numpad = Body target selection (Press 8 repeatedly for Head->Eyes->Mouth) "} to_chat(src, hotkey_mode) @@ -203,19 +184,19 @@ Any-Mode: (hotkey doesn't need to be on) var/hotkey_mode = {" Hotkey-Mode: (hotkey-mode must be on) \tTAB = Toggle Hotkey Mode -\ta = Move Left -\ts = Move Down -\td = Move Right -\tw = Move Up -\tq = Unequip Active Module -\tm = Me -\tt = Say -\to = OOC -\tx = Cycle Active Modules -\tb = Resist -\tz = Activate Held Object (or y) -\tf = Cycle Intents Left -\tg = Cycle Intents Right +\tA = Move Left +\tS = Move Down +\tD = Move Right +\tW = Move Up +\tQ = Unequip Active Module +\tM = Me +\tT = Say +\tO = OOC +\tX = Cycle Active Modules +\tB = Resist +\tZ or Y = Activate Held Object +\tF = Cycle Intents Left +\tG = Cycle Intents Right \t1 = Activate Module 1 \t2 = Activate Module 2 \t3 = Activate Module 3 @@ -224,17 +205,17 @@ Hotkey-Mode: (hotkey-mode must be on) var/other = {" Any-Mode: (hotkey doesn't need to be on) -\tCtrl+a = Move Left -\tCtrl+s = Move Down -\tCtrl+d = Move Right -\tCtrl+w = Move Up -\tCtrl+q = Unequip Active Module -\tCtrl+x = Cycle Active Modules -\tCtrl+b = Resist -\tCtrl+o = OOC -\tCtrl+z = Activate Held Object (or Ctrl+y) -\tCtrl+f = Cycle Intents Left -\tCtrl+g = Cycle Intents Right +\tCtrl+A = Move Left +\tCtrl+S = Move Down +\tCtrl+D = Move Right +\tCtrl+W = Move Up +\tCtrl+Q = Unequip Active Module +\tCtrl+X = Cycle Active Modules +\tCtrl+B = Resist +\tCtrl+O = OOC +\tCtrl+Z or Ctrl+Y = Activate Held Object +\tCtrl+F = Cycle Intents Left +\tCtrl+G = Cycle Intents Right \tCtrl+1 = Activate Module 1 \tCtrl+2 = Activate Module 2 \tCtrl+3 = Activate Module 3 diff --git a/interface/skin.dmf b/interface/skin.dmf index e77ab2f9e33..a9af84c81ed 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,1411 +1,40 @@ -macro "macro" - elem "MACRO-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=hotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#f0f0f0\"" - is-disabled = false - elem "MACRO-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "MACRO-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "MACRO-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "MACRO-SOUTHWEST" - name = "SOUTHWEST" - command = ".southwest" - is-disabled = false - elem "MACRO-NORTHWEST" - name = "NORTHWEST" - command = ".northwest" - is-disabled = false - elem "MACRO-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "MACRO-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "MACRO-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "MACRO-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "MACRO-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "MACRO-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "MACRO-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "MACRO-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "MACRO-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "MACRO-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "MACRO-CTRL+1" - name = "CTRL+1" - command = "a-intent help" - is-disabled = false - elem "MACRO-CTRL+2" - name = "CTRL+2" - command = "a-intent disarm" - is-disabled = false - elem "MACRO-CTRL+3" - name = "CTRL+3" - command = "a-intent grab" - is-disabled = false - elem "MACRO-CTRL+4" - name = "CTRL+4" - command = "a-intent harm" - is-disabled = false - elem "MACRO-CTRL+A+REP" - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem "MACRO-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "MACRO-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "MACRO-CTRL+E" - name = "CTRL+E" - command = "quick-equip" - is-disabled = false - elem "MACRO-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "MACRO-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "MACRO-CTRL+Q" - name = "CTRL+Q" - command = ".northwest" - is-disabled = false - elem "MACRO-CTRL+R" - name = "CTRL+R" - command = ".southwest" - is-disabled = false - elem "MACRO-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "MACRO-CTRL+W+REP" - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem "MACRO-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "MACRO-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "MACRO-CTRL+Z" - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem "MACRO-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "MACRO-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "MACRO-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "MACRO-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "MACRO-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "MACRO-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "MACRO-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "MACRO-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "MACRO-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "MACRO-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "MACRO-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "MACRO-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "MACRO-F12" - name = "F12" - command = "F12" - is-disabled = false - -macro "hotkeymode" - elem "HKMODE-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5\"" - is-disabled = false - elem "HKMODE-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "HKMODE-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "HKMODE-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "HKMODE-SOUTHWEST" - name = "SOUTHWEST" - command = ".southwest" - is-disabled = false - elem "HKMODE-NORTHWEST" - name = "NORTHWEST" - command = ".northwest" - is-disabled = false - elem "HKMODE-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "HKMODE-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "HKMODE-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "HKMODE-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "HKMODE-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "HKMODE-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "HKMODE-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "HKMODE-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "HKMODE-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "HKMODE-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "HKMODE-1" - name = "1" - command = "a-intent help" - is-disabled = false - elem "HKMODE-CTRL+1" - name = "CTRL+1" - command = "a-intent help" - is-disabled = false - elem "HKMODE-2" - name = "2" - command = "a-intent disarm" - is-disabled = false - elem "HKMODE-CTRL+2" - name = "CTRL+2" - command = "a-intent disarm" - is-disabled = false - elem "HKMODE-3" - name = "3" - command = "a-intent grab" - is-disabled = false - elem "HKMODE-CTRL+3" - name = "CTRL+3" - command = "a-intent grab" - is-disabled = false - elem "HKMODE-4" - name = "4" - command = "a-intent harm" - is-disabled = false - elem "HKMODE-CTRL+4" - name = "CTRL+4" - command = "a-intent harm" - is-disabled = false - elem "HKMODE-T" - name = "T" - command = ".say" - is-disabled = false - elem "HKMODE-O" - name = "O" - command = "ooc" - is-disabled = false - elem "HKMODE-M" - name = "M" - command = ".me" - is-disabled = false - elem "HKMODE-A+REP" - name = "A+REP" - command = ".moveleft" - is-disabled = false - elem "HKMODE-CTRL+A+REP" - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem "HKMODE-D+REP" - name = "D+REP" - command = ".moveright" - is-disabled = false - elem "HKMODE-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "HKMODE-B" - name = "B" - command = "resist" - is-disabled = false - elem "HKMODE-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "HKMODE-E" - name = "E" - command = "quick-equip" - is-disabled = false - elem "HKMODE-CTRL+E" - name = "CTRL+E" - command = "quick-equip" - is-disabled = false - elem "HKMODE-F" - name = "F" - command = "a-intent left" - is-disabled = false - elem "HKMODE-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "HKMODE-G" - name = "G" - command = "a-intent right" - is-disabled = false - elem "HKMODE-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "HKMODE-H" - name = "H" - command = "holster" - is-disabled = false - elem "HKMODE-CTRL+H" - name = "CTRL+H" - command = "holster" - is-disabled = false - elem "HKMODE-Q" - name = "Q" - command = ".northwest" - is-disabled = false - elem "HKMODE-CTRL+Q" - name = "CTRL+Q" - command = ".northwest" - is-disabled = false - elem "HKMODE-R" - name = "R" - command = ".southwest" - is-disabled = false - elem "HKMODE-CTRL+R" - name = "CTRL+R" - command = ".southwest" - is-disabled = false - elem "s_key" - name = "S+REP" - command = ".movedown" - is-disabled = false - elem "HKMODE-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "HKMODE-T" - name = "T" - command = ".say" - is-disabled = false - elem "w_key" - name = "W+REP" - command = ".moveup" - is-disabled = false - elem "HKMODE-CTRL+W+REP" - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem "HKMODE-X" - name = "X" - command = ".northeast" - is-disabled = false - elem "HKMODE-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "HKMODE-Y" - name = "Y" - command = "Activate-Held-Object" - is-disabled = false - elem "HKMODE-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "HKMODE-Z" - name = "Z" - command = "Activate-Held-Object" - is-disabled = false - elem "HKMODE-CTRL+Z" - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem "HKMODE-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "HKMODE-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "HKMODE-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "HKMODE-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "HKMODE-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "HKMODE-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "HKMODE-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "HKMODE-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "HKMODE-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "HKMODE-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "HKMODE-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "HKMODE-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "HKMODE-F12" - name = "F12" - command = "F12" - is-disabled = false - -macro "borgmacro" - elem "BRGMACRO-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\"" - is-disabled = false - elem "BRGMACRO-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "BRGMACRO-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "BRGMACRO-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "BRGMACRO-NORTHWEST" - name = "NORTHWEST" - command = "unequip-module" - is-disabled = false - elem "BRGMACRO-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "BRGMACRO-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "BRGMACRO-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "BRGMACRO-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "BRGMACRO-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "BRGMACRO-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "BRGMACRO-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "BRGMACRO-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "BRGMACRO-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "BRGMACRO-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "BRGMACRO-CTRL+1" - name = "CTRL+1" - command = "toggle-module 1" - is-disabled = false - elem "BRGMACRO-CTRL+2" - name = "CTRL+2" - command = "toggle-module 2" - is-disabled = false - elem "BRGMACRO-CTRL+3" - name = "CTRL+3" - command = "toggle-module 3" - is-disabled = false - elem "BRGMACRO-CTRL+4" - name = "CTRL+4" - command = "a-intent left" - is-disabled = false - elem "BRGMACRO-CTRL+A+REP" - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem "BRGMACRO-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "BRGMACRO-CTRL+O" - name = "CTRL+O" - command = "ooc" - is-disabled = false - elem "BRGMACRO-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "BRGMACRO-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "BRGMACRO-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "BRGMACRO-CTRL+Q" - name = "CTRL+Q" - command = "unequip-module" - is-disabled = false - elem "BRGMACRO-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "BRGMACRO-CTRL+W+REP" - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem "BRGMACRO-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "BRGMACRO-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGMACRO-CTRL+Z" - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGMACRO-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "BRGMACRO-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "BRGMACRO-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "BRGMACRO-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "BRGMACRO-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "BRGMACRO-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "BRGMACRO-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "BRGMACRO-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "BRGMACRO-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "BRGMACRO-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "BRGMACRO-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "BRGMACRO-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "BRGMACRO-F12" - name = "F12" - command = "F12" - is-disabled = false - -macro "borghotkeymode" - elem "BRGHK-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5\"" - is-disabled = false - elem "BRGHK-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "BRGHK-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "BRGHK-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "BRGHK-NORTHWEST" - name = "NORTHWEST" - command = "unequip-module" - is-disabled = false - elem "BRGHK-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "BRGHK-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "BRGHK-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "BRGHK-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "BRGHK-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "BRGHK-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "BRGHK-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "BRGHK-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "BRGHK-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "BRGHK-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "BRGHK-1" - name = "1" - command = "toggle-module 1" - is-disabled = false - elem "BRGHK-CTRL+1" - name = "CTRL+1" - command = "toggle-module 1" - is-disabled = false - elem "BRGHK-2" - name = "2" - command = "toggle-module 2" - is-disabled = false - elem "BRGHK-CTRL+2" - name = "CTRL+2" - command = "toggle-module 2" - is-disabled = false - elem "BRGHK-3" - name = "3" - command = "toggle-module 3" - is-disabled = false - elem "BRGHK-CTRL+3" - name = "CTRL+3" - command = "toggle-module 3" - is-disabled = false - elem "BRGHK-4" - name = "4" - command = "a-intent left" - is-disabled = false - elem "BRGHK-CTRL+4" - name = "CTRL+4" - command = "a-intent left" - is-disabled = false - elem "BRGHK-A+REP" - name = "A+REP" - command = ".moveleft" - is-disabled = false - elem "BRGHK-CTRL+A+REP" - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem "BRGHK-B" - name = "B" - command = "resist" - is-disabled = false - elem "BRGHK-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "BRGHK-T" - name = "T" - command = ".say" - is-disabled = false - elem "BRGHK-O" - name = "O" - command = "ooc" - is-disabled = false - elem "BRGHK-M" - name = "M" - command = ".me" - is-disabled = false - elem "BRGHK-CTRL+O" - name = "CTRL+O" - command = "ooc" - is-disabled = false - elem "BRGHK-D+REP" - name = "D+REP" - command = ".moveright" - is-disabled = false - elem "BRGHK-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "BRGHK-F" - name = "F" - command = "a-intent left" - is-disabled = false - elem "BRGHK-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "BRGHK-G" - name = "G" - command = "a-intent right" - is-disabled = false - elem "BRGHK-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "BRGHK-Q" - name = "Q" - command = "unequip-module" - is-disabled = false - elem "BRGHK-CTRL+Q" - name = "CTRL+Q" - command = "unequip-module" - is-disabled = false - elem "s_key" - name = "S+REP" - command = ".movedown" - is-disabled = false - elem "BRGHK-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "w_key" - name = "W+REP" - command = ".moveup" - is-disabled = false - elem "BRGHK-CTRL+W+REP" - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem "BRGHK-X" - name = "X" - command = ".northeast" - is-disabled = false - elem "BRGHK-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "BRGHK-Y" - name = "Y" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGHK-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGHK-Z" - name = "Z" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGHK-CTRL+Z" - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGHK-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "BRGHK-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "BRGHK-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "BRGHK-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "BRGHK-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "BRGHK-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "BRGHK-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "BRGHK-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "BRGHK-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "BRGHK-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "BRGHK-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "BRGHK-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "BRGHK-F12" - name = "F12" - command = "F12" - is-disabled = false - -macro "azertymacro" - elem "AZRFF-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=azertyhotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\"" - is-disabled = false - elem "AZRFF-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "AZRFF-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "AZRFF-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "AZRFF-SOUTHWEST" - name = "SOUTHWEST" - command = ".southwest" - is-disabled = false - elem "AZRFF-NORTHWEST" - name = "NORTHWEST" - command = ".northwest" - is-disabled = false - elem "AZRFF-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "AZRFF-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "AZRFF-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "AZRFF-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "AZRFF-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "AZRFF-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "AZRFF-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "AZRFF-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "AZRFF-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "AZRFF-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "AZRFF-CTRL+1" - name = "CTRL+1" - command = "a-intent help" - is-disabled = false - elem "AZRFF-CTRL+2" - name = "CTRL+2" - command = "a-intent disarm" - is-disabled = false - elem "AZRFF-CTRL+3" - name = "CTRL+3" - command = "a-intent grab" - is-disabled = false - elem "AZRFF-CTRL+4" - name = "CTRL+4" - command = "a-intent harm" - is-disabled = false - elem "AZRFF-CTRL+A" - name = "CTRL+A" - command = ".northwest" - is-disabled = false - elem "AZRFF-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "AZRFF-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "AZRFF-CTRL+E" - name = "CTRL+E" - command = "quick-equip" - is-disabled = false - elem "AZRFF-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "AZRFF-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "AZRFF-CTRL+Q+REP" - name = "CTRL+Q+REP" - command = ".moveleft" - is-disabled = false - elem "AZRFF-CTRL+R" - name = "CTRL+R" - command = ".southwest" - is-disabled = false - elem "AZRFF-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "AZRFF-CTRL+W" - name = "CTRL+W" - command = "Activate-Held-Object" - is-disabled = false - elem "AZRFF-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "AZRFF-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "AZRFF-CTRL+Z+REP" - name = "CTRL+Z+REP" - command = ".moveup" - is-disabled = false - elem "AZRFF-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "AZRFF-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "AZRFF-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "AZRFF-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "AZRFF-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "AZRFF-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "AZRFF-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "AZRFF-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "AZRFF-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "AZRFF-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "AZRFF-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "AZRFF-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "AZRFF-F12" - name = "F12" - command = "F12" - is-disabled = false - -macro "azertyhotkeymode" - elem "AZRON-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=azertymacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5\"" - is-disabled = false - elem "AZRON-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "AZRON-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "AZRON-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "AZRON-SOUTHWEST" - name = "SOUTHWEST" - command = ".southwest" - is-disabled = false - elem "AZRON-NORTHWEST" - name = "NORTHWEST" - command = ".northwest" - is-disabled = false - elem "AZRON-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "AZRON-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "AZRON-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "AZRON-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "AZRON-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "AZRON-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "AZRON-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "AZRON-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "AZRON-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "AZRON-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "AZRON-1" - name = "1" - command = "a-intent help" - is-disabled = false - elem "AZRON-CTRL+1" - name = "CTRL+1" - command = "a-intent help" - is-disabled = false - elem "AZRON-2" - name = "2" - command = "a-intent disarm" - is-disabled = false - elem "AZRON-CTRL+2" - name = "CTRL+2" - command = "a-intent disarm" - is-disabled = false - elem "AZRON-3" - name = "3" - command = "a-intent grab" - is-disabled = false - elem "AZRON-CTRL+3" - name = "CTRL+3" - command = "a-intent grab" - is-disabled = false - elem "AZRON-4" - name = "4" - command = "a-intent harm" - is-disabled = false - elem "AZRON-CTRL+4" - name = "CTRL+4" - command = "a-intent harm" - is-disabled = false - elem "AZRON-A" - name = "A" - command = ".northwest" - is-disabled = false - elem "AZRON-CTRL+A" - name = "CTRL+A" - command = ".northwest" - is-disabled = false - elem "AZRON-D+REP" - name = "D+REP" - command = ".moveright" - is-disabled = false - elem "AZRON-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "AZRON-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "AZRON-E" - name = "E" - command = "quick-equip" - is-disabled = false - elem "AZRON-CTRL+E" - name = "CTRL+E" - command = "quick-equip" - is-disabled = false - elem "AZRON-F" - name = "F" - command = "a-intent left" - is-disabled = false - elem "AZRON-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "AZRON-G" - name = "G" - command = "a-intent right" - is-disabled = false - elem "AZRON-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "AZRON-H" - name = "H" - command = "holster" - is-disabled = false - elem "AZRON-CTRL+H" - name = "CTRL+H" - command = "holster" - is-disabled = false - elem "AZRON-Q+REP" - name = "Q+REP" - command = ".moveleft" - is-disabled = false - elem "AZRON-CTRL+Q+REP" - name = "CTRL+Q+REP" - command = ".moveleft" - is-disabled = false - elem "AZRON-R" - name = "R" - command = ".southwest" - is-disabled = false - elem "AZRON-CTRL+R" - name = "CTRL+R" - command = ".southwest" - is-disabled = false - elem "s_key" - name = "S+REP" - command = ".movedown" - is-disabled = false - elem "AZRON-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "AZRON-T" - name = "T" - command = ".say" - is-disabled = false - elem "AZRON-O" - name = "O" - command = "ooc" - is-disabled = false - elem "AZRON-M" - name = "M" - command = ".me" - is-disabled = false - elem "AZRON-W" - name = "W" - command = "Activate-Held-Object" - is-disabled = false - elem "AZRON-CTRL+W" - name = "CTRL+W" - command = "Activate-Held-Object" - is-disabled = false - elem "AZRON-X" - name = "X" - command = ".northeast" - is-disabled = false - elem "AZRON-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "AZRON-Y" - name = "Y" - command = "Activate-Held-Object" - is-disabled = false - elem "AZRON-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "w_key" - name = "Z+REP" - command = ".moveup" - is-disabled = false - elem "AZRON-CTRL+Z+REP" - name = "CTRL+Z+REP" - command = ".moveup" - is-disabled = false - elem "AZRON-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "AZRON-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "AZRON-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "AZRON-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "AZRON-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "AZRON-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "AZRON-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "AZRON-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "AZRON-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "AZRON-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "AZRON-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "AZRON-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "AZRON-F12" - name = "F12" - command = "F12" - is-disabled = false +macro "default" menu "menu" - elem + elem name = "&File" command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Quick screenshot\tF2" command = ".screenshot auto" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Save screenshot as...\tShift+F2" command = ".screenshot" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" elem "reconnectbutton" name = "&Reconnect" command = ".reconnect" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "" command = "" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Quit" command = ".quit" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Icons" command = "" saved-params = "is-checked" - elem + elem name = "&Size" command = "" category = "&Icons" @@ -1453,7 +82,7 @@ menu "menu" can-check = true group = "size" saved-params = "is-checked" - elem + elem name = "&Scaling" command = "" category = "&Icons" @@ -1484,106 +113,79 @@ menu "menu" command = ".winset \"menu.textmode.is-checked=true?mapwindow.map.text-mode=true:mapwindow.map.text-mode=false\"" category = "&Icons" can-check = true - group = "" saved-params = "is-checked" - - elem + elem name = "&Help" command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Admin help\tF1" command = "adminhelp" category = "&Help" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Hotkeys" command = "hotkeys-help" category = "&Help" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" window "mainwindow" elem "mainwindow" type = MAIN + pos = 0,0 size = 640x440 + anchor1 = none + anchor2 = none is-default = true - is-maximized = true - title = "Paradise Station 13" - icon = 'icons\\paradise.png' - menu = "menu" - macro = "macro" saved-params = "pos;size;is-minimized;is-maximized" + title = "Paradise Station 13" + is-maximized = true + icon = 'icons\\paradise.png' + macro = "default" + menu = "menu" elem "asset_cache_browser" type = BROWSER - is-visible = false - elem "hotkey_toggle" - type = BUTTON - button-type = pushbox - pos = 560,420 - size = 80x20 - anchor1 = 100,100 + pos = 0,0 + size = 200x200 + anchor1 = none anchor2 = none - background-color = none + is-visible = false saved-params = "" - is-flat = false - text = "Hotkey Toggle" - command = ".winset \"mainwindow.macro != macro ? mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5 : mainwindow.macro=hotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#f0f0f0\"" elem "mainvsplit" type = CHILD pos = 3,0 size = 634x416 anchor1 = 0,0 anchor2 = 100,100 - is-vert = true - splitter = 50 - show-splitter = true + saved-params = "splitter" left = "mapwindow" right = "rpane" - saved-params = "splitter" + is-vert = true elem "input" type = INPUT pos = 3,420 size = 477x20 anchor1 = 0,100 anchor2 = 100,100 + background-color = #d3b5b5 is-default = true border = sunken - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = #d3b5b5 saved-params = "command" elem "saybutton" type = BUTTON - button-type = pushbox - pos = 520,420 - size = 40x20 + pos = 480,420 + size = 80x20 anchor1 = 100,100 anchor2 = none - is-flat = false + saved-params = "is-checked" text = "Chat" command = ".winset \"saybutton.is-checked=true?input.command=\"!say \\\"\" macrobutton.is-checked=false:input.command=\"\"saybutton.is-checked=true?mebutton.is-checked=false\"" - is-checked = false - saved-params = "is-checked" + button-type = pushbox elem "mebutton" type = BUTTON - pos = 480,420 - size = 40x20 + pos = 560,420 + size = 80x20 anchor1 = 100,100 anchor2 = none saved-params = "is-checked" @@ -1594,54 +196,63 @@ window "mainwindow" type = BROWSER pos = 0,0 size = 999x999 + anchor1 = none + anchor2 = none is-visible = false + saved-params = "" window "mapwindow" elem "mapwindow" type = MAIN - is-pane = true - title = "Map window" + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none saved-params = "pos;size;is-minimized;is-maximized" + title = "Map window" + is-pane = true elem "map" type = MAP - is-default = true pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 font-family = "Arial" font-size = 7 - font-style = "" text-color = none - background-color = none - icon-size = 0 + is-default = true saved-params = "icon-size" window "outputwindow" elem "outputwindow" type = MAIN - is-pane = true - can-close = false - can-minimize = false + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none saved-params = "pos;size;is-minimized;is-maximized" title = "Output window" + can-close = false + can-minimize = false + is-pane = true elem "browseroutput" type = BROWSER - is-disabled = true - auto-format = false pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 background-color = #ffffff + is-disabled = true + saved-params = "" + auto-format = false window "rpane" elem "rpane" type = MAIN + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none saved-params = "pos;size;is-minimized;is-maximized" is-pane = true elem "rpanewindow" @@ -1651,15 +262,14 @@ window "rpane" anchor1 = 0,0 anchor2 = 100,100 saved-params = "splitter" - left = "" right = "outputwindow" is-vert = false - splitter = 50 - show-splitter = true elem "textb" type = BUTTON pos = 0,7 size = 60x16 + anchor1 = none + anchor2 = none is-visible = false saved-params = "is-checked" text = "Text" @@ -1671,6 +281,8 @@ window "rpane" type = BUTTON pos = 64,7 size = 60x16 + anchor1 = none + anchor2 = none is-visible = false saved-params = "is-checked" text = "Info" @@ -1681,63 +293,89 @@ window "rpane" type = BUTTON pos = 155,7 size = 60x16 + anchor1 = none + anchor2 = none + saved-params = "is-checked" text = "Wiki" command = "wiki" elem "forumb" type = BUTTON pos = 220,7 size = 60x16 + anchor1 = none + anchor2 = none + saved-params = "is-checked" text = "Forum" command = "forum" elem "rulesb" type = BUTTON pos = 285,7 size = 60x16 + anchor1 = none + anchor2 = none + saved-params = "is-checked" text = "Rules" command = "rules" elem "githubb" type = BUTTON pos = 350,7 size = 60x16 + anchor1 = none + anchor2 = none + saved-params = "is-checked" text = "GitHub" command = "github" elem "changelog" type = BUTTON pos = 415,7 size = 67x16 + anchor1 = none + anchor2 = none + saved-params = "is-checked" text = "Changelog" command = "Changelog" elem "discordb" type = BUTTON pos = 487,7 size = 60x16 - background-color = #7289DA - text-color = #FFFFFF - font-style = bold + anchor1 = none + anchor2 = none + font-style = "bold" + text-color = #ffffff + background-color = #7289da + saved-params = "is-checked" text = "Discord" command = "discord" elem "karma" type = BUTTON pos = 552,7 size = 60x16 - background-color = #FF4500 - text-color = #FFFFFF - font-style = bold + anchor1 = none + anchor2 = none + font-style = "bold" + text-color = #ffffff + background-color = #ff4500 + saved-params = "is-checked" text = "Karma" command = "karmashop" elem "donate" type = BUTTON pos = 617,7 size = 60x16 + anchor1 = none + anchor2 = none + font-style = "bold" + text-color = #ffffff background-color = #008000 - text-color = #FFFFFF - font-style = bold + saved-params = "is-checked" text = "Donate" command = "Donate" elem "browseb" type = BUTTON pos = 561,7 size = 60x16 + anchor1 = none + anchor2 = none is-visible = false saved-params = "is-checked" text = "Browser" @@ -1748,9 +386,13 @@ window "rpane" window "browserwindow" elem "browserwindow" type = MAIN - is-pane = true + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none saved-params = "pos;size;is-minimized;is-maximized" title = "Browser" + is-pane = true elem "browser" type = BROWSER pos = 0,0 @@ -1758,15 +400,20 @@ window "browserwindow" anchor1 = 0,0 anchor2 = 100,100 is-default = true + saved-params = "" on-show = ".winset\"rpane.infob.is-visible=true?rpane.infob.pos=130,7;rpane.textb.is-visible=true;rpane.browseb.is-visible=true;rpane.browseb.is-checked=true;rpane.rpanewindow.pos=0,30;rpane.rpanewindow.size=0x0;rpane.rpanewindow.left=browserwindow\"" on-hide = ".winset\"rpane.infob.is-visible=true?rpane.infob.is-checked=true rpane.infob.pos=65,7 rpane.rpanewindow.left=infowindow:rpane.rpanewindow.left=textwindow rpane.textb.is-visible=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0\"" window "infowindow" elem "infowindow" type = MAIN - is-pane = true + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none saved-params = "pos;size;is-minimized;is-maximized" title = "Info" + is-pane = true elem "info" type = INFO pos = 0,0 @@ -1774,9 +421,8 @@ window "infowindow" anchor1 = 0,0 anchor2 = 100,100 is-default = true + saved-params = "" highlight-color = #00aa00 - tab-text-color = #000000 - allow-html = true - multi-line = true on-show = ".winset\"rpane.infob.is-visible=true;rpane.browseb.is-visible=true?rpane.infob.pos=130,7:rpane.infob.pos=65,7 rpane.textb.is-visible=true rpane.infob.is-checked=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0 rpane.rpanewindow.left=infowindow\"" on-hide = ".winset\"rpane.infob.is-visible=false;rpane.browseb.is-visible=true?rpane.browseb.is-checked=true rpane.rpanewindow.left=browserwindow:rpane.textb.is-visible=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0 rpane.rpanewindow.left=\"" + diff --git a/nano/templates/labor_claim_console.tmpl b/nano/templates/labor_claim_console.tmpl new file mode 100644 index 00000000000..efbdb5796d6 --- /dev/null +++ b/nano/templates/labor_claim_console.tmpl @@ -0,0 +1,76 @@ + + + + +

      Ore values

      +
      + {{for data.ores}} +
      +
      + {{:value.ore}}: +
      +
      + {{:value.value}} +
      +
      + {{/for}} +
      + +

      Points

      +
      +
      +
      + ID: +
      +
      + {{:helper.link(data.id ? data.id_name : '-------------', null, { 'handle_id' : 1 })}} +
      +
      + {{if data.id}} +
      +
      + Points collected: +
      +
      + {{:data.points}} +
      +
      +
      +
      + Goal: +
      +
      + {{:data.goal}} +
      +
      +
      +
      + Unclaimed points: +
      +
      +
      {{:data.unclaimed_points}}
      + {{:helper.link('Claim points', null, { 'claim_points' : 1 }, data.unclaimed_points ? null : 'disabled')}} +
      +
      + {{/if}} +
      + +
      + {{:helper.link('Move shuttle', null, { 'move_shuttle' : 1 }, data.can_go_home ? null : 'disabled', 'link centerButton')}} +
      \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index c49361b8e20..0110aa952af 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1,2418 +1,2436 @@ -// DM Environment file for paradise.dme. -// All manual changes should be made outside the BEGIN_ and END_ blocks. - // New source code should be placed in .dm files: choose File/New --> Code File. -// BEGIN_INTERNALS -// END_INTERNALS -// BEGIN_FILE_DIR -#define FILE_DIR . -// END_FILE_DIR -// BEGIN_PREFERENCES -#define DEBUG -// END_PREFERENCES -// BEGIN_INCLUDE -#include "_maps\__MAP_DEFINES.dm" -#include "_maps\cyberiad.dm" -#include "code\_compile_options.dm" -#include "code\hub.dm" -#include "code\world.dm" -#include "code\__DEFINES\_globals.dm" -#include "code\__DEFINES\_readme.dm" -#include "code\__DEFINES\_tick.dm" -#include "code\__DEFINES\admin.dm" -#include "code\__DEFINES\antagonists.dm" -#include "code\__DEFINES\atmospherics.dm" -#include "code\__DEFINES\bots.dm" -#include "code\__DEFINES\callbacks.dm" -#include "code\__DEFINES\clothing.dm" -#include "code\__DEFINES\combat.dm" -#include "code\__DEFINES\components.dm" -#include "code\__DEFINES\construction.dm" -#include "code\__DEFINES\contracts.dm" -#include "code\__DEFINES\crafting.dm" -#include "code\__DEFINES\error_handler.dm" -#include "code\__DEFINES\flags.dm" -#include "code\__DEFINES\game.dm" -#include "code\__DEFINES\gamemode.dm" -#include "code\__DEFINES\genetics.dm" -#include "code\__DEFINES\hud.dm" -#include "code\__DEFINES\hydroponics.dm" -#include "code\__DEFINES\inventory.dm" -#include "code\__DEFINES\is_helpers.dm" -#include "code\__DEFINES\language.dm" -#include "code\__DEFINES\layers.dm" -#include "code\__DEFINES\lighting.dm" -#include "code\__DEFINES\machines.dm" -#include "code\__DEFINES\math.dm" -#include "code\__DEFINES\MC.dm" -#include "code\__DEFINES\medal.dm" -#include "code\__DEFINES\misc.dm" -#include "code\__DEFINES\mobs.dm" -#include "code\__DEFINES\move_force.dm" -#include "code\__DEFINES\pda.dm" -#include "code\__DEFINES\pipes.dm" -#include "code\__DEFINES\preferences.dm" -#include "code\__DEFINES\qdel.dm" -#include "code\__DEFINES\radio.dm" -#include "code\__DEFINES\reagents.dm" -#include "code\__DEFINES\role_preferences.dm" -#include "code\__DEFINES\rolebans.dm" -#include "code\__DEFINES\shuttle.dm" -#include "code\__DEFINES\sight.dm" -#include "code\__DEFINES\sound.dm" -#include "code\__DEFINES\stat.dm" -#include "code\__DEFINES\station_goals.dm" -#include "code\__DEFINES\status_effects.dm" -#include "code\__DEFINES\subsystems.dm" -#include "code\__DEFINES\typeids.dm" -#include "code\__DEFINES\vv.dm" -#include "code\__DEFINES\zlevel.dm" -#include "code\__HELPERS\_logging.dm" -#include "code\__HELPERS\_string_lists.dm" -#include "code\__HELPERS\AnimationLibrary.dm" -#include "code\__HELPERS\cmp.dm" -#include "code\__HELPERS\constants.dm" -#include "code\__HELPERS\experimental.dm" -#include "code\__HELPERS\files.dm" -#include "code\__HELPERS\game.dm" -#include "code\__HELPERS\global_lists.dm" -#include "code\__HELPERS\icon_smoothing.dm" -#include "code\__HELPERS\icons.dm" -#include "code\__HELPERS\lists.dm" -#include "code\__HELPERS\maths.dm" -#include "code\__HELPERS\matrices.dm" -#include "code\__HELPERS\mobs.dm" -#include "code\__HELPERS\names.dm" -#include "code\__HELPERS\pronouns.dm" -#include "code\__HELPERS\qdel.dm" -#include "code\__HELPERS\sanitize_values.dm" -#include "code\__HELPERS\text.dm" -#include "code\__HELPERS\time.dm" -#include "code\__HELPERS\type2type.dm" -#include "code\__HELPERS\unique_ids.dm" -#include "code\__HELPERS\unsorted.dm" -#include "code\__HELPERS\sorts\__main.dm" -#include "code\__HELPERS\sorts\InsertSort.dm" -#include "code\__HELPERS\sorts\MergeSort.dm" -#include "code\__HELPERS\sorts\TimSort.dm" -#include "code\_DATASTRUCTURES\heap.dm" -#include "code\_DATASTRUCTURES\stacks.dm" -#include "code\_globalvars\configuration.dm" -#include "code\_globalvars\database.dm" -#include "code\_globalvars\game_modes.dm" -#include "code\_globalvars\genetics.dm" -#include "code\_globalvars\logging.dm" -#include "code\_globalvars\mapping.dm" -#include "code\_globalvars\misc.dm" -#include "code\_globalvars\unused.dm" -#include "code\_globalvars\lists\flavor_misc.dm" -#include "code\_globalvars\lists\fortunes.dm" -#include "code\_globalvars\lists\misc.dm" -#include "code\_globalvars\lists\mobs.dm" -#include "code\_globalvars\lists\names.dm" -#include "code\_globalvars\lists\objects.dm" -#include "code\_globalvars\lists\reagents.dm" -#include "code\_globalvars\lists\typecache.dm" -#include "code\_onclick\adjacent.dm" -#include "code\_onclick\ai.dm" -#include "code\_onclick\click.dm" -#include "code\_onclick\click_override.dm" -#include "code\_onclick\cyborg.dm" -#include "code\_onclick\drag_drop.dm" -#include "code\_onclick\item_attack.dm" -#include "code\_onclick\observer.dm" -#include "code\_onclick\other_mobs.dm" -#include "code\_onclick\overmind.dm" -#include "code\_onclick\rig.dm" -#include "code\_onclick\telekinesis.dm" -#include "code\_onclick\hud\_defines.dm" -#include "code\_onclick\hud\action_button.dm" -#include "code\_onclick\hud\ai.dm" -#include "code\_onclick\hud\alert.dm" -#include "code\_onclick\hud\alien.dm" -#include "code\_onclick\hud\alien_larva.dm" -#include "code\_onclick\hud\blob_overmind.dm" -#include "code\_onclick\hud\bot.dm" -#include "code\_onclick\hud\constructs.dm" -#include "code\_onclick\hud\devil.dm" -#include "code\_onclick\hud\fullscreen.dm" -#include "code\_onclick\hud\ghost.dm" -#include "code\_onclick\hud\guardian.dm" -#include "code\_onclick\hud\hud.dm" -#include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\monkey.dm" -#include "code\_onclick\hud\movable_screen_objects.dm" -#include "code\_onclick\hud\other_mobs.dm" -#include "code\_onclick\hud\picture_in_picture.dm" -#include "code\_onclick\hud\plane_master.dm" -#include "code\_onclick\hud\radial.dm" -#include "code\_onclick\hud\robot.dm" -#include "code\_onclick\hud\screen_objects.dm" -#include "code\_onclick\hud\swarmer.dm" -#include "code\ATMOSPHERICS\atmospherics.dm" -#include "code\ATMOSPHERICS\datum_icon_manager.dm" -#include "code\ATMOSPHERICS\datum_pipeline.dm" -#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" -#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" -#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" -#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\valve.dm" -#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" -#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" -#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" -#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\tvalve.dm" -#include "code\ATMOSPHERICS\components\unary_devices\cold_sink.dm" -#include "code\ATMOSPHERICS\components\unary_devices\generator_input.dm" -#include "code\ATMOSPHERICS\components\unary_devices\heat_exchanger.dm" -#include "code\ATMOSPHERICS\components\unary_devices\heat_source.dm" -#include "code\ATMOSPHERICS\components\unary_devices\outlet_injector.dm" -#include "code\ATMOSPHERICS\components\unary_devices\oxygen_generator.dm" -#include "code\ATMOSPHERICS\components\unary_devices\passive_vent.dm" -#include "code\ATMOSPHERICS\components\unary_devices\portables_connector.dm" -#include "code\ATMOSPHERICS\components\unary_devices\tank.dm" -#include "code\ATMOSPHERICS\components\unary_devices\thermal_plate.dm" -#include "code\ATMOSPHERICS\components\unary_devices\unary_base.dm" -#include "code\ATMOSPHERICS\components\unary_devices\vent_pump.dm" -#include "code\ATMOSPHERICS\components\unary_devices\vent_scrubber.dm" -#include "code\ATMOSPHERICS\pipes\cap.dm" -#include "code\ATMOSPHERICS\pipes\manifold.dm" -#include "code\ATMOSPHERICS\pipes\manifold4w.dm" -#include "code\ATMOSPHERICS\pipes\pipe.dm" -#include "code\ATMOSPHERICS\pipes\simple\pipe_simple.dm" -#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_he.dm" -#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_hidden.dm" -#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_insulated.dm" -#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_visible.dm" -#include "code\controllers\configuration.dm" -#include "code\controllers\controller.dm" -#include "code\controllers\failsafe.dm" -#include "code\controllers\globals.dm" -#include "code\controllers\hooks-defs.dm" -#include "code\controllers\hooks.dm" -#include "code\controllers\master.dm" -#include "code\controllers\subsystem.dm" -#include "code\controllers\verbs.dm" -#include "code\controllers\subsystem\air.dm" -#include "code\controllers\subsystem\alarm.dm" -#include "code\controllers\subsystem\assets.dm" -#include "code\controllers\subsystem\atoms.dm" -#include "code\controllers\subsystem\events.dm" -#include "code\controllers\subsystem\fires.dm" -#include "code\controllers\subsystem\garbage.dm" -#include "code\controllers\subsystem\holiday.dm" -#include "code\controllers\subsystem\icon_smooth.dm" -#include "code\controllers\subsystem\idlenpcpool.dm" -#include "code\controllers\subsystem\ipintel.dm" -#include "code\controllers\subsystem\jobs.dm" -#include "code\controllers\subsystem\lighting.dm" -#include "code\controllers\subsystem\machinery.dm" -#include "code\controllers\subsystem\mapping.dm" -#include "code\controllers\subsystem\medals.dm" -#include "code\controllers\subsystem\mobs.dm" -#include "code\controllers\subsystem\nano_mob_hunter.dm" -#include "code\controllers\subsystem\nanoui.dm" -#include "code\controllers\subsystem\nightshift.dm" -#include "code\controllers\subsystem\npcpool.dm" -#include "code\controllers\subsystem\overlays.dm" -#include "code\controllers\subsystem\radio.dm" -#include "code\controllers\subsystem\shuttles.dm" -#include "code\controllers\subsystem\spacedrift.dm" -#include "code\controllers\subsystem\sun.dm" -#include "code\controllers\subsystem\throwing.dm" -#include "code\controllers\subsystem\ticker.dm" -#include "code\controllers\subsystem\timer.dm" -#include "code\controllers\subsystem\vote.dm" -#include "code\controllers\subsystem\weather.dm" -#include "code\controllers\subsystem\processing\fastprocess.dm" -#include "code\controllers\subsystem\processing\obj.dm" -#include "code\controllers\subsystem\processing\processing.dm" -#include "code\controllers\subsystem\tickets\mentor_tickets.dm" -#include "code\controllers\subsystem\tickets\tickets.dm" -#include "code\datums\action.dm" -#include "code\datums\ai_law_sets.dm" -#include "code\datums\ai_laws.dm" -#include "code\datums\beam.dm" -#include "code\datums\browser.dm" -#include "code\datums\callback.dm" -#include "code\datums\click_intercept.dm" -#include "code\datums\datacore.dm" -#include "code\datums\datum.dm" -#include "code\datums\datumvars.dm" -#include "code\datums\gas_mixture.dm" -#include "code\datums\holocall.dm" -#include "code\datums\hud.dm" -#include "code\datums\mind.dm" -#include "code\datums\mixed.dm" -#include "code\datums\mutable_appearance.dm" -#include "code\datums\periodic_news.dm" -#include "code\datums\pipe_datums.dm" -#include "code\datums\progressbar.dm" -#include "code\datums\radio.dm" -#include "code\datums\recipe.dm" -#include "code\datums\ruins.dm" -#include "code\datums\shuttles.dm" -#include "code\datums\soullink.dm" -#include "code\datums\spawners_menu.dm" -#include "code\datums\spell.dm" -#include "code\datums\statclick.dm" -#include "code\datums\supplypacks.dm" -#include "code\datums\uplink_item.dm" -#include "code\datums\vision_override.dm" -#include "code\datums\vr.dm" -#include "code\datums\cache\air_alarm.dm" -#include "code\datums\cache\apc.dm" -#include "code\datums\cache\cache.dm" -#include "code\datums\cache\crew.dm" -#include "code\datums\cache\powermonitor.dm" -#include "code\datums\components\_component.dm" -#include "code\datums\components\decal.dm" -#include "code\datums\components\ducttape.dm" -#include "code\datums\components\jestosterone.dm" -#include "code\datums\components\material_container.dm" -#include "code\datums\components\squeak.dm" -#include "code\datums\diseases\_disease.dm" -#include "code\datums\diseases\_MobProcs.dm" -#include "code\datums\diseases\anxiety.dm" -#include "code\datums\diseases\appendicitis.dm" -#include "code\datums\diseases\beesease.dm" -#include "code\datums\diseases\berserker.dm" -#include "code\datums\diseases\brainrot.dm" -#include "code\datums\diseases\cold.dm" -#include "code\datums\diseases\cold9.dm" -#include "code\datums\diseases\critical.dm" -#include "code\datums\diseases\fake_gbs.dm" -#include "code\datums\diseases\flu.dm" -#include "code\datums\diseases\fluspanish.dm" -#include "code\datums\diseases\food_poisoning.dm" -#include "code\datums\diseases\gbs.dm" -#include "code\datums\diseases\kingstons.dm" -#include "code\datums\diseases\kuru.dm" -#include "code\datums\diseases\lycancoughy.dm" -#include "code\datums\diseases\magnitis.dm" -#include "code\datums\diseases\pierrot_throat.dm" -#include "code\datums\diseases\retrovirus.dm" -#include "code\datums\diseases\rhumba_beat.dm" -#include "code\datums\diseases\transformation.dm" -#include "code\datums\diseases\tuberculosis.dm" -#include "code\datums\diseases\vampire.dm" -#include "code\datums\diseases\wizarditis.dm" -#include "code\datums\diseases\advance\advance.dm" -#include "code\datums\diseases\advance\presets.dm" -#include "code\datums\diseases\advance\symptoms\beard.dm" -#include "code\datums\diseases\advance\symptoms\choking.dm" -#include "code\datums\diseases\advance\symptoms\confusion.dm" -#include "code\datums\diseases\advance\symptoms\cough.dm" -#include "code\datums\diseases\advance\symptoms\damage_converter.dm" -#include "code\datums\diseases\advance\symptoms\deafness.dm" -#include "code\datums\diseases\advance\symptoms\dizzy.dm" -#include "code\datums\diseases\advance\symptoms\fever.dm" -#include "code\datums\diseases\advance\symptoms\fire.dm" -#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" -#include "code\datums\diseases\advance\symptoms\hallucigen.dm" -#include "code\datums\diseases\advance\symptoms\headache.dm" -#include "code\datums\diseases\advance\symptoms\heal.dm" -#include "code\datums\diseases\advance\symptoms\itching.dm" -#include "code\datums\diseases\advance\symptoms\oxygen.dm" -#include "code\datums\diseases\advance\symptoms\sensory.dm" -#include "code\datums\diseases\advance\symptoms\shedding.dm" -#include "code\datums\diseases\advance\symptoms\shivering.dm" -#include "code\datums\diseases\advance\symptoms\skin.dm" -#include "code\datums\diseases\advance\symptoms\sneeze.dm" -#include "code\datums\diseases\advance\symptoms\symptoms.dm" -#include "code\datums\diseases\advance\symptoms\viral.dm" -#include "code\datums\diseases\advance\symptoms\vision.dm" -#include "code\datums\diseases\advance\symptoms\voice_change.dm" -#include "code\datums\diseases\advance\symptoms\vomit.dm" -#include "code\datums\diseases\advance\symptoms\weakness.dm" -#include "code\datums\diseases\advance\symptoms\weight.dm" -#include "code\datums\diseases\advance\symptoms\youth.dm" -#include "code\datums\helper_datums\construction_datum.dm" -#include "code\datums\helper_datums\events.dm" -#include "code\datums\helper_datums\global_iterator.dm" -#include "code\datums\helper_datums\hotkey_modes.dm" -#include "code\datums\helper_datums\icon_snapshot.dm" -#include "code\datums\helper_datums\input.dm" -#include "code\datums\helper_datums\map_template.dm" -#include "code\datums\helper_datums\teleport.dm" -#include "code\datums\helper_datums\topic_input.dm" -#include "code\datums\looping_sounds\looping_sound.dm" -#include "code\datums\looping_sounds\machinery_sounds.dm" -#include "code\datums\looping_sounds\thermal_drill.dm" -#include "code\datums\looping_sounds\weather.dm" -#include "code\datums\outfits\outfit.dm" -#include "code\datums\outfits\outfit_admin.dm" -#include "code\datums\ruins\lavaland.dm" -#include "code\datums\ruins\space.dm" -#include "code\datums\spells\area_teleport.dm" -#include "code\datums\spells\bloodcrawl.dm" -#include "code\datums\spells\chaplain.dm" -#include "code\datums\spells\charge.dm" -#include "code\datums\spells\cluwne.dm" -#include "code\datums\spells\conjure.dm" -#include "code\datums\spells\conjure_item.dm" -#include "code\datums\spells\construct_spells.dm" -#include "code\datums\spells\devil.dm" -#include "code\datums\spells\devil_boons.dm" -#include "code\datums\spells\dumbfire.dm" -#include "code\datums\spells\emplosion.dm" -#include "code\datums\spells\ethereal_jaunt.dm" -#include "code\datums\spells\explosion.dm" -#include "code\datums\spells\fake_gib.dm" -#include "code\datums\spells\genetic.dm" -#include "code\datums\spells\horsemask.dm" -#include "code\datums\spells\infinite_guns.dm" -#include "code\datums\spells\inflict_handler.dm" -#include "code\datums\spells\knock.dm" -#include "code\datums\spells\lichdom.dm" -#include "code\datums\spells\lightning.dm" -#include "code\datums\spells\magnet.dm" -#include "code\datums\spells\mime.dm" -#include "code\datums\spells\mind_transfer.dm" -#include "code\datums\spells\projectile.dm" -#include "code\datums\spells\rathens.dm" -#include "code\datums\spells\rod_form.dm" -#include "code\datums\spells\shapeshift.dm" -#include "code\datums\spells\summonitem.dm" -#include "code\datums\spells\touch_attacks.dm" -#include "code\datums\spells\trigger.dm" -#include "code\datums\spells\turf_teleport.dm" -#include "code\datums\spells\wizard.dm" -#include "code\datums\status_effects\buffs.dm" -#include "code\datums\status_effects\debuffs.dm" -#include "code\datums\status_effects\neutral.dm" -#include "code\datums\status_effects\status_effect.dm" -#include "code\datums\vr\level.dm" -#include "code\datums\weather\weather.dm" -#include "code\datums\weather\weather_types\ash_storm.dm" -#include "code\datums\weather\weather_types\floor_is_lava.dm" -#include "code\datums\weather\weather_types\radiation_storm.dm" -#include "code\datums\weather\weather_types\snow_storm.dm" -#include "code\datums\wires\airlock.dm" -#include "code\datums\wires\alarm.dm" -#include "code\datums\wires\apc.dm" -#include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\camera.dm" -#include "code\datums\wires\explosive.dm" -#include "code\datums\wires\mulebot.dm" -#include "code\datums\wires\nuclearbomb.dm" -#include "code\datums\wires\particle_accelerator.dm" -#include "code\datums\wires\radio.dm" -#include "code\datums\wires\robot.dm" -#include "code\datums\wires\smartfridge.dm" -#include "code\datums\wires\suitstorage.dm" -#include "code\datums\wires\syndicatebomb.dm" -#include "code\datums\wires\tesla_coil.dm" -#include "code\datums\wires\vending.dm" -#include "code\datums\wires\wires.dm" -#include "code\defines\vox_sounds.dm" -#include "code\defines\procs\admin.dm" -#include "code\defines\procs\announce.dm" -#include "code\defines\procs\AStar.dm" -#include "code\defines\procs\dbcore.dm" -#include "code\defines\procs\radio.dm" -#include "code\defines\procs\records.dm" -#include "code\defines\procs\statistics.dm" -#include "code\game\alternate_appearance.dm" -#include "code\game\asteroid.dm" -#include "code\game\atoms.dm" -#include "code\game\atoms_movable.dm" -#include "code\game\data_huds.dm" -#include "code\game\shuttle_engines.dm" -#include "code\game\sound.dm" -#include "code\game\world.dm" -#include "code\game\area\ai_monitored.dm" -#include "code\game\area\areas.dm" -#include "code\game\area\Dynamic areas.dm" -#include "code\game\area\Space Station 13 areas.dm" -#include "code\game\area\areas\depot-areas.dm" -#include "code\game\area\areas\mining.dm" -#include "code\game\area\areas\ruins\lavaland.dm" -#include "code\game\dna\dna2.dm" -#include "code\game\dna\dna2_domutcheck.dm" -#include "code\game\dna\dna2_helpers.dm" -#include "code\game\dna\dna_modifier.dm" -#include "code\game\dna\genes\disabilities.dm" -#include "code\game\dna\genes\gene.dm" -#include "code\game\dna\genes\goon_disabilities.dm" -#include "code\game\dna\genes\goon_powers.dm" -#include "code\game\dna\genes\monkey.dm" -#include "code\game\dna\genes\powers.dm" -#include "code\game\dna\genes\vg_disabilities.dm" -#include "code\game\dna\genes\vg_powers.dm" -#include "code\game\gamemodes\factions.dm" -#include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\intercept_report.dm" -#include "code\game\gamemodes\objective.dm" -#include "code\game\gamemodes\scoreboard.dm" -#include "code\game\gamemodes\setupgame.dm" -#include "code\game\gamemodes\steal_items.dm" -#include "code\game\gamemodes\autotraitor\autotraitor.dm" -#include "code\game\gamemodes\blob\blob.dm" -#include "code\game\gamemodes\blob\blob_finish.dm" -#include "code\game\gamemodes\blob\blob_report.dm" -#include "code\game\gamemodes\blob\overmind.dm" -#include "code\game\gamemodes\blob\powers.dm" -#include "code\game\gamemodes\blob\theblob.dm" -#include "code\game\gamemodes\blob\blobs\blob_mobs.dm" -#include "code\game\gamemodes\blob\blobs\core.dm" -#include "code\game\gamemodes\blob\blobs\factory.dm" -#include "code\game\gamemodes\blob\blobs\node.dm" -#include "code\game\gamemodes\blob\blobs\resource.dm" -#include "code\game\gamemodes\blob\blobs\shield.dm" -#include "code\game\gamemodes\blob\blobs\storage.dm" -#include "code\game\gamemodes\changeling\changeling.dm" -#include "code\game\gamemodes\changeling\changeling_power.dm" -#include "code\game\gamemodes\changeling\evolution_menu.dm" -#include "code\game\gamemodes\changeling\traitor_chan.dm" -#include "code\game\gamemodes\changeling\powers\absorb.dm" -#include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" -#include "code\game\gamemodes\changeling\powers\biodegrade.dm" -#include "code\game\gamemodes\changeling\powers\chameleon_skin.dm" -#include "code\game\gamemodes\changeling\powers\digitalcamo.dm" -#include "code\game\gamemodes\changeling\powers\epinephrine.dm" -#include "code\game\gamemodes\changeling\powers\fakedeath.dm" -#include "code\game\gamemodes\changeling\powers\fleshmend.dm" -#include "code\game\gamemodes\changeling\powers\headcrab.dm" -#include "code\game\gamemodes\changeling\powers\hivemind.dm" -#include "code\game\gamemodes\changeling\powers\humanform.dm" -#include "code\game\gamemodes\changeling\powers\lesserform.dm" -#include "code\game\gamemodes\changeling\powers\linglink.dm" -#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" -#include "code\game\gamemodes\changeling\powers\mutations.dm" -#include "code\game\gamemodes\changeling\powers\panacea.dm" -#include "code\game\gamemodes\changeling\powers\revive.dm" -#include "code\game\gamemodes\changeling\powers\shriek.dm" -#include "code\game\gamemodes\changeling\powers\spiders.dm" -#include "code\game\gamemodes\changeling\powers\strained_muscles.dm" -#include "code\game\gamemodes\changeling\powers\swap_form.dm" -#include "code\game\gamemodes\changeling\powers\tiny_prick.dm" -#include "code\game\gamemodes\changeling\powers\transform.dm" -#include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\cult\cult_comms.dm" -#include "code\game\gamemodes\cult\cult_datums.dm" -#include "code\game\gamemodes\cult\cult_items.dm" -#include "code\game\gamemodes\cult\cult_objectives.dm" -#include "code\game\gamemodes\cult\cult_structures.dm" -#include "code\game\gamemodes\cult\ritual.dm" -#include "code\game\gamemodes\cult\runes.dm" -#include "code\game\gamemodes\cult\talisman.dm" -#include "code\game\gamemodes\devil\devil.dm" -#include "code\game\gamemodes\devil\devil_game_mode.dm" -#include "code\game\gamemodes\devil\devilinfo.dm" -#include "code\game\gamemodes\devil\game_mode.dm" -#include "code\game\gamemodes\devil\objectives.dm" -#include "code\game\gamemodes\devil\contracts\friend.dm" -#include "code\game\gamemodes\devil\devil agent\devil_agent.dm" -#include "code\game\gamemodes\devil\imp\imp.dm" -#include "code\game\gamemodes\devil\true_devil\_true_devil.dm" -#include "code\game\gamemodes\devil\true_devil\inventory.dm" -#include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\heist\heist.dm" -#include "code\game\gamemodes\malfunction\Malf_Modules.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\miniantags\abduction\abductee_objectives.dm" -#include "code\game\gamemodes\miniantags\abduction\abduction.dm" -#include "code\game\gamemodes\miniantags\abduction\abduction_gear.dm" -#include "code\game\gamemodes\miniantags\abduction\abduction_outfits.dm" -#include "code\game\gamemodes\miniantags\abduction\abduction_surgery.dm" -#include "code\game\gamemodes\miniantags\abduction\gland.dm" -#include "code\game\gamemodes\miniantags\abduction\machinery\camera.dm" -#include "code\game\gamemodes\miniantags\abduction\machinery\console.dm" -#include "code\game\gamemodes\miniantags\abduction\machinery\dispenser.dm" -#include "code\game\gamemodes\miniantags\abduction\machinery\experiment.dm" -#include "code\game\gamemodes\miniantags\abduction\machinery\pad.dm" -#include "code\game\gamemodes\miniantags\borer\borer.dm" -#include "code\game\gamemodes\miniantags\borer\borer_chemicals.dm" -#include "code\game\gamemodes\miniantags\borer\borer_event.dm" -#include "code\game\gamemodes\miniantags\borer\borer_html.dm" -#include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm" -#include "code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" -#include "code\game\gamemodes\miniantags\guardian\guardian.dm" -#include "code\game\gamemodes\miniantags\guardian\types\assassin.dm" -#include "code\game\gamemodes\miniantags\guardian\types\bomb.dm" -#include "code\game\gamemodes\miniantags\guardian\types\charger.dm" -#include "code\game\gamemodes\miniantags\guardian\types\fire.dm" -#include "code\game\gamemodes\miniantags\guardian\types\healer.dm" -#include "code\game\gamemodes\miniantags\guardian\types\lightning.dm" -#include "code\game\gamemodes\miniantags\guardian\types\protector.dm" -#include "code\game\gamemodes\miniantags\guardian\types\ranged.dm" -#include "code\game\gamemodes\miniantags\guardian\types\standard.dm" -#include "code\game\gamemodes\miniantags\morph\morph.dm" -#include "code\game\gamemodes\miniantags\morph\morph_event.dm" -#include "code\game\gamemodes\miniantags\revenant\revenant.dm" -#include "code\game\gamemodes\miniantags\revenant\revenant_abilities.dm" -#include "code\game\gamemodes\miniantags\revenant\revenant_spawn_event.dm" -#include "code\game\gamemodes\miniantags\sintouched\objectives.dm" -#include "code\game\gamemodes\miniantags\slaughter\bloodcrawl.dm" -#include "code\game\gamemodes\miniantags\slaughter\slaughter.dm" -#include "code\game\gamemodes\nuclear\nuclear.dm" -#include "code\game\gamemodes\nuclear\nuclear_challenge.dm" -#include "code\game\gamemodes\nuclear\nuclearbomb.dm" -#include "code\game\gamemodes\nuclear\pinpointer.dm" -#include "code\game\gamemodes\revolution\revolution.dm" -#include "code\game\gamemodes\shadowling\ascendant_shadowling.dm" -#include "code\game\gamemodes\shadowling\shadowling.dm" -#include "code\game\gamemodes\shadowling\shadowling_abilities.dm" -#include "code\game\gamemodes\shadowling\shadowling_items.dm" -#include "code\game\gamemodes\shadowling\special_shadowling_abilities.dm" -#include "code\game\gamemodes\traitor\traitor.dm" -#include "code\game\gamemodes\vampire\traitor_vamp.dm" -#include "code\game\gamemodes\vampire\vampire.dm" -#include "code\game\gamemodes\vampire\vampire_powers.dm" -#include "code\game\gamemodes\wizard\artefact.dm" -#include "code\game\gamemodes\wizard\godhand.dm" -#include "code\game\gamemodes\wizard\raginmages.dm" -#include "code\game\gamemodes\wizard\rightandwrong.dm" -#include "code\game\gamemodes\wizard\soulstone.dm" -#include "code\game\gamemodes\wizard\spellbook.dm" -#include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\jobs\access.dm" -#include "code\game\jobs\job_exp.dm" -#include "code\game\jobs\job_objective.dm" -#include "code\game\jobs\job_scaling.dm" -#include "code\game\jobs\jobs.dm" -#include "code\game\jobs\whitelist.dm" -#include "code\game\jobs\job\central.dm" -#include "code\game\jobs\job\civilian.dm" -#include "code\game\jobs\job\engineering.dm" -#include "code\game\jobs\job\job.dm" -#include "code\game\jobs\job\medical.dm" -#include "code\game\jobs\job\science.dm" -#include "code\game\jobs\job\security.dm" -#include "code\game\jobs\job\silicon.dm" -#include "code\game\jobs\job\supervisor.dm" -#include "code\game\jobs\job\support.dm" -#include "code\game\jobs\job\support_chaplain.dm" -#include "code\game\jobs\job\syndicate.dm" -#include "code\game\jobs\job_objectives\science.dm" -#include "code\game\machinery\adv_med.dm" -#include "code\game\machinery\ai_slipper.dm" -#include "code\game\machinery\alarm.dm" -#include "code\game\machinery\atmo_control.dm" -#include "code\game\machinery\autolathe.dm" -#include "code\game\machinery\Beacon.dm" -#include "code\game\machinery\buttons.dm" -#include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\chiller.dm" -#include "code\game\machinery\cloning.dm" -#include "code\game\machinery\constructable_frame.dm" -#include "code\game\machinery\cryo.dm" -#include "code\game\machinery\cryopod.dm" -#include "code\game\machinery\dance_machine.dm" -#include "code\game\machinery\defib_mount.dm" -#include "code\game\machinery\deployable.dm" -#include "code\game\machinery\door_control.dm" -#include "code\game\machinery\doppler_array.dm" -#include "code\game\machinery\dye_generator.dm" -#include "code\game\machinery\firealarm.dm" -#include "code\game\machinery\flasher.dm" -#include "code\game\machinery\floodlight.dm" -#include "code\game\machinery\Freezer.dm" -#include "code\game\machinery\gameboard.dm" -#include "code\game\machinery\guestpass.dm" -#include "code\game\machinery\hologram.dm" -#include "code\game\machinery\holosign.dm" -#include "code\game\machinery\igniter.dm" -#include "code\game\machinery\iv_drip.dm" -#include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\machinery.dm" -#include "code\game\machinery\magnet.dm" -#include "code\game\machinery\mass_driver.dm" -#include "code\game\machinery\navbeacon.dm" -#include "code\game\machinery\newscaster.dm" -#include "code\game\machinery\OpTable.dm" -#include "code\game\machinery\overview.dm" -#include "code\game\machinery\PDApainter.dm" -#include "code\game\machinery\poolcontroller.dm" -#include "code\game\machinery\portable_tag_turret.dm" -#include "code\game\machinery\portable_turret.dm" -#include "code\game\machinery\quantum_pad.dm" -#include "code\game\machinery\recharger.dm" -#include "code\game\machinery\rechargestation.dm" -#include "code\game\machinery\recycler.dm" -#include "code\game\machinery\requests_console.dm" -#include "code\game\machinery\shieldgen.dm" -#include "code\game\machinery\Sleeper.dm" -#include "code\game\machinery\slotmachine.dm" -#include "code\game\machinery\snow_machine.dm" -#include "code\game\machinery\spaceheater.dm" -#include "code\game\machinery\status_display.dm" -#include "code\game\machinery\suit_storage_unit.dm" -#include "code\game\machinery\supply_display.dm" -#include "code\game\machinery\syndicatebeacon.dm" -#include "code\game\machinery\syndicatebomb.dm" -#include "code\game\machinery\teleporter.dm" -#include "code\game\machinery\transformer.dm" -#include "code\game\machinery\turntable.dm" -#include "code\game\machinery\turret_control.dm" -#include "code\game\machinery\vending.dm" -#include "code\game\machinery\washing_machine.dm" -#include "code\game\machinery\wishgranter.dm" -#include "code\game\machinery\atmoalter\area_atmos_computer.dm" -#include "code\game\machinery\atmoalter\canister.dm" -#include "code\game\machinery\atmoalter\meter.dm" -#include "code\game\machinery\atmoalter\portable_atmospherics.dm" -#include "code\game\machinery\atmoalter\pump.dm" -#include "code\game\machinery\atmoalter\scrubber.dm" -#include "code\game\machinery\atmoalter\zvent.dm" -#include "code\game\machinery\camera\camera.dm" -#include "code\game\machinery\camera\camera_assembly.dm" -#include "code\game\machinery\camera\motion.dm" -#include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" -#include "code\game\machinery\computer\ai_core.dm" -#include "code\game\machinery\computer\aifixer.dm" -#include "code\game\machinery\computer\arcade.dm" -#include "code\game\machinery\computer\atmos_alert.dm" -#include "code\game\machinery\computer\atmos_control.dm" -#include "code\game\machinery\computer\brigcells.dm" -#include "code\game\machinery\computer\buildandrepair.dm" -#include "code\game\machinery\computer\camera.dm" -#include "code\game\machinery\computer\camera_advanced.dm" -#include "code\game\machinery\computer\card.dm" -#include "code\game\machinery\computer\cloning.dm" -#include "code\game\machinery\computer\communications.dm" -#include "code\game\machinery\computer\computer.dm" -#include "code\game\machinery\computer\crew.dm" -#include "code\game\machinery\computer\depot.dm" -#include "code\game\machinery\computer\HolodeckControl.dm" -#include "code\game\machinery\computer\honkputer.dm" -#include "code\game\machinery\computer\law.dm" -#include "code\game\machinery\computer\medical.dm" -#include "code\game\machinery\computer\message.dm" -#include "code\game\machinery\computer\Operating.dm" -#include "code\game\machinery\computer\pod.dm" -#include "code\game\machinery\computer\pod_tracking_console.dm" -#include "code\game\machinery\computer\power.dm" -#include "code\game\machinery\computer\prisoner.dm" -#include "code\game\machinery\computer\robot.dm" -#include "code\game\machinery\computer\salvage_ship.dm" -#include "code\game\machinery\computer\security.dm" -#include "code\game\machinery\computer\skills.dm" -#include "code\game\machinery\computer\specops_shuttle.dm" -#include "code\game\machinery\computer\station_alert.dm" -#include "code\game\machinery\computer\store.dm" -#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" -#include "code\game\machinery\computer\vr_control.dm" -#include "code\game\machinery\doors\airlock.dm" -#include "code\game\machinery\doors\airlock_control.dm" -#include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\airlock_types.dm" -#include "code\game\machinery\doors\alarmlock.dm" -#include "code\game\machinery\doors\brigdoors.dm" -#include "code\game\machinery\doors\checkForMultipleDoors.dm" -#include "code\game\machinery\doors\door.dm" -#include "code\game\machinery\doors\firedoor.dm" -#include "code\game\machinery\doors\poddoor.dm" -#include "code\game\machinery\doors\shutters.dm" -#include "code\game\machinery\doors\spacepod.dm" -#include "code\game\machinery\doors\unpowered.dm" -#include "code\game\machinery\doors\windowdoor.dm" -#include "code\game\machinery\embedded_controller\airlock_controllers.dm" -#include "code\game\machinery\embedded_controller\airlock_program.dm" -#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" -#include "code\game\machinery\embedded_controller\embedded_program_base.dm" -#include "code\game\machinery\pipe\construction.dm" -#include "code\game\machinery\pipe\pipe_dispenser.dm" -#include "code\game\machinery\telecomms\broadcaster.dm" -#include "code\game\machinery\telecomms\logbrowser.dm" -#include "code\game\machinery\telecomms\machine_interactions.dm" -#include "code\game\machinery\telecomms\ntsl2.dm" -#include "code\game\machinery\telecomms\presets.dm" -#include "code\game\machinery\telecomms\telecomunications.dm" -#include "code\game\machinery\telecomms\telemonitor.dm" -#include "code\game\machinery\telecomms\traffic_control.dm" -#include "code\game\magic\Uristrunes.dm" -#include "code\game\mecha\mech_bay.dm" -#include "code\game\mecha\mech_fabricator.dm" -#include "code\game\mecha\mecha.dm" -#include "code\game\mecha\mecha_actions.dm" -#include "code\game\mecha\mecha_construction_paths.dm" -#include "code\game\mecha\mecha_control_console.dm" -#include "code\game\mecha\mecha_modkit.dm" -#include "code\game\mecha\mecha_parts.dm" -#include "code\game\mecha\mecha_topic.dm" -#include "code\game\mecha\mecha_wreckage.dm" -#include "code\game\mecha\paintkits.dm" -#include "code\game\mecha\combat\combat.dm" -#include "code\game\mecha\combat\durand.dm" -#include "code\game\mecha\combat\gygax.dm" -#include "code\game\mecha\combat\honker.dm" -#include "code\game\mecha\combat\marauder.dm" -#include "code\game\mecha\combat\phazon.dm" -#include "code\game\mecha\combat\reticence.dm" -#include "code\game\mecha\equipment\mecha_equipment.dm" -#include "code\game\mecha\equipment\tools\medical_tools.dm" -#include "code\game\mecha\equipment\tools\mining_tools.dm" -#include "code\game\mecha\equipment\tools\other_tools.dm" -#include "code\game\mecha\equipment\tools\work_tools.dm" -#include "code\game\mecha\equipment\weapons\weapons.dm" -#include "code\game\mecha\medical\medical.dm" -#include "code\game\mecha\medical\odysseus.dm" -#include "code\game\mecha\working\ripley.dm" -#include "code\game\mecha\working\working.dm" -#include "code\game\objects\buckling.dm" -#include "code\game\objects\empulse.dm" -#include "code\game\objects\explosion.dm" -#include "code\game\objects\items.dm" -#include "code\game\objects\obj_defense.dm" -#include "code\game\objects\objs.dm" -#include "code\game\objects\structures.dm" -#include "code\game\objects\effects\alien_acid.dm" -#include "code\game\objects\effects\anomalies.dm" -#include "code\game\objects\effects\bump_teleporter.dm" -#include "code\game\objects\effects\effects.dm" -#include "code\game\objects\effects\forcefields.dm" -#include "code\game\objects\effects\gibs.dm" -#include "code\game\objects\effects\glowshroom.dm" -#include "code\game\objects\effects\landmarks.dm" -#include "code\game\objects\effects\manifest.dm" -#include "code\game\objects\effects\mapping_helpers.dm" -#include "code\game\objects\effects\mines.dm" -#include "code\game\objects\effects\misc.dm" -#include "code\game\objects\effects\overlays.dm" -#include "code\game\objects\effects\portals.dm" -#include "code\game\objects\effects\snowcloud.dm" -#include "code\game\objects\effects\spiders.dm" -#include "code\game\objects\effects\step_triggers.dm" -#include "code\game\objects\effects\decals\cleanable.dm" -#include "code\game\objects\effects\decals\contraband.dm" -#include "code\game\objects\effects\decals\crayon.dm" -#include "code\game\objects\effects\decals\decal.dm" -#include "code\game\objects\effects\decals\misc.dm" -#include "code\game\objects\effects\decals\remains.dm" -#include "code\game\objects\effects\decals\warning_stripes.dm" -#include "code\game\objects\effects\decals\Cleanable\aliens.dm" -#include "code\game\objects\effects\decals\Cleanable\fuel.dm" -#include "code\game\objects\effects\decals\Cleanable\humans.dm" -#include "code\game\objects\effects\decals\Cleanable\misc.dm" -#include "code\game\objects\effects\decals\Cleanable\robots.dm" -#include "code\game\objects\effects\decals\Cleanable\tracks.dm" -#include "code\game\objects\effects\decals\turfdecals\dirt.dm" -#include "code\game\objects\effects\decals\turfdecals\markings.dm" -#include "code\game\objects\effects\decals\turfdecals\tilecoloring.dm" -#include "code\game\objects\effects\decals\turfdecals\weather.dm" -#include "code\game\objects\effects\effect_system\effect_system.dm" -#include "code\game\objects\effects\effect_system\effects_chem_smoke.dm" -#include "code\game\objects\effects\effect_system\effects_explosion.dm" -#include "code\game\objects\effects\effect_system\effects_foam.dm" -#include "code\game\objects\effects\effect_system\effects_other.dm" -#include "code\game\objects\effects\effect_system\effects_smoke.dm" -#include "code\game\objects\effects\effect_system\effects_sparks.dm" -#include "code\game\objects\effects\effect_system\effects_water.dm" -#include "code\game\objects\effects\spawners\bombspawner.dm" -#include "code\game\objects\effects\spawners\gibspawner.dm" -#include "code\game\objects\effects\spawners\lootdrop.dm" -#include "code\game\objects\effects\spawners\random_barrier.dm" -#include "code\game\objects\effects\spawners\random_spawners.dm" -#include "code\game\objects\effects\spawners\vaultspawner.dm" -#include "code\game\objects\effects\spawners\windowspawner.dm" -#include "code\game\objects\effects\temporary_visuals\clockcult.dm" -#include "code\game\objects\effects\temporary_visuals\cult.dm" -#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" -#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" -#include "code\game\objects\items\ashtray.dm" -#include "code\game\objects\items\blueprints.dm" -#include "code\game\objects\items\bodybag.dm" -#include "code\game\objects\items\candle.dm" -#include "code\game\objects\items\cardboard_cutouts.dm" -#include "code\game\objects\items\changestone.dm" -#include "code\game\objects\items\contraband.dm" -#include "code\game\objects\items\control_wand.dm" -#include "code\game\objects\items\crayons.dm" -#include "code\game\objects\items\dehy_carp.dm" -#include "code\game\objects\items\documents.dm" -#include "code\game\objects\items\flag.dm" -#include "code\game\objects\items\latexballoon.dm" -#include "code\game\objects\items\misc.dm" -#include "code\game\objects\items\mixing_bowl.dm" -#include "code\game\objects\items\random_items.dm" -#include "code\game\objects\items\shooting_range.dm" -#include "code\game\objects\items\toys.dm" -#include "code\game\objects\items\trash.dm" -#include "code\game\objects\items\devices\aicard.dm" -#include "code\game\objects\items\devices\autopsy.dm" -#include "code\game\objects\items\devices\camera_bug.dm" -#include "code\game\objects\items\devices\chameleonproj.dm" -#include "code\game\objects\items\devices\flash.dm" -#include "code\game\objects\items\devices\flashlight.dm" -#include "code\game\objects\items\devices\floor_painter.dm" -#include "code\game\objects\items\devices\handheld_defib.dm" -#include "code\game\objects\items\devices\instruments.dm" -#include "code\game\objects\items\devices\laserpointer.dm" -#include "code\game\objects\items\devices\lightreplacer.dm" -#include "code\game\objects\items\devices\machineprototype.dm" -#include "code\game\objects\items\devices\megaphone.dm" -#include "code\game\objects\items\devices\multitool.dm" -#include "code\game\objects\items\devices\paicard.dm" -#include "code\game\objects\items\devices\pipe_painter.dm" -#include "code\game\objects\items\devices\pizza_bomb.dm" -#include "code\game\objects\items\devices\powersink.dm" -#include "code\game\objects\items\devices\scanners.dm" -#include "code\game\objects\items\devices\sensor_device.dm" -#include "code\game\objects\items\devices\taperecorder.dm" -#include "code\game\objects\items\devices\thermal_drill.dm" -#include "code\game\objects\items\devices\traitordevices.dm" -#include "code\game\objects\items\devices\transfer_valve.dm" -#include "code\game\objects\items\devices\uplinks.dm" -#include "code\game\objects\items\devices\voice.dm" -#include "code\game\objects\items\devices\whistle.dm" -#include "code\game\objects\items\devices\radio\beacon.dm" -#include "code\game\objects\items\devices\radio\electropack.dm" -#include "code\game\objects\items\devices\radio\encryptionkey.dm" -#include "code\game\objects\items\devices\radio\headset.dm" -#include "code\game\objects\items\devices\radio\intercom.dm" -#include "code\game\objects\items\devices\radio\radio.dm" -#include "code\game\objects\items\mountable_frames\air_alarm.dm" -#include "code\game\objects\items\mountable_frames\apc_frame.dm" -#include "code\game\objects\items\mountable_frames\buttons_switches.dm" -#include "code\game\objects\items\mountable_frames\extinguisher_frame.dm" -#include "code\game\objects\items\mountable_frames\fire_alarm.dm" -#include "code\game\objects\items\mountable_frames\frames.dm" -#include "code\game\objects\items\mountable_frames\intercom.dm" -#include "code\game\objects\items\mountable_frames\lights.dm" -#include "code\game\objects\items\mountable_frames\mountables.dm" -#include "code\game\objects\items\mountable_frames\newscaster_frame.dm" -#include "code\game\objects\items\robot\ai_upgrades.dm" -#include "code\game\objects\items\robot\robot_items.dm" -#include "code\game\objects\items\robot\robot_parts.dm" -#include "code\game\objects\items\robot\robot_upgrades.dm" -#include "code\game\objects\items\stacks\medical.dm" -#include "code\game\objects\items\stacks\nanopaste.dm" -#include "code\game\objects\items\stacks\rods.dm" -#include "code\game\objects\items\stacks\stack.dm" -#include "code\game\objects\items\stacks\stack_recipe.dm" -#include "code\game\objects\items\stacks\telecrystal.dm" -#include "code\game\objects\items\stacks\sheets\glass.dm" -#include "code\game\objects\items\stacks\sheets\leather.dm" -#include "code\game\objects\items\stacks\sheets\light.dm" -#include "code\game\objects\items\stacks\sheets\mineral.dm" -#include "code\game\objects\items\stacks\sheets\sheet_types.dm" -#include "code\game\objects\items\stacks\sheets\sheets.dm" -#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" -#include "code\game\objects\items\stacks\tiles\tile_types.dm" -#include "code\game\objects\items\weapons\AI_modules.dm" -#include "code\game\objects\items\weapons\alien_specific.dm" -#include "code\game\objects\items\weapons\bee_briefcase.dm" -#include "code\game\objects\items\weapons\cards_ids.dm" -#include "code\game\objects\items\weapons\cash.dm" -#include "code\game\objects\items\weapons\caution.dm" -#include "code\game\objects\items\weapons\chrono_eraser.dm" -#include "code\game\objects\items\weapons\cigs.dm" -#include "code\game\objects\items\weapons\clown_items.dm" -#include "code\game\objects\items\weapons\cosmetics.dm" -#include "code\game\objects\items\weapons\courtroom.dm" -#include "code\game\objects\items\weapons\defib.dm" -#include "code\game\objects\items\weapons\dice.dm" -#include "code\game\objects\items\weapons\disks.dm" -#include "code\game\objects\items\weapons\dna_injector.dm" -#include "code\game\objects\items\weapons\dnascrambler.dm" -#include "code\game\objects\items\weapons\explosives.dm" -#include "code\game\objects\items\weapons\extinguisher.dm" -#include "code\game\objects\items\weapons\fireworks.dm" -#include "code\game\objects\items\weapons\flamethrower.dm" -#include "code\game\objects\items\weapons\garrote.dm" -#include "code\game\objects\items\weapons\gift_wrappaper.dm" -#include "code\game\objects\items\weapons\handcuffs.dm" -#include "code\game\objects\items\weapons\highlander_swords.dm" -#include "code\game\objects\items\weapons\holosign.dm" -#include "code\game\objects\items\weapons\holy_weapons.dm" -#include "code\game\objects\items\weapons\kitchen.dm" -#include "code\game\objects\items\weapons\legcuffs.dm" -#include "code\game\objects\items\weapons\lighters.dm" -#include "code\game\objects\items\weapons\manuals.dm" -#include "code\game\objects\items\weapons\misc.dm" -#include "code\game\objects\items\weapons\mop.dm" -#include "code\game\objects\items\weapons\paint.dm" -#include "code\game\objects\items\weapons\paiwire.dm" -#include "code\game\objects\items\weapons\pneumaticCannon.dm" -#include "code\game\objects\items\weapons\powerfist.dm" -#include "code\game\objects\items\weapons\RCD.dm" -#include "code\game\objects\items\weapons\RCL.dm" -#include "code\game\objects\items\weapons\rpd.dm" -#include "code\game\objects\items\weapons\RSF.dm" -#include "code\game\objects\items\weapons\scissors.dm" -#include "code\game\objects\items\weapons\scrolls.dm" -#include "code\game\objects\items\weapons\shards.dm" -#include "code\game\objects\items\weapons\shields.dm" -#include "code\game\objects\items\weapons\signs.dm" -#include "code\game\objects\items\weapons\soap.dm" -#include "code\game\objects\items\weapons\staff.dm" -#include "code\game\objects\items\weapons\stock_parts.dm" -#include "code\game\objects\items\weapons\stunbaton.dm" -#include "code\game\objects\items\weapons\swords_axes_etc.dm" -#include "code\game\objects\items\weapons\tape.dm" -#include "code\game\objects\items\weapons\teleportation.dm" -#include "code\game\objects\items\weapons\teleprod.dm" -#include "code\game\objects\items\weapons\tools.dm" -#include "code\game\objects\items\weapons\twohanded.dm" -#include "code\game\objects\items\weapons\vending_items.dm" -#include "code\game\objects\items\weapons\weaponry.dm" -#include "code\game\objects\items\weapons\whetstone.dm" -#include "code\game\objects\items\weapons\grenades\atmosgrenade.dm" -#include "code\game\objects\items\weapons\grenades\bananade.dm" -#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" -#include "code\game\objects\items\weapons\grenades\clowngrenade.dm" -#include "code\game\objects\items\weapons\grenades\clusterbuster.dm" -#include "code\game\objects\items\weapons\grenades\confetti.dm" -#include "code\game\objects\items\weapons\grenades\custom_grenades.dm" -#include "code\game\objects\items\weapons\grenades\emgrenade.dm" -#include "code\game\objects\items\weapons\grenades\flashbang.dm" -#include "code\game\objects\items\weapons\grenades\frag.dm" -#include "code\game\objects\items\weapons\grenades\ghettobomb.dm" -#include "code\game\objects\items\weapons\grenades\grenade.dm" -#include "code\game\objects\items\weapons\grenades\smokebomb.dm" -#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" -#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm" -#include "code\game\objects\items\weapons\implants\health.dm" -#include "code\game\objects\items\weapons\implants\implant.dm" -#include "code\game\objects\items\weapons\implants\implant_abductor.dm" -#include "code\game\objects\items\weapons\implants\implant_chem.dm" -#include "code\game\objects\items\weapons\implants\implant_death_alarm.dm" -#include "code\game\objects\items\weapons\implants\implant_explosive.dm" -#include "code\game\objects\items\weapons\implants\implant_freedom.dm" -#include "code\game\objects\items\weapons\implants\implant_krav_maga.dm" -#include "code\game\objects\items\weapons\implants\implant_mindshield.dm" -#include "code\game\objects\items\weapons\implants\implant_misc.dm" -#include "code\game\objects\items\weapons\implants\implant_storage.dm" -#include "code\game\objects\items\weapons\implants\implant_track.dm" -#include "code\game\objects\items\weapons\implants\implant_traitor.dm" -#include "code\game\objects\items\weapons\implants\implantcase.dm" -#include "code\game\objects\items\weapons\implants\implantchair.dm" -#include "code\game\objects\items\weapons\implants\implanter.dm" -#include "code\game\objects\items\weapons\implants\implantpad.dm" -#include "code\game\objects\items\weapons\implants\implantuplink.dm" -#include "code\game\objects\items\weapons\melee\energy.dm" -#include "code\game\objects\items\weapons\melee\misc.dm" -#include "code\game\objects\items\weapons\storage\artistic_toolbox.dm" -#include "code\game\objects\items\weapons\storage\backpack.dm" -#include "code\game\objects\items\weapons\storage\bags.dm" -#include "code\game\objects\items\weapons\storage\belt.dm" -#include "code\game\objects\items\weapons\storage\bible.dm" -#include "code\game\objects\items\weapons\storage\boxes.dm" -#include "code\game\objects\items\weapons\storage\briefcase.dm" -#include "code\game\objects\items\weapons\storage\fancy.dm" -#include "code\game\objects\items\weapons\storage\firstaid.dm" -#include "code\game\objects\items\weapons\storage\internal.dm" -#include "code\game\objects\items\weapons\storage\lockbox.dm" -#include "code\game\objects\items\weapons\storage\secure.dm" -#include "code\game\objects\items\weapons\storage\storage.dm" -#include "code\game\objects\items\weapons\storage\toolbox.dm" -#include "code\game\objects\items\weapons\storage\uplink_kits.dm" -#include "code\game\objects\items\weapons\storage\wallets.dm" -#include "code\game\objects\items\weapons\tanks\jetpack.dm" -#include "code\game\objects\items\weapons\tanks\tank_types.dm" -#include "code\game\objects\items\weapons\tanks\tanks.dm" -#include "code\game\objects\items\weapons\tanks\watertank.dm" -#include "code\game\objects\random\random.dm" -#include "code\game\objects\structures\aliens.dm" -#include "code\game\objects\structures\barsign.dm" -#include "code\game\objects\structures\bedsheet_bin.dm" -#include "code\game\objects\structures\coathanger.dm" -#include "code\game\objects\structures\curtains.dm" -#include "code\game\objects\structures\depot.dm" -#include "code\game\objects\structures\displaycase.dm" -#include "code\game\objects\structures\door_assembly.dm" -#include "code\game\objects\structures\door_assembly_types.dm" -#include "code\game\objects\structures\dresser.dm" -#include "code\game\objects\structures\electricchair.dm" -#include "code\game\objects\structures\engicart.dm" -#include "code\game\objects\structures\extinguisher.dm" -#include "code\game\objects\structures\false_walls.dm" -#include "code\game\objects\structures\flora.dm" -#include "code\game\objects\structures\fluff.dm" -#include "code\game\objects\structures\foodcart.dm" -#include "code\game\objects\structures\girders.dm" -#include "code\game\objects\structures\grille.dm" -#include "code\game\objects\structures\guillotine.dm" -#include "code\game\objects\structures\holosign.dm" -#include "code\game\objects\structures\inflatable.dm" -#include "code\game\objects\structures\janicart.dm" -#include "code\game\objects\structures\kitchen_spike.dm" -#include "code\game\objects\structures\ladders.dm" -#include "code\game\objects\structures\lamarr_cage.dm" -#include "code\game\objects\structures\lattice.dm" -#include "code\game\objects\structures\mineral_doors.dm" -#include "code\game\objects\structures\mirror.dm" -#include "code\game\objects\structures\misc.dm" -#include "code\game\objects\structures\mop_bucket.dm" -#include "code\game\objects\structures\morgue.dm" -#include "code\game\objects\structures\musician.dm" -#include "code\game\objects\structures\noticeboard.dm" -#include "code\game\objects\structures\plasticflaps.dm" -#include "code\game\objects\structures\reflector.dm" -#include "code\game\objects\structures\safe.dm" -#include "code\game\objects\structures\signs.dm" -#include "code\game\objects\structures\spirit_board.dm" -#include "code\game\objects\structures\statues.dm" -#include "code\game\objects\structures\table_frames.dm" -#include "code\game\objects\structures\tables_racks.dm" -#include "code\game\objects\structures\tank_dispenser.dm" -#include "code\game\objects\structures\target_stake.dm" -#include "code\game\objects\structures\watercloset.dm" -#include "code\game\objects\structures\windoor_assembly.dm" -#include "code\game\objects\structures\window.dm" -#include "code\game\objects\structures\crates_lockers\closets.dm" -#include "code\game\objects\structures\crates_lockers\crates.dm" -#include "code\game\objects\structures\crates_lockers\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\largecrate.dm" -#include "code\game\objects\structures\crates_lockers\walllocker.dm" -#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm" -#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" -#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm" -#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" -#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" -#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" -#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" -#include "code\game\objects\structures\crates_lockers\closets\statue.dm" -#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\chaplain.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\depot.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\miscjobs.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" -#include "code\game\objects\structures\decor\decor.dm" -#include "code\game\objects\structures\decor\machinery\telecomms.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" -#include "code\game\objects\structures\transit_tubes\station.dm" -#include "code\game\objects\structures\transit_tubes\transit_tube.dm" -#include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm" -#include "code\game\turfs\simulated.dm" -#include "code\game\turfs\turf.dm" -#include "code\game\turfs\unsimulated.dm" -#include "code\game\turfs\simulated\floor.dm" -#include "code\game\turfs\simulated\minerals.dm" -#include "code\game\turfs\simulated\river.dm" -#include "code\game\turfs\simulated\shuttle.dm" -#include "code\game\turfs\simulated\walls.dm" -#include "code\game\turfs\simulated\walls_indestructible.dm" -#include "code\game\turfs\simulated\walls_mineral.dm" -#include "code\game\turfs\simulated\walls_misc.dm" -#include "code\game\turfs\simulated\walls_reinforced.dm" -#include "code\game\turfs\simulated\floor\asteroid.dm" -#include "code\game\turfs\simulated\floor\chasm.dm" -#include "code\game\turfs\simulated\floor\fancy_floor.dm" -#include "code\game\turfs\simulated\floor\indestructible.dm" -#include "code\game\turfs\simulated\floor\lava.dm" -#include "code\game\turfs\simulated\floor\light_floor.dm" -#include "code\game\turfs\simulated\floor\mineral.dm" -#include "code\game\turfs\simulated\floor\misc_floor.dm" -#include "code\game\turfs\simulated\floor\plasteel_floor.dm" -#include "code\game\turfs\simulated\floor\plating.dm" -#include "code\game\turfs\space\space.dm" -#include "code\game\turfs\space\transit.dm" -#include "code\game\turfs\unsimulated\beach.dm" -#include "code\game\turfs\unsimulated\floor.dm" -#include "code\game\turfs\unsimulated\walls.dm" -#include "code\game\verbs\ooc.dm" -#include "code\game\verbs\randomtip.dm" -#include "code\game\verbs\suicide.dm" -#include "code\game\verbs\who.dm" -#include "code\js\byjax.dm" -#include "code\js\menus.dm" -#include "code\LINDA\LINDA_fire.dm" -#include "code\LINDA\LINDA_system.dm" -#include "code\LINDA\LINDA_turf_tile.dm" -#include "code\modules\admin\admin.dm" -#include "code\modules\admin\admin_investigate.dm" -#include "code\modules\admin\admin_memo.dm" -#include "code\modules\admin\admin_ranks.dm" -#include "code\modules\admin\admin_verbs.dm" -#include "code\modules\admin\banappearance.dm" -#include "code\modules\admin\banjob.dm" -#include "code\modules\admin\create_mob.dm" -#include "code\modules\admin\create_object.dm" -#include "code\modules\admin\create_poll.dm" -#include "code\modules\admin\create_turf.dm" -#include "code\modules\admin\holder2.dm" -#include "code\modules\admin\ipintel.dm" -#include "code\modules\admin\IsBanned.dm" -#include "code\modules\admin\machine_upgrade.dm" -#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\stickyban.dm" -#include "code\modules\admin\topic.dm" -#include "code\modules\admin\ToRban.dm" -#include "code\modules\admin\watchlist.dm" -#include "code\modules\admin\DB ban\functions.dm" -#include "code\modules\admin\permissionverbs\permissionedit.dm" -#include "code\modules\admin\tickets\adminticketsverbs.dm" -#include "code\modules\admin\tickets\mentorticketsverbs.dm" -#include "code\modules\admin\verbs\adminhelp.dm" -#include "code\modules\admin\verbs\adminjump.dm" -#include "code\modules\admin\verbs\adminpm.dm" -#include "code\modules\admin\verbs\adminsay.dm" -#include "code\modules\admin\verbs\alt_check.dm" -#include "code\modules\admin\verbs\antag-ooc.dm" -#include "code\modules\admin\verbs\atmosdebug.dm" -#include "code\modules\admin\verbs\BrokenInhands.dm" -#include "code\modules\admin\verbs\cinematic.dm" -#include "code\modules\admin\verbs\custom_event.dm" -#include "code\modules\admin\verbs\deadsay.dm" -#include "code\modules\admin\verbs\debug.dm" -#include "code\modules\admin\verbs\diagnostics.dm" -#include "code\modules\admin\verbs\dice.dm" -#include "code\modules\admin\verbs\freeze.dm" -#include "code\modules\admin\verbs\getlogs.dm" -#include "code\modules\admin\verbs\gimmick_team.dm" -#include "code\modules\admin\verbs\honksquad.dm" -#include "code\modules\admin\verbs\infiltratorteam_syndicate.dm" -#include "code\modules\admin\verbs\map_template_loadverb.dm" -#include "code\modules\admin\verbs\mapping.dm" -#include "code\modules\admin\verbs\massmodvar.dm" -#include "code\modules\admin\verbs\modifyvariables.dm" -#include "code\modules\admin\verbs\one_click_antag.dm" -#include "code\modules\admin\verbs\onlyone.dm" -#include "code\modules\admin\verbs\onlyoneteam.dm" -#include "code\modules\admin\verbs\playsound.dm" -#include "code\modules\admin\verbs\possess.dm" -#include "code\modules\admin\verbs\pray.dm" -#include "code\modules\admin\verbs\randomverbs.dm" -#include "code\modules\admin\verbs\serialization.dm" -#include "code\modules\admin\verbs\space_transitions.dm" -#include "code\modules\admin\verbs\spawnfloorcluwne.dm" -#include "code\modules\admin\verbs\striketeam.dm" -#include "code\modules\admin\verbs\striketeam_syndicate.dm" -#include "code\modules\admin\verbs\ticklag.dm" -#include "code\modules\admin\verbs\toggledebugverbs.dm" -#include "code\modules\admin\verbs\tripAI.dm" -#include "code\modules\admin\verbs\vox_raiders.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" -#include "code\modules\admin\verbs\SDQL2\useful_procs.dm" -#include "code\modules\alarm\alarm.dm" -#include "code\modules\alarm\alarm_handler.dm" -#include "code\modules\alarm\atmosphere_alarm.dm" -#include "code\modules\alarm\burglar_alarm.dm" -#include "code\modules\alarm\camera_alarm.dm" -#include "code\modules\alarm\fire_alarm.dm" -#include "code\modules\alarm\motion_alarm.dm" -#include "code\modules\alarm\power_alarm.dm" -#include "code\modules\antagonists\_common\antag_datum.dm" -#include "code\modules\antagonists\_common\antag_helpers.dm" -#include "code\modules\antagonists\_common\antag_hud.dm" -#include "code\modules\antagonists\_common\antag_spawner.dm" -#include "code\modules\antagonists\_common\antag_team.dm" -#include "code\modules\antagonists\wishgranter\wishgranter.dm" -#include "code\modules\arcade\arcade_base.dm" -#include "code\modules\arcade\arcade_prize.dm" -#include "code\modules\arcade\claw_game.dm" -#include "code\modules\arcade\prize_counter.dm" -#include "code\modules\arcade\prize_datums.dm" -#include "code\modules\arcade\mob_hunt\battle_computer.dm" -#include "code\modules\arcade\mob_hunt\mob_avatar.dm" -#include "code\modules\arcade\mob_hunt\mob_cards.dm" -#include "code\modules\arcade\mob_hunt\mob_datums.dm" -#include "code\modules\arcade\mob_hunt\mob_type_datums.dm" -#include "code\modules\assembly\assembly.dm" -#include "code\modules\assembly\bomb.dm" -#include "code\modules\assembly\health.dm" -#include "code\modules\assembly\helpers.dm" -#include "code\modules\assembly\holder.dm" -#include "code\modules\assembly\igniter.dm" -#include "code\modules\assembly\infrared.dm" -#include "code\modules\assembly\mousetrap.dm" -#include "code\modules\assembly\proximity.dm" -#include "code\modules\assembly\shock_kit.dm" -#include "code\modules\assembly\signaler.dm" -#include "code\modules\assembly\timer.dm" -#include "code\modules\assembly\voice.dm" -#include "code\modules\atmos_automation\console.dm" -#include "code\modules\atmos_automation\statements.dm" -#include "code\modules\atmos_automation\implementation\digital_valves.dm" -#include "code\modules\atmos_automation\implementation\emitters.dm" -#include "code\modules\atmos_automation\implementation\injectors.dm" -#include "code\modules\atmos_automation\implementation\scrubbers.dm" -#include "code\modules\atmos_automation\implementation\sensors.dm" -#include "code\modules\atmos_automation\implementation\vent_pump.dm" -#include "code\modules\awaymissions\corpse.dm" -#include "code\modules\awaymissions\exile.dm" -#include "code\modules\awaymissions\gateway.dm" -#include "code\modules\awaymissions\loot.dm" -#include "code\modules\awaymissions\map_rng.dm" -#include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\trigger.dm" -#include "code\modules\awaymissions\zlevel.dm" -#include "code\modules\awaymissions\zvis.dm" -#include "code\modules\awaymissions\maploader\dmm_suite.dm" -#include "code\modules\awaymissions\maploader\reader.dm" -#include "code\modules\awaymissions\maploader\writer.dm" -#include "code\modules\awaymissions\mission_code\academy.dm" -#include "code\modules\awaymissions\mission_code\beach.dm" -#include "code\modules\awaymissions\mission_code\blackmarketpackers.dm" -#include "code\modules\awaymissions\mission_code\centcomAway.dm" -#include "code\modules\awaymissions\mission_code\challenge.dm" -#include "code\modules\awaymissions\mission_code\evil_santa.dm" -#include "code\modules\awaymissions\mission_code\spacebattle.dm" -#include "code\modules\awaymissions\mission_code\spacehotel.dm" -#include "code\modules\awaymissions\mission_code\stationCollision.dm" -#include "code\modules\awaymissions\mission_code\UO71-terrorspiders.dm" -#include "code\modules\awaymissions\mission_code\wildwest.dm" -#include "code\modules\awaymissions\mission_code\ghost_role_spawners\golems.dm" -#include "code\modules\awaymissions\mission_code\ghost_role_spawners\oldstation.dm" -#include "code\modules\awaymissions\mission_code\ruins\oldstation.dm" -#include "code\modules\awaymissions\mission_code\ruins\wizardcrash.dm" -#include "code\modules\buildmode\bm_mode.dm" -#include "code\modules\buildmode\buildmode.dm" -#include "code\modules\buildmode\buttons.dm" -#include "code\modules\buildmode\effects\line.dm" -#include "code\modules\buildmode\submodes\advanced.dm" -#include "code\modules\buildmode\submodes\area_edit.dm" -#include "code\modules\buildmode\submodes\atmos.dm" -#include "code\modules\buildmode\submodes\basic.dm" -#include "code\modules\buildmode\submodes\boom.dm" -#include "code\modules\buildmode\submodes\copy.dm" -#include "code\modules\buildmode\submodes\fill.dm" -#include "code\modules\buildmode\submodes\link.dm" -#include "code\modules\buildmode\submodes\mapgen.dm" -#include "code\modules\buildmode\submodes\save.dm" -#include "code\modules\buildmode\submodes\throwing.dm" -#include "code\modules\buildmode\submodes\variable_edit.dm" -#include "code\modules\busy_space\air_traffic.dm" -#include "code\modules\busy_space\loremaster.dm" -#include "code\modules\busy_space\organizations.dm" -#include "code\modules\client\asset_cache.dm" -#include "code\modules\client\client defines.dm" -#include "code\modules\client\client procs.dm" -#include "code\modules\client\message.dm" -#include "code\modules\client\view.dm" -#include "code\modules\client\preference\preferences.dm" -#include "code\modules\client\preference\preferences_mysql.dm" -#include "code\modules\client\preference\preferences_spawnpoints.dm" -#include "code\modules\client\preference\preferences_toggles.dm" -#include "code\modules\client\preference\loadout\gear_tweaks.dm" -#include "code\modules\client\preference\loadout\loadout.dm" -#include "code\modules\client\preference\loadout\loadout_accessories.dm" -#include "code\modules\client\preference\loadout\loadout_cosmetics.dm" -#include "code\modules\client\preference\loadout\loadout_donor.dm" -#include "code\modules\client\preference\loadout\loadout_general.dm" -#include "code\modules\client\preference\loadout\loadout_hat.dm" -#include "code\modules\client\preference\loadout\loadout_racial.dm" -#include "code\modules\client\preference\loadout\loadout_shoes.dm" -#include "code\modules\client\preference\loadout\loadout_suit.dm" -#include "code\modules\client\preference\loadout\loadout_uniform.dm" -#include "code\modules\clothing\chameleon.dm" -#include "code\modules\clothing\clothing.dm" -#include "code\modules\clothing\ears\ears.dm" -#include "code\modules\clothing\glasses\glasses.dm" -#include "code\modules\clothing\glasses\hud.dm" -#include "code\modules\clothing\gloves\boxing.dm" -#include "code\modules\clothing\gloves\color.dm" -#include "code\modules\clothing\gloves\miscellaneous.dm" -#include "code\modules\clothing\gloves\rings.dm" -#include "code\modules\clothing\head\collectable.dm" -#include "code\modules\clothing\head\hardhat.dm" -#include "code\modules\clothing\head\helmet.dm" -#include "code\modules\clothing\head\jobs.dm" -#include "code\modules\clothing\head\misc.dm" -#include "code\modules\clothing\head\misc_special.dm" -#include "code\modules\clothing\head\soft_caps.dm" -#include "code\modules\clothing\masks\boxing.dm" -#include "code\modules\clothing\masks\breath.dm" -#include "code\modules\clothing\masks\gasmask.dm" -#include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\patreon\glasses.dm" -#include "code\modules\clothing\patreon\hats.dm" -#include "code\modules\clothing\shoes\colour.dm" -#include "code\modules\clothing\shoes\magboots.dm" -#include "code\modules\clothing\shoes\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\alien.dm" -#include "code\modules\clothing\spacesuits\breaches.dm" -#include "code\modules\clothing\spacesuits\chronosuit.dm" -#include "code\modules\clothing\spacesuits\ert.dm" -#include "code\modules\clothing\spacesuits\hardsuit.dm" -#include "code\modules\clothing\spacesuits\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\plasmamen.dm" -#include "code\modules\clothing\spacesuits\syndi.dm" -#include "code\modules\clothing\spacesuits\void.dm" -#include "code\modules\clothing\spacesuits\rig\rig.dm" -#include "code\modules\clothing\spacesuits\rig\rig_armormod.dm" -#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" -#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" -#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" -#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" -#include "code\modules\clothing\spacesuits\rig\modules\combat.dm" -#include "code\modules\clothing\spacesuits\rig\modules\computer.dm" -#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" -#include "code\modules\clothing\spacesuits\rig\modules\ninja.dm" -#include "code\modules\clothing\spacesuits\rig\modules\utility.dm" -#include "code\modules\clothing\spacesuits\rig\modules\vision.dm" -#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" -#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" -#include "code\modules\clothing\spacesuits\rig\suits\ert_suits.dm" -#include "code\modules\clothing\spacesuits\rig\suits\light.dm" -#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" -#include "code\modules\clothing\spacesuits\rig\suits\station.dm" -#include "code\modules\clothing\suits\alien.dm" -#include "code\modules\clothing\suits\armor.dm" -#include "code\modules\clothing\suits\bio.dm" -#include "code\modules\clothing\suits\hood.dm" -#include "code\modules\clothing\suits\jobs.dm" -#include "code\modules\clothing\suits\labcoat.dm" -#include "code\modules\clothing\suits\miscellaneous.dm" -#include "code\modules\clothing\suits\storage.dm" -#include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" -#include "code\modules\clothing\under\color.dm" -#include "code\modules\clothing\under\miscellaneous.dm" -#include "code\modules\clothing\under\oldstation_uni.dm" -#include "code\modules\clothing\under\pants.dm" -#include "code\modules\clothing\under\shorts.dm" -#include "code\modules\clothing\under\syndicate.dm" -#include "code\modules\clothing\under\accessories\accessory.dm" -#include "code\modules\clothing\under\accessories\armband.dm" -#include "code\modules\clothing\under\accessories\holster.dm" -#include "code\modules\clothing\under\accessories\storage.dm" -#include "code\modules\clothing\under\jobs\civilian.dm" -#include "code\modules\clothing\under\jobs\engineering.dm" -#include "code\modules\clothing\under\jobs\medsci.dm" -#include "code\modules\clothing\under\jobs\security.dm" -#include "code\modules\countdown\countdown.dm" -#include "code\modules\crafting\craft.dm" -#include "code\modules\crafting\guncrafting.dm" -#include "code\modules\crafting\recipes.dm" -#include "code\modules\customitems\item_defines.dm" -#include "code\modules\customitems\item_spawning.dm" -#include "code\modules\detective_work\detective_work.dm" -#include "code\modules\detective_work\evidence.dm" -#include "code\modules\detective_work\footprints_and_rag.dm" -#include "code\modules\detective_work\scanner.dm" -#include "code\modules\economy\Accounts.dm" -#include "code\modules\economy\Accounts_DB.dm" -#include "code\modules\economy\ATM.dm" -#include "code\modules\economy\Economy.dm" -#include "code\modules\economy\Economy_Events.dm" -#include "code\modules\economy\Economy_Events_Mundane.dm" -#include "code\modules\economy\Economy_TradeDestinations.dm" -#include "code\modules\economy\EFTPOS.dm" -#include "code\modules\economy\Job_Departments.dm" -#include "code\modules\economy\POS.dm" -#include "code\modules\economy\utils.dm" -#include "code\modules\error_handler\error_handler.dm" -#include "code\modules\error_handler\error_viewer.dm" -#include "code\modules\events\abductor.dm" -#include "code\modules\events\alien_infestation.dm" -#include "code\modules\events\anomaly.dm" -#include "code\modules\events\anomaly_bluespace.dm" -#include "code\modules\events\anomaly_flux.dm" -#include "code\modules\events\anomaly_grav.dm" -#include "code\modules\events\anomaly_pyro.dm" -#include "code\modules\events\anomaly_vortex.dm" -#include "code\modules\events\aurora_caelus.dm" -#include "code\modules\events\blob.dm" -#include "code\modules\events\brand_intelligence.dm" -#include "code\modules\events\carp_migration.dm" -#include "code\modules\events\communications_blackout.dm" -#include "code\modules\events\disease_outbreak.dm" -#include "code\modules\events\dust.dm" -#include "code\modules\events\electrical_storm.dm" -#include "code\modules\events\event.dm" -#include "code\modules\events\event_container.dm" -#include "code\modules\events\event_procs.dm" -#include "code\modules\events\false_alarm.dm" -#include "code\modules\events\floorcluwne.dm" -#include "code\modules\events\grid_check.dm" -#include "code\modules\events\immovable_rod.dm" -#include "code\modules\events\infestation.dm" -#include "code\modules\events\ion_storm.dm" -#include "code\modules\events\koi_mirgration.dm" -#include "code\modules\events\mass_hallucination.dm" -#include "code\modules\events\meaty_gore.dm" -#include "code\modules\events\meaty_ops.dm" -#include "code\modules\events\meaty_ores.dm" -#include "code\modules\events\meteors.dm" -#include "code\modules\events\money_hacker.dm" -#include "code\modules\events\money_lotto.dm" -#include "code\modules\events\money_spam.dm" -#include "code\modules\events\prison_break.dm" -#include "code\modules\events\radiation_storm.dm" -#include "code\modules\events\rogue_drones.dm" -#include "code\modules\events\sentience.dm" -#include "code\modules\events\slaughterevent.dm" -#include "code\modules\events\spacevine.dm" -#include "code\modules\events\spider_infestation.dm" -#include "code\modules\events\spider_terror.dm" -#include "code\modules\events\spontaneous_appendicitis.dm" -#include "code\modules\events\tear.dm" -#include "code\modules\events\tear_honk.dm" -#include "code\modules\events\traders.dm" -#include "code\modules\events\undead.dm" -#include "code\modules\events\vent_clog.dm" -#include "code\modules\events\wallrot.dm" -#include "code\modules\events\wormholes.dm" -#include "code\modules\events\wizard\ghost.dm" -#include "code\modules\examine\examine.dm" -#include "code\modules\examine\descriptions\atmospherics.dm" -#include "code\modules\examine\descriptions\engineering.dm" -#include "code\modules\examine\descriptions\medical.dm" -#include "code\modules\examine\descriptions\mobs.dm" -#include "code\modules\examine\descriptions\stacks.dm" -#include "code\modules\examine\descriptions\structures.dm" -#include "code\modules\examine\descriptions\turfs.dm" -#include "code\modules\examine\descriptions\weapons.dm" -#include "code\modules\ext_scripts\irc.dm" -#include "code\modules\ext_scripts\python.dm" -#include "code\modules\fancytitle\fancytitle.dm" -#include "code\modules\fish\fish_eggs.dm" -#include "code\modules\fish\fish_items.dm" -#include "code\modules\fish\fish_types.dm" -#include "code\modules\fish\fishtank.dm" -#include "code\modules\flufftext\Dreaming.dm" -#include "code\modules\flufftext\Hallucination.dm" -#include "code\modules\flufftext\TextFilters.dm" -#include "code\modules\food_and_drinks\food.dm" -#include "code\modules\food_and_drinks\drinks\drinks.dm" -#include "code\modules\food_and_drinks\drinks\bottler\bottler.dm" -#include "code\modules\food_and_drinks\drinks\bottler\bottler_recipes.dm" -#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" -#include "code\modules\food_and_drinks\drinks\drinks\cans.dm" -#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" -#include "code\modules\food_and_drinks\drinks\drinks\mugs.dm" -#include "code\modules\food_and_drinks\drinks\drinks\shotglass.dm" -#include "code\modules\food_and_drinks\food\condiment.dm" -#include "code\modules\food_and_drinks\food\customizables.dm" -#include "code\modules\food_and_drinks\food\snacks.dm" -#include "code\modules\food_and_drinks\food\foods\baked_goods.dm" -#include "code\modules\food_and_drinks\food\foods\bread.dm" -#include "code\modules\food_and_drinks\food\foods\candy.dm" -#include "code\modules\food_and_drinks\food\foods\desserts.dm" -#include "code\modules\food_and_drinks\food\foods\ethnic.dm" -#include "code\modules\food_and_drinks\food\foods\ingredients.dm" -#include "code\modules\food_and_drinks\food\foods\junkfood.dm" -#include "code\modules\food_and_drinks\food\foods\meat.dm" -#include "code\modules\food_and_drinks\food\foods\misc.dm" -#include "code\modules\food_and_drinks\food\foods\pasta.dm" -#include "code\modules\food_and_drinks\food\foods\pizza.dm" -#include "code\modules\food_and_drinks\food\foods\sandwiches.dm" -#include "code\modules\food_and_drinks\food\foods\seafood.dm" -#include "code\modules\food_and_drinks\food\foods\side_dishes.dm" -#include "code\modules\food_and_drinks\food\foods\soups.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\candy_maker.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\cereal_maker.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\cooker.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\food_grill.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\grill_new.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat_2.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\juicer.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\kitchen_machine.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\oven.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\oven_new.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" -#include "code\modules\food_and_drinks\recipes\recipes_candy.dm" -#include "code\modules\food_and_drinks\recipes\recipes_grill.dm" -#include "code\modules\food_and_drinks\recipes\recipes_microwave.dm" -#include "code\modules\food_and_drinks\recipes\recipes_oven.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_table.dm" -#include "code\modules\games\52card.dm" -#include "code\modules\games\cards.dm" -#include "code\modules\games\tarot.dm" -#include "code\modules\holiday\christmas.dm" -#include "code\modules\holiday\holiday.dm" -#include "code\modules\hydroponics\biogenerator.dm" -#include "code\modules\hydroponics\fermenting_barrel.dm" -#include "code\modules\hydroponics\gene_modder.dm" -#include "code\modules\hydroponics\grown.dm" -#include "code\modules\hydroponics\growninedible.dm" -#include "code\modules\hydroponics\hydroitemdefines.dm" -#include "code\modules\hydroponics\hydroponics.dm" -#include "code\modules\hydroponics\plant_genes.dm" -#include "code\modules\hydroponics\sample.dm" -#include "code\modules\hydroponics\seed_extractor.dm" -#include "code\modules\hydroponics\seeds.dm" -#include "code\modules\hydroponics\beekeeping\beebox.dm" -#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm" -#include "code\modules\hydroponics\beekeeping\honey_frame.dm" -#include "code\modules\hydroponics\beekeeping\honeycomb.dm" -#include "code\modules\hydroponics\grown\ambrosia.dm" -#include "code\modules\hydroponics\grown\apple.dm" -#include "code\modules\hydroponics\grown\banana.dm" -#include "code\modules\hydroponics\grown\beans.dm" -#include "code\modules\hydroponics\grown\berries.dm" -#include "code\modules\hydroponics\grown\cannabis.dm" -#include "code\modules\hydroponics\grown\cereals.dm" -#include "code\modules\hydroponics\grown\chili.dm" -#include "code\modules\hydroponics\grown\citrus.dm" -#include "code\modules\hydroponics\grown\cocoa_vanilla.dm" -#include "code\modules\hydroponics\grown\corn.dm" -#include "code\modules\hydroponics\grown\eggplant.dm" -#include "code\modules\hydroponics\grown\flowers.dm" -#include "code\modules\hydroponics\grown\grass_carpet.dm" -#include "code\modules\hydroponics\grown\herbals.dm" -#include "code\modules\hydroponics\grown\kudzu.dm" -#include "code\modules\hydroponics\grown\melon.dm" -#include "code\modules\hydroponics\grown\misc.dm" -#include "code\modules\hydroponics\grown\mushrooms.dm" -#include "code\modules\hydroponics\grown\nettle.dm" -#include "code\modules\hydroponics\grown\nymph.dm" -#include "code\modules\hydroponics\grown\onion.dm" -#include "code\modules\hydroponics\grown\peanut.dm" -#include "code\modules\hydroponics\grown\pineapple.dm" -#include "code\modules\hydroponics\grown\potato.dm" -#include "code\modules\hydroponics\grown\pumpkin.dm" -#include "code\modules\hydroponics\grown\random.dm" -#include "code\modules\hydroponics\grown\replicapod.dm" -#include "code\modules\hydroponics\grown\root.dm" -#include "code\modules\hydroponics\grown\tea_coffee.dm" -#include "code\modules\hydroponics\grown\tobacco.dm" -#include "code\modules\hydroponics\grown\tomato.dm" -#include "code\modules\hydroponics\grown\towercap.dm" -#include "code\modules\karma\karma.dm" -#include "code\modules\library\admin.dm" -#include "code\modules\library\codex_gigas.dm" -#include "code\modules\library\lib_items.dm" -#include "code\modules\library\lib_machines.dm" -#include "code\modules\library\lib_readme.dm" -#include "code\modules\library\random_books.dm" -#include "code\modules\library\computers\base.dm" -#include "code\modules\library\computers\checkout.dm" -#include "code\modules\library\computers\public.dm" -#include "code\modules\lighting\__lighting_docs.dm" -#include "code\modules\lighting\lighting_area.dm" -#include "code\modules\lighting\lighting_atom.dm" -#include "code\modules\lighting\lighting_corner.dm" -#include "code\modules\lighting\lighting_object.dm" -#include "code\modules\lighting\lighting_setup.dm" -#include "code\modules\lighting\lighting_source.dm" -#include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\logic\converter.dm" -#include "code\modules\logic\dual_input.dm" -#include "code\modules\logic\logic_base.dm" -#include "code\modules\logic\mono_input.dm" -#include "code\modules\map_fluff\cyberiad.dm" -#include "code\modules\map_fluff\delta.dm" -#include "code\modules\map_fluff\maps.dm" -#include "code\modules\map_fluff\metastation.dm" -#include "code\modules\martial_arts\adminfu.dm" -#include "code\modules\martial_arts\brawling.dm" -#include "code\modules\martial_arts\cqc.dm" -#include "code\modules\martial_arts\krav_maga.dm" -#include "code\modules\martial_arts\martial.dm" -#include "code\modules\martial_arts\mimejutsu.dm" -#include "code\modules\martial_arts\plasma_fist.dm" -#include "code\modules\martial_arts\sleeping_carp.dm" -#include "code\modules\martial_arts\wrestleing.dm" -#include "code\modules\mining\abandonedcrates.dm" -#include "code\modules\mining\coins.dm" -#include "code\modules\mining\equipment_locker.dm" -#include "code\modules\mining\explorer_gear.dm" -#include "code\modules\mining\machine_processing.dm" -#include "code\modules\mining\machine_stacking.dm" -#include "code\modules\mining\machine_unloading.dm" -#include "code\modules\mining\mine_items.dm" -#include "code\modules\mining\minebot.dm" -#include "code\modules\mining\mint.dm" -#include "code\modules\mining\money_bag.dm" -#include "code\modules\mining\ore.dm" -#include "code\modules\mining\satchel_ore_boxdm.dm" -#include "code\modules\mining\shelters.dm" -#include "code\modules\mining\equipment\marker_beacons.dm" -#include "code\modules\mining\equipment\survival_pod.dm" -#include "code\modules\mining\laborcamp\laborshuttle.dm" -#include "code\modules\mining\laborcamp\laborstacker.dm" -#include "code\modules\mining\lavaland\ash_flora.dm" -#include "code\modules\mining\lavaland\necropolis_chests.dm" -#include "code\modules\mining\lavaland\loot\ashdragon_loot.dm" -#include "code\modules\mining\lavaland\loot\bubblegum_loot.dm" -#include "code\modules\mining\lavaland\loot\colossus_loot.dm" -#include "code\modules\mining\lavaland\loot\hierophant_loot.dm" -#include "code\modules\mining\lavaland\loot\legion_loot.dm" -#include "code\modules\mining\lavaland\loot\tendril_loot.dm" -#include "code\modules\mob\abilities.dm" -#include "code\modules\mob\death.dm" -#include "code\modules\mob\emote.dm" -#include "code\modules\mob\hear_say.dm" -#include "code\modules\mob\holder.dm" -#include "code\modules\mob\inventory.dm" -#include "code\modules\mob\language.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\logout.dm" -#include "code\modules\mob\mob.dm" -#include "code\modules\mob\mob_defines.dm" -#include "code\modules\mob\mob_grab.dm" -#include "code\modules\mob\mob_helpers.dm" -#include "code\modules\mob\mob_movement.dm" -#include "code\modules\mob\mob_transformation_simple.dm" -#include "code\modules\mob\say.dm" -#include "code\modules\mob\status_procs.dm" -#include "code\modules\mob\transform_procs.dm" -#include "code\modules\mob\typing_indicator.dm" -#include "code\modules\mob\update_icons.dm" -#include "code\modules\mob\update_status.dm" -#include "code\modules\mob\camera\camera.dm" -#include "code\modules\mob\dead\dead.dm" -#include "code\modules\mob\dead\death.dm" -#include "code\modules\mob\dead\observer\login.dm" -#include "code\modules\mob\dead\observer\logout.dm" -#include "code\modules\mob\dead\observer\observer.dm" -#include "code\modules\mob\dead\observer\say.dm" -#include "code\modules\mob\dead\observer\spells.dm" -#include "code\modules\mob\living\autohiss.dm" -#include "code\modules\mob\living\damage_procs.dm" -#include "code\modules\mob\living\death.dm" -#include "code\modules\mob\living\default_language.dm" -#include "code\modules\mob\living\life.dm" -#include "code\modules\mob\living\living.dm" -#include "code\modules\mob\living\living_defense.dm" -#include "code\modules\mob\living\living_defines.dm" -#include "code\modules\mob\living\login.dm" -#include "code\modules\mob\living\logout.dm" -#include "code\modules\mob\living\say.dm" -#include "code\modules\mob\living\stat_states.dm" -#include "code\modules\mob\living\status_procs.dm" -#include "code\modules\mob\living\update_status.dm" -#include "code\modules\mob\living\carbon\_defines.dm" -#include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_defense.dm" -#include "code\modules\mob\living\carbon\carbon_defines.dm" -#include "code\modules\mob\living\carbon\death.dm" -#include "code\modules\mob\living\carbon\give.dm" -#include "code\modules\mob\living\carbon\life.dm" -#include "code\modules\mob\living\carbon\superheroes.dm" -#include "code\modules\mob\living\carbon\update_icons.dm" -#include "code\modules\mob\living\carbon\update_status.dm" -#include "code\modules\mob\living\carbon\alien\alien.dm" -#include "code\modules\mob\living\carbon\alien\alien_defense.dm" -#include "code\modules\mob\living\carbon\alien\death.dm" -#include "code\modules\mob\living\carbon\alien\life.dm" -#include "code\modules\mob\living\carbon\alien\login.dm" -#include "code\modules\mob\living\carbon\alien\logout.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\emote.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\empress.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\life.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" -#include "code\modules\mob\living\carbon\alien\larva\emote.dm" -#include "code\modules\mob\living\carbon\alien\larva\inventory.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm" -#include "code\modules\mob\living\carbon\alien\larva\life.dm" -#include "code\modules\mob\living\carbon\alien\larva\powers.dm" -#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" -#include "code\modules\mob\living\carbon\alien\special\facehugger.dm" -#include "code\modules\mob\living\carbon\brain\brain.dm" -#include "code\modules\mob\living\carbon\brain\brain_item.dm" -#include "code\modules\mob\living\carbon\brain\death.dm" -#include "code\modules\mob\living\carbon\brain\emote.dm" -#include "code\modules\mob\living\carbon\brain\life.dm" -#include "code\modules\mob\living\carbon\brain\login.dm" -#include "code\modules\mob\living\carbon\brain\MMI.dm" -#include "code\modules\mob\living\carbon\brain\MMI_radio.dm" -#include "code\modules\mob\living\carbon\brain\robotic_brain.dm" -#include "code\modules\mob\living\carbon\brain\say.dm" -#include "code\modules\mob\living\carbon\brain\update_status.dm" -#include "code\modules\mob\living\carbon\human\appearance.dm" -#include "code\modules\mob\living\carbon\human\body_accessories.dm" -#include "code\modules\mob\living\carbon\human\death.dm" -#include "code\modules\mob\living\carbon\human\emote.dm" -#include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\human.dm" -#include "code\modules\mob\living\carbon\human\human_damage.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" -#include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_movement.dm" -#include "code\modules\mob\living\carbon\human\human_organs.dm" -#include "code\modules\mob\living\carbon\human\inventory.dm" -#include "code\modules\mob\living\carbon\human\life.dm" -#include "code\modules\mob\living\carbon\human\login.dm" -#include "code\modules\mob\living\carbon\human\logout.dm" -#include "code\modules\mob\living\carbon\human\npcs.dm" -#include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\status_procs.dm" -#include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\update_stat.dm" -#include "code\modules\mob\living\carbon\human\species\_species.dm" -#include "code\modules\mob\living\carbon\human\species\abductor.dm" -#include "code\modules\mob\living\carbon\human\species\diona.dm" -#include "code\modules\mob\living\carbon\human\species\drask.dm" -#include "code\modules\mob\living\carbon\human\species\golem.dm" -#include "code\modules\mob\living\carbon\human\species\grey.dm" -#include "code\modules\mob\living\carbon\human\species\human.dm" -#include "code\modules\mob\living\carbon\human\species\kidan.dm" -#include "code\modules\mob\living\carbon\human\species\machine.dm" -#include "code\modules\mob\living\carbon\human\species\monkey.dm" -#include "code\modules\mob\living\carbon\human\species\nucleation.dm" -#include "code\modules\mob\living\carbon\human\species\plasmaman.dm" -#include "code\modules\mob\living\carbon\human\species\shadow.dm" -#include "code\modules\mob\living\carbon\human\species\shadowling.dm" -#include "code\modules\mob\living\carbon\human\species\skeleton.dm" -#include "code\modules\mob\living\carbon\human\species\skrell.dm" -#include "code\modules\mob\living\carbon\human\species\slime.dm" -#include "code\modules\mob\living\carbon\human\species\tajaran.dm" -#include "code\modules\mob\living\carbon\human\species\unathi.dm" -#include "code\modules\mob\living\carbon\human\species\vox.dm" -#include "code\modules\mob\living\carbon\human\species\vulpkanin.dm" -#include "code\modules\mob\living\carbon\human\species\wryn.dm" -#include "code\modules\mob\living\carbon\slime\death.dm" -#include "code\modules\mob\living\carbon\slime\emote.dm" -#include "code\modules\mob\living\carbon\slime\examine.dm" -#include "code\modules\mob\living\carbon\slime\life.dm" -#include "code\modules\mob\living\carbon\slime\powers.dm" -#include "code\modules\mob\living\carbon\slime\say.dm" -#include "code\modules\mob\living\carbon\slime\slime.dm" -#include "code\modules\mob\living\carbon\slime\subtypes.dm" -#include "code\modules\mob\living\carbon\slime\update_icons.dm" -#include "code\modules\mob\living\silicon\death.dm" -#include "code\modules\mob\living\silicon\emote.dm" -#include "code\modules\mob\living\silicon\laws.dm" -#include "code\modules\mob\living\silicon\login.dm" -#include "code\modules\mob\living\silicon\say.dm" -#include "code\modules\mob\living\silicon\silicon.dm" -#include "code\modules\mob\living\silicon\silicon_defense.dm" -#include "code\modules\mob\living\silicon\subsystems.dm" -#include "code\modules\mob\living\silicon\ai\ai.dm" -#include "code\modules\mob\living\silicon\ai\ai_defense.dm" -#include "code\modules\mob\living\silicon\ai\death.dm" -#include "code\modules\mob\living\silicon\ai\examine.dm" -#include "code\modules\mob\living\silicon\ai\latejoin.dm" -#include "code\modules\mob\living\silicon\ai\laws.dm" -#include "code\modules\mob\living\silicon\ai\life.dm" -#include "code\modules\mob\living\silicon\ai\login.dm" -#include "code\modules\mob\living\silicon\ai\logout.dm" -#include "code\modules\mob\living\silicon\ai\multicam.dm" -#include "code\modules\mob\living\silicon\ai\say.dm" -#include "code\modules\mob\living\silicon\ai\update_status.dm" -#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" -#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" -#include "code\modules\mob\living\silicon\ai\freelook\eye.dm" -#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" -#include "code\modules\mob\living\silicon\decoy\death.dm" -#include "code\modules\mob\living\silicon\decoy\decoy.dm" -#include "code\modules\mob\living\silicon\decoy\life.dm" -#include "code\modules\mob\living\silicon\pai\death.dm" -#include "code\modules\mob\living\silicon\pai\life.dm" -#include "code\modules\mob\living\silicon\pai\pai.dm" -#include "code\modules\mob\living\silicon\pai\personality.dm" -#include "code\modules\mob\living\silicon\pai\recruit.dm" -#include "code\modules\mob\living\silicon\pai\say.dm" -#include "code\modules\mob\living\silicon\pai\software.dm" -#include "code\modules\mob\living\silicon\pai\software_modules.dm" -#include "code\modules\mob\living\silicon\pai\update_status.dm" -#include "code\modules\mob\living\silicon\robot\component.dm" -#include "code\modules\mob\living\silicon\robot\death.dm" -#include "code\modules\mob\living\silicon\robot\emote.dm" -#include "code\modules\mob\living\silicon\robot\examine.dm" -#include "code\modules\mob\living\silicon\robot\inventory.dm" -#include "code\modules\mob\living\silicon\robot\laws.dm" -#include "code\modules\mob\living\silicon\robot\life.dm" -#include "code\modules\mob\living\silicon\robot\login.dm" -#include "code\modules\mob\living\silicon\robot\photos.dm" -#include "code\modules\mob\living\silicon\robot\robot.dm" -#include "code\modules\mob\living\silicon\robot\robot_damage.dm" -#include "code\modules\mob\living\silicon\robot\robot_defense.dm" -#include "code\modules\mob\living\silicon\robot\robot_items.dm" -#include "code\modules\mob\living\silicon\robot\robot_module_actions.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules.dm" -#include "code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "code\modules\mob\living\silicon\robot\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\update_status.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" -#include "code\modules\mob\living\silicon\robot\drone\update_status.dm" -#include "code\modules\mob\living\simple_animal\animal_defense.dm" -#include "code\modules\mob\living\simple_animal\constructs.dm" -#include "code\modules\mob\living\simple_animal\corpse.dm" -#include "code\modules\mob\living\simple_animal\parrot.dm" -#include "code\modules\mob\living\simple_animal\posessed_object.dm" -#include "code\modules\mob\living\simple_animal\powers.dm" -#include "code\modules\mob\living\simple_animal\shade.dm" -#include "code\modules\mob\living\simple_animal\simple_animal.dm" -#include "code\modules\mob\living\simple_animal\spawner.dm" -#include "code\modules\mob\living\simple_animal\tribbles.dm" -#include "code\modules\mob\living\simple_animal\bot\bot.dm" -#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" -#include "code\modules\mob\living\simple_animal\bot\construction.dm" -#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm" -#include "code\modules\mob\living\simple_animal\bot\emote.dm" -#include "code\modules\mob\living\simple_animal\bot\floorbot.dm" -#include "code\modules\mob\living\simple_animal\bot\griefsky.dm" -#include "code\modules\mob\living\simple_animal\bot\honkbot.dm" -#include "code\modules\mob\living\simple_animal\bot\medbot.dm" -#include "code\modules\mob\living\simple_animal\bot\mulebot.dm" -#include "code\modules\mob\living\simple_animal\bot\secbot.dm" -#include "code\modules\mob\living\simple_animal\bot\syndicate.dm" -#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" -#include "code\modules\mob\living\simple_animal\friendly\cat.dm" -#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" -#include "code\modules\mob\living\simple_animal\friendly\corgi.dm" -#include "code\modules\mob\living\simple_animal\friendly\corgi_powers.dm" -#include "code\modules\mob\living\simple_animal\friendly\crab.dm" -#include "code\modules\mob\living\simple_animal\friendly\deer.dm" -#include "code\modules\mob\living\simple_animal\friendly\diona.dm" -#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" -#include "code\modules\mob\living\simple_animal\friendly\fox.dm" -#include "code\modules\mob\living\simple_animal\friendly\lizard.dm" -#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" -#include "code\modules\mob\living\simple_animal\friendly\penguin.dm" -#include "code\modules\mob\living\simple_animal\friendly\pet.dm" -#include "code\modules\mob\living\simple_animal\friendly\pug.dm" -#include "code\modules\mob\living\simple_animal\friendly\slime.dm" -#include "code\modules\mob\living\simple_animal\friendly\sloth.dm" -#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" -#include "code\modules\mob\living\simple_animal\hostile\alien.dm" -#include "code\modules\mob\living\simple_animal\hostile\bat.dm" -#include "code\modules\mob\living\simple_animal\hostile\bear.dm" -#include "code\modules\mob\living\simple_animal\hostile\bees.dm" -#include "code\modules\mob\living\simple_animal\hostile\carp.dm" -#include "code\modules\mob\living\simple_animal\hostile\creature.dm" -#include "code\modules\mob\living\simple_animal\hostile\deathsquid.dm" -#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" -#include "code\modules\mob\living\simple_animal\hostile\feral_cat.dm" -#include "code\modules\mob\living\simple_animal\hostile\floorcluwne.dm" -#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" -#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" -#include "code\modules\mob\living\simple_animal\hostile\hellhound.dm" -#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" -#include "code\modules\mob\living\simple_animal\hostile\hostile.dm" -#include "code\modules\mob\living\simple_animal\hostile\illusion.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle_animals.dm" -#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" -#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" -#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" -#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" -#include "code\modules\mob\living\simple_animal\hostile\russian.dm" -#include "code\modules\mob\living\simple_animal\hostile\spaceworms.dm" -#include "code\modules\mob\living\simple_animal\hostile\statue.dm" -#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" -#include "code\modules\mob\living\simple_animal\hostile\tree.dm" -#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" -#include "code\modules\mob\living\simple_animal\hostile\winter_mobs.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\basilisk.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\goldgrub.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\goliath.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\gutlunch.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\hivelord.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\mining.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\necropolis_tendril.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\fish.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\kangaroo.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\pet.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\undead.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\__defines.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\actions.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\black.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\brown.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\chem.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\empress.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\ghost.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\gray.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\green.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\hive.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\mother.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\prince.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\princess.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\purple.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\queen.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\red.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\reproduction.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_ai.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_spiders.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\white.dm" -#include "code\modules\mob\new_player\login.dm" -#include "code\modules\mob\new_player\logout.dm" -#include "code\modules\mob\new_player\new_player.dm" -#include "code\modules\mob\new_player\poll.dm" -#include "code\modules\mob\new_player\preferences_setup.dm" -#include "code\modules\mob\new_player\sprite_accessories\sprite_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\diona\diona_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\drask\drask_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\grey\grey_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\human\human_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\human\human_facial_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\human\human_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_face.dm" -#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_head_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_optics.dm" -#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_head_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_head_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\nucleation\nucleation_face.dm" -#include "code\modules\mob\new_player\sprite_accessories\skrell\skrell_face.dm" -#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_facial_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_head_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_head_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_alt_heads.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_facial_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_head_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_head_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\vox\vox_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\vox\vox_facial_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\vox\vox_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\vox\vox_tail_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_facial_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_head_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_head_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_tail_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\wryn\wryn_face.dm" -#include "code\modules\modular_computers\laptop_vendor.dm" -#include "code\modules\modular_computers\computers\item\computer.dm" -#include "code\modules\modular_computers\computers\item\computer_components.dm" -#include "code\modules\modular_computers\computers\item\computer_damage.dm" -#include "code\modules\modular_computers\computers\item\computer_power.dm" -#include "code\modules\modular_computers\computers\item\computer_ui.dm" -#include "code\modules\modular_computers\computers\item\laptop.dm" -#include "code\modules\modular_computers\computers\item\laptop_presets.dm" -#include "code\modules\modular_computers\computers\item\processor.dm" -#include "code\modules\modular_computers\computers\item\tablet.dm" -#include "code\modules\modular_computers\computers\item\tablet_presets.dm" -#include "code\modules\modular_computers\computers\machinery\console_presets.dm" -#include "code\modules\modular_computers\computers\machinery\modular_computer.dm" -#include "code\modules\modular_computers\computers\machinery\modular_console.dm" -#include "code\modules\modular_computers\file_system\computer_file.dm" -#include "code\modules\modular_computers\file_system\data.dm" -#include "code\modules\modular_computers\file_system\program.dm" -#include "code\modules\modular_computers\file_system\program_events.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" -#include "code\modules\modular_computers\file_system\programs\command\card.dm" -#include "code\modules\modular_computers\file_system\programs\command\comms.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\alarm.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\sm_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" -#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" -#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" -#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" -#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" -#include "code\modules\modular_computers\file_system\programs\research\airestorer.dm" -#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" -#include "code\modules\modular_computers\hardware\_hardware.dm" -#include "code\modules\modular_computers\hardware\ai_slot.dm" -#include "code\modules\modular_computers\hardware\battery_module.dm" -#include "code\modules\modular_computers\hardware\card_slot.dm" -#include "code\modules\modular_computers\hardware\CPU.dm" -#include "code\modules\modular_computers\hardware\hard_drive.dm" -#include "code\modules\modular_computers\hardware\network_card.dm" -#include "code\modules\modular_computers\hardware\portable_disk.dm" -#include "code\modules\modular_computers\hardware\printer.dm" -#include "code\modules\modular_computers\hardware\recharger.dm" -#include "code\modules\modular_computers\NTNet\NTNet.dm" -#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" -#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" -#include "code\modules\nano\nanoexternal.dm" -#include "code\modules\nano\nanomapgen.dm" -#include "code\modules\nano\nanoui.dm" -#include "code\modules\nano\subsystem.dm" -#include "code\modules\nano\interaction\admin.dm" -#include "code\modules\nano\interaction\base.dm" -#include "code\modules\nano\interaction\conscious.dm" -#include "code\modules\nano\interaction\contained.dm" -#include "code\modules\nano\interaction\default.dm" -#include "code\modules\nano\interaction\ghost.dm" -#include "code\modules\nano\interaction\inventory.dm" -#include "code\modules\nano\interaction\inventory_deep.dm" -#include "code\modules\nano\interaction\not_incapacitated.dm" -#include "code\modules\nano\interaction\physical.dm" -#include "code\modules\nano\interaction\self.dm" -#include "code\modules\nano\interaction\zlevel.dm" -#include "code\modules\nano\modules\alarm_monitor.dm" -#include "code\modules\nano\modules\atmos_control.dm" -#include "code\modules\nano\modules\crew_monitor.dm" -#include "code\modules\nano\modules\ert_manager.dm" -#include "code\modules\nano\modules\human_appearance.dm" -#include "code\modules\nano\modules\law_manager.dm" -#include "code\modules\nano\modules\nano_module.dm" -#include "code\modules\nano\modules\power_monitor.dm" -#include "code\modules\ninja\energy_katana.dm" -#include "code\modules\ninja\suit\gloves.dm" -#include "code\modules\ninja\suit\head.dm" -#include "code\modules\ninja\suit\mask.dm" -#include "code\modules\ninja\suit\shoes.dm" -#include "code\modules\ninja\suit\suit.dm" -#include "code\modules\ninja\suit\suit_initialisation.dm" -#include "code\modules\paperwork\carbonpaper.dm" -#include "code\modules\paperwork\clipboard.dm" -#include "code\modules\paperwork\contract.dm" -#include "code\modules\paperwork\fax.dm" -#include "code\modules\paperwork\faxmachine.dm" -#include "code\modules\paperwork\filingcabinet.dm" -#include "code\modules\paperwork\folders.dm" -#include "code\modules\paperwork\frames.dm" -#include "code\modules\paperwork\handlabeler.dm" -#include "code\modules\paperwork\paper.dm" -#include "code\modules\paperwork\paper_bundle.dm" -#include "code\modules\paperwork\paperbin.dm" -#include "code\modules\paperwork\paperplane.dm" -#include "code\modules\paperwork\pen.dm" -#include "code\modules\paperwork\photocopier.dm" -#include "code\modules\paperwork\photography.dm" -#include "code\modules\paperwork\silicon_photography.dm" -#include "code\modules\paperwork\stamps.dm" -#include "code\modules\pda\ai.dm" -#include "code\modules\pda\app.dm" -#include "code\modules\pda\cart.dm" -#include "code\modules\pda\cart_apps.dm" -#include "code\modules\pda\core_apps.dm" -#include "code\modules\pda\messenger.dm" -#include "code\modules\pda\messenger_plugins.dm" -#include "code\modules\pda\mob_hunt_game_app.dm" -#include "code\modules\pda\PDA.dm" -#include "code\modules\pda\pdas.dm" -#include "code\modules\pda\radio.dm" -#include "code\modules\pda\utilities.dm" -#include "code\modules\persistence\persistence.dm" -#include "code\modules\power\apc.dm" -#include "code\modules\power\cable.dm" -#include "code\modules\power\cable_heavyduty.dm" -#include "code\modules\power\cable_logic.dm" -#include "code\modules\power\cell.dm" -#include "code\modules\power\generator.dm" -#include "code\modules\power\gravitygenerator.dm" -#include "code\modules\power\lighting.dm" -#include "code\modules\power\port_gen.dm" -#include "code\modules\power\power.dm" -#include "code\modules\power\powernet.dm" -#include "code\modules\power\smes.dm" -#include "code\modules\power\solar.dm" -#include "code\modules\power\terminal.dm" -#include "code\modules\power\tracker.dm" -#include "code\modules\power\treadmill.dm" -#include "code\modules\power\turbine.dm" -#include "code\modules\power\singularity\collector.dm" -#include "code\modules\power\singularity\containment_field.dm" -#include "code\modules\power\singularity\emitter.dm" -#include "code\modules\power\singularity\field_generator.dm" -#include "code\modules\power\singularity\generator.dm" -#include "code\modules\power\singularity\investigate.dm" -#include "code\modules\power\singularity\narsie.dm" -#include "code\modules\power\singularity\singularity.dm" -#include "code\modules\power\singularity\particle_accelerator\particle.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" -#include "code\modules\power\supermatter\supermatter.dm" -#include "code\modules\power\tesla\coil.dm" -#include "code\modules\power\tesla\energy_ball.dm" -#include "code\modules\power\tesla\generator.dm" -#include "code\modules\procedural_mapping\mapGenerator.dm" -#include "code\modules\procedural_mapping\mapGeneratorModule.dm" -#include "code\modules\procedural_mapping\mapGeneratorReadme.dm" -#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm" -#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm" -#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" -#include "code\modules\procedural_mapping\mapGenerators\nature.dm" -#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" -#include "code\modules\projectiles\ammunition.dm" -#include "code\modules\projectiles\firing.dm" -#include "code\modules\projectiles\gun.dm" -#include "code\modules\projectiles\gun_attachments.dm" -#include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\ammo_casings.dm" -#include "code\modules\projectiles\ammunition\boxes.dm" -#include "code\modules\projectiles\ammunition\energy.dm" -#include "code\modules\projectiles\ammunition\magazines.dm" -#include "code\modules\projectiles\ammunition\special.dm" -#include "code\modules\projectiles\guns\alien.dm" -#include "code\modules\projectiles\guns\dartgun.dm" -#include "code\modules\projectiles\guns\energy.dm" -#include "code\modules\projectiles\guns\grenade_launcher.dm" -#include "code\modules\projectiles\guns\magic.dm" -#include "code\modules\projectiles\guns\medbeam.dm" -#include "code\modules\projectiles\guns\mounted.dm" -#include "code\modules\projectiles\guns\projectile.dm" -#include "code\modules\projectiles\guns\rocket.dm" -#include "code\modules\projectiles\guns\syringe_gun.dm" -#include "code\modules\projectiles\guns\throw.dm" -#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" -#include "code\modules\projectiles\guns\energy\laser.dm" -#include "code\modules\projectiles\guns\energy\nuclear.dm" -#include "code\modules\projectiles\guns\energy\pulse.dm" -#include "code\modules\projectiles\guns\energy\special.dm" -#include "code\modules\projectiles\guns\energy\stun.dm" -#include "code\modules\projectiles\guns\energy\telegun.dm" -#include "code\modules\projectiles\guns\magic\staff.dm" -#include "code\modules\projectiles\guns\magic\wand.dm" -#include "code\modules\projectiles\guns\misc\blastcannon.dm" -#include "code\modules\projectiles\guns\projectile\automatic.dm" -#include "code\modules\projectiles\guns\projectile\bow.dm" -#include "code\modules\projectiles\guns\projectile\launchers.dm" -#include "code\modules\projectiles\guns\projectile\pistol.dm" -#include "code\modules\projectiles\guns\projectile\revolver.dm" -#include "code\modules\projectiles\guns\projectile\saw.dm" -#include "code\modules\projectiles\guns\projectile\shotgun.dm" -#include "code\modules\projectiles\guns\projectile\sniper.dm" -#include "code\modules\projectiles\guns\projectile\toy.dm" -#include "code\modules\projectiles\guns\throw\crossbow.dm" -#include "code\modules\projectiles\guns\throw\pielauncher.dm" -#include "code\modules\projectiles\projectile\beams.dm" -#include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\energy.dm" -#include "code\modules\projectiles\projectile\force.dm" -#include "code\modules\projectiles\projectile\magic.dm" -#include "code\modules\projectiles\projectile\reusable.dm" -#include "code\modules\projectiles\projectile\special.dm" -#include "code\modules\reagents\chem_splash.dm" -#include "code\modules\reagents\reagent_containers.dm" -#include "code\modules\reagents\reagent_dispenser.dm" -#include "code\modules\reagents\chemistry\colors.dm" -#include "code\modules\reagents\chemistry\holder.dm" -#include "code\modules\reagents\chemistry\readme.dm" -#include "code\modules\reagents\chemistry\reagents.dm" -#include "code\modules\reagents\chemistry\recipes.dm" -#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" -#include "code\modules\reagents\chemistry\machinery\chem_heater.dm" -#include "code\modules\reagents\chemistry\machinery\chem_master.dm" -#include "code\modules\reagents\chemistry\machinery\pandemic.dm" -#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" -#include "code\modules\reagents\chemistry\reagents\admin.dm" -#include "code\modules\reagents\chemistry\reagents\alcohol.dm" -#include "code\modules\reagents\chemistry\reagents\blob.dm" -#include "code\modules\reagents\chemistry\reagents\disease.dm" -#include "code\modules\reagents\chemistry\reagents\drink_base.dm" -#include "code\modules\reagents\chemistry\reagents\drink_cold.dm" -#include "code\modules\reagents\chemistry\reagents\drinks.dm" -#include "code\modules\reagents\chemistry\reagents\drugs.dm" -#include "code\modules\reagents\chemistry\reagents\food.dm" -#include "code\modules\reagents\chemistry\reagents\medicine.dm" -#include "code\modules\reagents\chemistry\reagents\misc.dm" -#include "code\modules\reagents\chemistry\reagents\paint.dm" -#include "code\modules\reagents\chemistry\reagents\paradise_pop.dm" -#include "code\modules\reagents\chemistry\reagents\pyrotechnic.dm" -#include "code\modules\reagents\chemistry\reagents\toxins.dm" -#include "code\modules\reagents\chemistry\reagents\water.dm" -#include "code\modules\reagents\chemistry\recipes\drinks.dm" -#include "code\modules\reagents\chemistry\recipes\drugs.dm" -#include "code\modules\reagents\chemistry\recipes\food.dm" -#include "code\modules\reagents\chemistry\recipes\medicine.dm" -#include "code\modules\reagents\chemistry\recipes\others.dm" -#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" -#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" -#include "code\modules\reagents\chemistry\recipes\toxins.dm" -#include "code\modules\reagents\reagent_containers\borghydro.dm" -#include "code\modules\reagents\reagent_containers\bottle.dm" -#include "code\modules\reagents\reagent_containers\dropper.dm" -#include "code\modules\reagents\reagent_containers\glass_containers.dm" -#include "code\modules\reagents\reagent_containers\hypospray.dm" -#include "code\modules\reagents\reagent_containers\iv_bag.dm" -#include "code\modules\reagents\reagent_containers\patch.dm" -#include "code\modules\reagents\reagent_containers\pill.dm" -#include "code\modules\reagents\reagent_containers\spray.dm" -#include "code\modules\reagents\reagent_containers\syringes.dm" -#include "code\modules\recycling\belt-placer.dm" -#include "code\modules\recycling\conveyor2.dm" -#include "code\modules\recycling\disposal-construction.dm" -#include "code\modules\recycling\disposal.dm" -#include "code\modules\recycling\sortingmachinery.dm" -#include "code\modules\research\circuitprinter.dm" -#include "code\modules\research\designs.dm" -#include "code\modules\research\destructive_analyzer.dm" -#include "code\modules\research\experimentor.dm" -#include "code\modules\research\message_server.dm" -#include "code\modules\research\protolathe.dm" -#include "code\modules\research\rd-readme.dm" -#include "code\modules\research\rdconsole.dm" -#include "code\modules\research\rdmachines.dm" -#include "code\modules\research\research.dm" -#include "code\modules\research\server.dm" -#include "code\modules\research\designs\AI_module_designs.dm" -#include "code\modules\research\designs\autolathe_designs.dm" -#include "code\modules\research\designs\biogenerator_designs.dm" -#include "code\modules\research\designs\bluespace_designs.dm" -#include "code\modules\research\designs\comp_board_designs.dm" -#include "code\modules\research\designs\computer_part_designs.dm" -#include "code\modules\research\designs\equipment_designs.dm" -#include "code\modules\research\designs\janitorial_designs.dm" -#include "code\modules\research\designs\machine_designs.dm" -#include "code\modules\research\designs\mecha_designs.dm" -#include "code\modules\research\designs\mechfabricator_designs.dm" -#include "code\modules\research\designs\medical_designs.dm" -#include "code\modules\research\designs\mining_designs.dm" -#include "code\modules\research\designs\misc_designs.dm" -#include "code\modules\research\designs\power_designs.dm" -#include "code\modules\research\designs\smelting_designs.dm" -#include "code\modules\research\designs\spacepod_designs.dm" -#include "code\modules\research\designs\stock_parts_designs.dm" -#include "code\modules\research\designs\telecomms_designs.dm" -#include "code\modules\research\designs\weapon_designs.dm" -#include "code\modules\research\xenobiology\xenobio_camera.dm" -#include "code\modules\research\xenobiology\xenobiology.dm" -#include "code\modules\response_team\ert.dm" -#include "code\modules\response_team\ert_outfits.dm" -#include "code\modules\ruins\ruin_areas.dm" -#include "code\modules\ruins\lavalandruin_code\animal_hospital.dm" -#include "code\modules\ruins\lavalandruin_code\ash_walker_den.dm" -#include "code\modules\ruins\lavalandruin_code\hermit.dm" -#include "code\modules\ruins\lavalandruin_code\seed_vault.dm" -#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm" -#include "code\modules\ruins\objects_and_mobs\gym.dm" -#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm" -#include "code\modules\security_levels\keycard authentication.dm" -#include "code\modules\security_levels\security levels.dm" -#include "code\modules\shuttle\assault_pod.dm" -#include "code\modules\shuttle\emergency.dm" -#include "code\modules\shuttle\ert.dm" -#include "code\modules\shuttle\navigation_computer.dm" -#include "code\modules\shuttle\on_move.dm" -#include "code\modules\shuttle\ripple.dm" -#include "code\modules\shuttle\shuttle.dm" -#include "code\modules\shuttle\shuttle_manipulator.dm" -#include "code\modules\shuttle\shuttle_rotate.dm" -#include "code\modules\shuttle\supply.dm" -#include "code\modules\shuttle\syndicate.dm" -#include "code\modules\shuttle\vox.dm" -#include "code\modules\space_management\heap_space_level.dm" -#include "code\modules\space_management\level_check.dm" -#include "code\modules\space_management\level_traits.dm" -#include "code\modules\space_management\space_chunk.dm" -#include "code\modules\space_management\space_level.dm" -#include "code\modules\space_management\space_transition.dm" -#include "code\modules\space_management\zlevel_manager.dm" -#include "code\modules\spacepods\construction.dm" -#include "code\modules\spacepods\equipment.dm" -#include "code\modules\spacepods\lock_buster.dm" -#include "code\modules\spacepods\parts.dm" -#include "code\modules\spacepods\spacepod.dm" -#include "code\modules\station_goals\bsa.dm" -#include "code\modules\station_goals\dna_vault.dm" -#include "code\modules\station_goals\shield.dm" -#include "code\modules\station_goals\station_goal.dm" -#include "code\modules\store\items.dm" -#include "code\modules\store\store.dm" -#include "code\modules\surgery\bones.dm" -#include "code\modules\surgery\cavity_implant.dm" -#include "code\modules\surgery\dental_implant.dm" -#include "code\modules\surgery\encased.dm" -#include "code\modules\surgery\generic.dm" -#include "code\modules\surgery\helpers.dm" -#include "code\modules\surgery\implant_removal.dm" -#include "code\modules\surgery\limb_augmentation.dm" -#include "code\modules\surgery\limb_reattach.dm" -#include "code\modules\surgery\organs_internal.dm" -#include "code\modules\surgery\other.dm" -#include "code\modules\surgery\plastic_surgery.dm" -#include "code\modules\surgery\remove_embedded_object.dm" -#include "code\modules\surgery\rig_removal.dm" -#include "code\modules\surgery\robotics.dm" -#include "code\modules\surgery\slime.dm" -#include "code\modules\surgery\surgery.dm" -#include "code\modules\surgery\tools.dm" -#include "code\modules\surgery\organs\augments_arms.dm" -#include "code\modules\surgery\organs\augments_eyes.dm" -#include "code\modules\surgery\organs\augments_internal.dm" -#include "code\modules\surgery\organs\autoimplanter.dm" -#include "code\modules\surgery\organs\blood.dm" -#include "code\modules\surgery\organs\body_egg.dm" -#include "code\modules\surgery\organs\ears.dm" -#include "code\modules\surgery\organs\eyes.dm" -#include "code\modules\surgery\organs\heart.dm" -#include "code\modules\surgery\organs\helpers.dm" -#include "code\modules\surgery\organs\kidneys.dm" -#include "code\modules\surgery\organs\liver.dm" -#include "code\modules\surgery\organs\lungs.dm" -#include "code\modules\surgery\organs\mmi_holder.dm" -#include "code\modules\surgery\organs\organ.dm" -#include "code\modules\surgery\organs\organ_external.dm" -#include "code\modules\surgery\organs\organ_icon.dm" -#include "code\modules\surgery\organs\organ_internal.dm" -#include "code\modules\surgery\organs\pain.dm" -#include "code\modules\surgery\organs\parasites.dm" -#include "code\modules\surgery\organs\robolimbs.dm" -#include "code\modules\surgery\organs\skeleton.dm" -#include "code\modules\surgery\organs\vocal_cords.dm" -#include "code\modules\surgery\organs\subtypes\abductor.dm" -#include "code\modules\surgery\organs\subtypes\diona.dm" -#include "code\modules\surgery\organs\subtypes\drask.dm" -#include "code\modules\surgery\organs\subtypes\grey.dm" -#include "code\modules\surgery\organs\subtypes\kidan.dm" -#include "code\modules\surgery\organs\subtypes\machine.dm" -#include "code\modules\surgery\organs\subtypes\nucleation.dm" -#include "code\modules\surgery\organs\subtypes\plasmaman.dm" -#include "code\modules\surgery\organs\subtypes\shadow.dm" -#include "code\modules\surgery\organs\subtypes\skrell.dm" -#include "code\modules\surgery\organs\subtypes\standard.dm" -#include "code\modules\surgery\organs\subtypes\tajaran.dm" -#include "code\modules\surgery\organs\subtypes\unathi.dm" -#include "code\modules\surgery\organs\subtypes\unbreakable.dm" -#include "code\modules\surgery\organs\subtypes\vox.dm" -#include "code\modules\surgery\organs\subtypes\vulpkanin.dm" -#include "code\modules\surgery\organs\subtypes\wryn.dm" -#include "code\modules\surgery\organs\subtypes\xenos.dm" -#include "code\modules\telesci\bscrystal.dm" -#include "code\modules\telesci\gps.dm" -#include "code\modules\telesci\telepad.dm" -#include "code\modules\telesci\telesci_computer.dm" -#include "code\modules\tooltip\tooltip.dm" -#include "code\modules\tram\tram.dm" -#include "code\modules\tram\tram_control_pad.dm" -#include "code\modules\tram\tram_floor.dm" -#include "code\modules\tram\tram_rail.dm" -#include "code\modules\tram\tram_wall.dm" -#include "code\modules\vehicle\ambulance.dm" -#include "code\modules\vehicle\atv.dm" -#include "code\modules\vehicle\janicart.dm" -#include "code\modules\vehicle\motorcycle.dm" -#include "code\modules\vehicle\secway.dm" -#include "code\modules\vehicle\snowmobile.dm" -#include "code\modules\vehicle\speedbike.dm" -#include "code\modules\vehicle\sportscar.dm" -#include "code\modules\vehicle\vehicle.dm" -#include "code\modules\vr\vr_avatar.dm" -#include "code\modules\vr\vr_controller.dm" -#include "code\modules\vr\vr_goggles.dm" -#include "code\modules\vr\vr_outfits.dm" -#include "goon\code\datums\browserOutput.dm" -#include "interface\interface.dm" -#include "interface\skin.dmf" -// END_INCLUDE +// DM Environment file for paradise.dme. +// All manual changes should be made outside the BEGIN_ and END_ blocks. + // New source code should be placed in .dm files: choose File/New --> Code File. +// BEGIN_INTERNALS +// END_INTERNALS +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR +// BEGIN_PREFERENCES +#define DEBUG +// END_PREFERENCES +// BEGIN_INCLUDE +#include "_maps\__MAP_DEFINES.dm" +#include "_maps\cyberiad.dm" +#include "code\_compile_options.dm" +#include "code\hub.dm" +#include "code\world.dm" +#include "code\__DEFINES\_globals.dm" +#include "code\__DEFINES\_readme.dm" +#include "code\__DEFINES\_tick.dm" +#include "code\__DEFINES\admin.dm" +#include "code\__DEFINES\antagonists.dm" +#include "code\__DEFINES\atmospherics.dm" +#include "code\__DEFINES\bots.dm" +#include "code\__DEFINES\callbacks.dm" +#include "code\__DEFINES\clothing.dm" +#include "code\__DEFINES\colors.dm" +#include "code\__DEFINES\combat.dm" +#include "code\__DEFINES\components.dm" +#include "code\__DEFINES\construction.dm" +#include "code\__DEFINES\contracts.dm" +#include "code\__DEFINES\crafting.dm" +#include "code\__DEFINES\error_handler.dm" +#include "code\__DEFINES\flags.dm" +#include "code\__DEFINES\game.dm" +#include "code\__DEFINES\gamemode.dm" +#include "code\__DEFINES\genetics.dm" +#include "code\__DEFINES\hud.dm" +#include "code\__DEFINES\hydroponics.dm" +#include "code\__DEFINES\inventory.dm" +#include "code\__DEFINES\is_helpers.dm" +#include "code\__DEFINES\language.dm" +#include "code\__DEFINES\layers.dm" +#include "code\__DEFINES\lighting.dm" +#include "code\__DEFINES\machines.dm" +#include "code\__DEFINES\math.dm" +#include "code\__DEFINES\MC.dm" +#include "code\__DEFINES\medal.dm" +#include "code\__DEFINES\misc.dm" +#include "code\__DEFINES\mobs.dm" +#include "code\__DEFINES\move_force.dm" +#include "code\__DEFINES\pda.dm" +#include "code\__DEFINES\pipes.dm" +#include "code\__DEFINES\preferences.dm" +#include "code\__DEFINES\qdel.dm" +#include "code\__DEFINES\radio.dm" +#include "code\__DEFINES\reagents.dm" +#include "code\__DEFINES\role_preferences.dm" +#include "code\__DEFINES\rolebans.dm" +#include "code\__DEFINES\shuttle.dm" +#include "code\__DEFINES\sight.dm" +#include "code\__DEFINES\sound.dm" +#include "code\__DEFINES\stat.dm" +#include "code\__DEFINES\station_goals.dm" +#include "code\__DEFINES\status_effects.dm" +#include "code\__DEFINES\subsystems.dm" +#include "code\__DEFINES\typeids.dm" +#include "code\__DEFINES\vv.dm" +#include "code\__DEFINES\zlevel.dm" +#include "code\__HELPERS\_logging.dm" +#include "code\__HELPERS\_string_lists.dm" +#include "code\__HELPERS\AnimationLibrary.dm" +#include "code\__HELPERS\cmp.dm" +#include "code\__HELPERS\constants.dm" +#include "code\__HELPERS\experimental.dm" +#include "code\__HELPERS\files.dm" +#include "code\__HELPERS\game.dm" +#include "code\__HELPERS\global_lists.dm" +#include "code\__HELPERS\icon_smoothing.dm" +#include "code\__HELPERS\icons.dm" +#include "code\__HELPERS\lists.dm" +#include "code\__HELPERS\maths.dm" +#include "code\__HELPERS\matrices.dm" +#include "code\__HELPERS\mobs.dm" +#include "code\__HELPERS\names.dm" +#include "code\__HELPERS\pronouns.dm" +#include "code\__HELPERS\qdel.dm" +#include "code\__HELPERS\sanitize_values.dm" +#include "code\__HELPERS\text.dm" +#include "code\__HELPERS\time.dm" +#include "code\__HELPERS\type2type.dm" +#include "code\__HELPERS\unique_ids.dm" +#include "code\__HELPERS\unsorted.dm" +#include "code\__HELPERS\sorts\__main.dm" +#include "code\__HELPERS\sorts\InsertSort.dm" +#include "code\__HELPERS\sorts\MergeSort.dm" +#include "code\__HELPERS\sorts\TimSort.dm" +#include "code\_DATASTRUCTURES\heap.dm" +#include "code\_DATASTRUCTURES\stacks.dm" +#include "code\_globalvars\configuration.dm" +#include "code\_globalvars\database.dm" +#include "code\_globalvars\game_modes.dm" +#include "code\_globalvars\genetics.dm" +#include "code\_globalvars\logging.dm" +#include "code\_globalvars\mapping.dm" +#include "code\_globalvars\misc.dm" +#include "code\_globalvars\unused.dm" +#include "code\_globalvars\lists\flavor_misc.dm" +#include "code\_globalvars\lists\fortunes.dm" +#include "code\_globalvars\lists\misc.dm" +#include "code\_globalvars\lists\mobs.dm" +#include "code\_globalvars\lists\names.dm" +#include "code\_globalvars\lists\objects.dm" +#include "code\_globalvars\lists\reagents.dm" +#include "code\_globalvars\lists\typecache.dm" +#include "code\_onclick\adjacent.dm" +#include "code\_onclick\ai.dm" +#include "code\_onclick\click.dm" +#include "code\_onclick\click_override.dm" +#include "code\_onclick\cyborg.dm" +#include "code\_onclick\drag_drop.dm" +#include "code\_onclick\item_attack.dm" +#include "code\_onclick\observer.dm" +#include "code\_onclick\other_mobs.dm" +#include "code\_onclick\overmind.dm" +#include "code\_onclick\rig.dm" +#include "code\_onclick\telekinesis.dm" +#include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\action_button.dm" +#include "code\_onclick\hud\ai.dm" +#include "code\_onclick\hud\alert.dm" +#include "code\_onclick\hud\alien.dm" +#include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\blob_overmind.dm" +#include "code\_onclick\hud\bot.dm" +#include "code\_onclick\hud\constructs.dm" +#include "code\_onclick\hud\devil.dm" +#include "code\_onclick\hud\fullscreen.dm" +#include "code\_onclick\hud\ghost.dm" +#include "code\_onclick\hud\guardian.dm" +#include "code\_onclick\hud\hud.dm" +#include "code\_onclick\hud\human.dm" +#include "code\_onclick\hud\monkey.dm" +#include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\other_mobs.dm" +#include "code\_onclick\hud\picture_in_picture.dm" +#include "code\_onclick\hud\plane_master.dm" +#include "code\_onclick\hud\radial.dm" +#include "code\_onclick\hud\robot.dm" +#include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\swarmer.dm" +#include "code\ATMOSPHERICS\atmospherics.dm" +#include "code\ATMOSPHERICS\datum_icon_manager.dm" +#include "code\ATMOSPHERICS\datum_pipeline.dm" +#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" +#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" +#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" +#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\valve.dm" +#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" +#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" +#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" +#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\tvalve.dm" +#include "code\ATMOSPHERICS\components\unary_devices\cold_sink.dm" +#include "code\ATMOSPHERICS\components\unary_devices\generator_input.dm" +#include "code\ATMOSPHERICS\components\unary_devices\heat_exchanger.dm" +#include "code\ATMOSPHERICS\components\unary_devices\heat_source.dm" +#include "code\ATMOSPHERICS\components\unary_devices\outlet_injector.dm" +#include "code\ATMOSPHERICS\components\unary_devices\oxygen_generator.dm" +#include "code\ATMOSPHERICS\components\unary_devices\passive_vent.dm" +#include "code\ATMOSPHERICS\components\unary_devices\portables_connector.dm" +#include "code\ATMOSPHERICS\components\unary_devices\tank.dm" +#include "code\ATMOSPHERICS\components\unary_devices\thermal_plate.dm" +#include "code\ATMOSPHERICS\components\unary_devices\unary_base.dm" +#include "code\ATMOSPHERICS\components\unary_devices\vent_pump.dm" +#include "code\ATMOSPHERICS\components\unary_devices\vent_scrubber.dm" +#include "code\ATMOSPHERICS\pipes\cap.dm" +#include "code\ATMOSPHERICS\pipes\manifold.dm" +#include "code\ATMOSPHERICS\pipes\manifold4w.dm" +#include "code\ATMOSPHERICS\pipes\pipe.dm" +#include "code\ATMOSPHERICS\pipes\simple\pipe_simple.dm" +#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_he.dm" +#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_hidden.dm" +#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_insulated.dm" +#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_visible.dm" +#include "code\controllers\configuration.dm" +#include "code\controllers\controller.dm" +#include "code\controllers\failsafe.dm" +#include "code\controllers\globals.dm" +#include "code\controllers\hooks-defs.dm" +#include "code\controllers\hooks.dm" +#include "code\controllers\master.dm" +#include "code\controllers\subsystem.dm" +#include "code\controllers\verbs.dm" +#include "code\controllers\subsystem\afk.dm" +#include "code\controllers\subsystem\air.dm" +#include "code\controllers\subsystem\alarm.dm" +#include "code\controllers\subsystem\assets.dm" +#include "code\controllers\subsystem\atoms.dm" +#include "code\controllers\subsystem\events.dm" +#include "code\controllers\subsystem\fires.dm" +#include "code\controllers\subsystem\garbage.dm" +#include "code\controllers\subsystem\holiday.dm" +#include "code\controllers\subsystem\icon_smooth.dm" +#include "code\controllers\subsystem\idlenpcpool.dm" +#include "code\controllers\subsystem\input.dm" +#include "code\controllers\subsystem\ipintel.dm" +#include "code\controllers\subsystem\jobs.dm" +#include "code\controllers\subsystem\lighting.dm" +#include "code\controllers\subsystem\machinery.dm" +#include "code\controllers\subsystem\mapping.dm" +#include "code\controllers\subsystem\medals.dm" +#include "code\controllers\subsystem\mobs.dm" +#include "code\controllers\subsystem\nano_mob_hunter.dm" +#include "code\controllers\subsystem\nanoui.dm" +#include "code\controllers\subsystem\nightshift.dm" +#include "code\controllers\subsystem\npcpool.dm" +#include "code\controllers\subsystem\overlays.dm" +#include "code\controllers\subsystem\radio.dm" +#include "code\controllers\subsystem\shuttles.dm" +#include "code\controllers\subsystem\spacedrift.dm" +#include "code\controllers\subsystem\sun.dm" +#include "code\controllers\subsystem\throwing.dm" +#include "code\controllers\subsystem\ticker.dm" +#include "code\controllers\subsystem\timer.dm" +#include "code\controllers\subsystem\vote.dm" +#include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\processing\fastprocess.dm" +#include "code\controllers\subsystem\processing\obj.dm" +#include "code\controllers\subsystem\processing\processing.dm" +#include "code\controllers\subsystem\tickets\mentor_tickets.dm" +#include "code\controllers\subsystem\tickets\tickets.dm" +#include "code\datums\action.dm" +#include "code\datums\ai_law_sets.dm" +#include "code\datums\ai_laws.dm" +#include "code\datums\beam.dm" +#include "code\datums\browser.dm" +#include "code\datums\callback.dm" +#include "code\datums\click_intercept.dm" +#include "code\datums\datacore.dm" +#include "code\datums\datum.dm" +#include "code\datums\datumvars.dm" +#include "code\datums\gas_mixture.dm" +#include "code\datums\holocall.dm" +#include "code\datums\hud.dm" +#include "code\datums\mind.dm" +#include "code\datums\mixed.dm" +#include "code\datums\mutable_appearance.dm" +#include "code\datums\periodic_news.dm" +#include "code\datums\pipe_datums.dm" +#include "code\datums\progressbar.dm" +#include "code\datums\radio.dm" +#include "code\datums\recipe.dm" +#include "code\datums\ruins.dm" +#include "code\datums\shuttles.dm" +#include "code\datums\soullink.dm" +#include "code\datums\spawners_menu.dm" +#include "code\datums\spell.dm" +#include "code\datums\statclick.dm" +#include "code\datums\supplypacks.dm" +#include "code\datums\uplink_item.dm" +#include "code\datums\vision_override.dm" +#include "code\datums\vr.dm" +#include "code\datums\cache\air_alarm.dm" +#include "code\datums\cache\apc.dm" +#include "code\datums\cache\cache.dm" +#include "code\datums\cache\crew.dm" +#include "code\datums\cache\powermonitor.dm" +#include "code\datums\components\_component.dm" +#include "code\datums\components\decal.dm" +#include "code\datums\components\ducttape.dm" +#include "code\datums\components\jestosterone.dm" +#include "code\datums\components\material_container.dm" +#include "code\datums\components\squeak.dm" +#include "code\datums\diseases\_disease.dm" +#include "code\datums\diseases\_MobProcs.dm" +#include "code\datums\diseases\anxiety.dm" +#include "code\datums\diseases\appendicitis.dm" +#include "code\datums\diseases\beesease.dm" +#include "code\datums\diseases\berserker.dm" +#include "code\datums\diseases\brainrot.dm" +#include "code\datums\diseases\cold.dm" +#include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\critical.dm" +#include "code\datums\diseases\fake_gbs.dm" +#include "code\datums\diseases\flu.dm" +#include "code\datums\diseases\fluspanish.dm" +#include "code\datums\diseases\food_poisoning.dm" +#include "code\datums\diseases\gbs.dm" +#include "code\datums\diseases\kingstons.dm" +#include "code\datums\diseases\kuru.dm" +#include "code\datums\diseases\lycancoughy.dm" +#include "code\datums\diseases\magnitis.dm" +#include "code\datums\diseases\pierrot_throat.dm" +#include "code\datums\diseases\retrovirus.dm" +#include "code\datums\diseases\rhumba_beat.dm" +#include "code\datums\diseases\transformation.dm" +#include "code\datums\diseases\tuberculosis.dm" +#include "code\datums\diseases\vampire.dm" +#include "code\datums\diseases\wizarditis.dm" +#include "code\datums\diseases\advance\advance.dm" +#include "code\datums\diseases\advance\presets.dm" +#include "code\datums\diseases\advance\symptoms\beard.dm" +#include "code\datums\diseases\advance\symptoms\choking.dm" +#include "code\datums\diseases\advance\symptoms\confusion.dm" +#include "code\datums\diseases\advance\symptoms\cough.dm" +#include "code\datums\diseases\advance\symptoms\damage_converter.dm" +#include "code\datums\diseases\advance\symptoms\deafness.dm" +#include "code\datums\diseases\advance\symptoms\dizzy.dm" +#include "code\datums\diseases\advance\symptoms\fever.dm" +#include "code\datums\diseases\advance\symptoms\fire.dm" +#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" +#include "code\datums\diseases\advance\symptoms\hallucigen.dm" +#include "code\datums\diseases\advance\symptoms\headache.dm" +#include "code\datums\diseases\advance\symptoms\heal.dm" +#include "code\datums\diseases\advance\symptoms\itching.dm" +#include "code\datums\diseases\advance\symptoms\oxygen.dm" +#include "code\datums\diseases\advance\symptoms\sensory.dm" +#include "code\datums\diseases\advance\symptoms\shedding.dm" +#include "code\datums\diseases\advance\symptoms\shivering.dm" +#include "code\datums\diseases\advance\symptoms\skin.dm" +#include "code\datums\diseases\advance\symptoms\sneeze.dm" +#include "code\datums\diseases\advance\symptoms\symptoms.dm" +#include "code\datums\diseases\advance\symptoms\viral.dm" +#include "code\datums\diseases\advance\symptoms\vision.dm" +#include "code\datums\diseases\advance\symptoms\voice_change.dm" +#include "code\datums\diseases\advance\symptoms\vomit.dm" +#include "code\datums\diseases\advance\symptoms\weakness.dm" +#include "code\datums\diseases\advance\symptoms\weight.dm" +#include "code\datums\diseases\advance\symptoms\youth.dm" +#include "code\datums\helper_datums\construction_datum.dm" +#include "code\datums\helper_datums\events.dm" +#include "code\datums\helper_datums\global_iterator.dm" +#include "code\datums\helper_datums\icon_snapshot.dm" +#include "code\datums\helper_datums\input.dm" +#include "code\datums\helper_datums\map_template.dm" +#include "code\datums\helper_datums\teleport.dm" +#include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\looping_sounds\looping_sound.dm" +#include "code\datums\looping_sounds\machinery_sounds.dm" +#include "code\datums\looping_sounds\thermal_drill.dm" +#include "code\datums\looping_sounds\weather.dm" +#include "code\datums\outfits\outfit.dm" +#include "code\datums\outfits\outfit_admin.dm" +#include "code\datums\ruins\lavaland.dm" +#include "code\datums\ruins\space.dm" +#include "code\datums\spells\area_teleport.dm" +#include "code\datums\spells\bloodcrawl.dm" +#include "code\datums\spells\chaplain.dm" +#include "code\datums\spells\charge.dm" +#include "code\datums\spells\cluwne.dm" +#include "code\datums\spells\conjure.dm" +#include "code\datums\spells\conjure_item.dm" +#include "code\datums\spells\construct_spells.dm" +#include "code\datums\spells\devil.dm" +#include "code\datums\spells\devil_boons.dm" +#include "code\datums\spells\dumbfire.dm" +#include "code\datums\spells\emplosion.dm" +#include "code\datums\spells\ethereal_jaunt.dm" +#include "code\datums\spells\explosion.dm" +#include "code\datums\spells\fake_gib.dm" +#include "code\datums\spells\genetic.dm" +#include "code\datums\spells\horsemask.dm" +#include "code\datums\spells\infinite_guns.dm" +#include "code\datums\spells\inflict_handler.dm" +#include "code\datums\spells\knock.dm" +#include "code\datums\spells\lichdom.dm" +#include "code\datums\spells\lightning.dm" +#include "code\datums\spells\magnet.dm" +#include "code\datums\spells\mime.dm" +#include "code\datums\spells\mind_transfer.dm" +#include "code\datums\spells\night_vision.dm" +#include "code\datums\spells\projectile.dm" +#include "code\datums\spells\rathens.dm" +#include "code\datums\spells\rod_form.dm" +#include "code\datums\spells\shapeshift.dm" +#include "code\datums\spells\summonitem.dm" +#include "code\datums\spells\touch_attacks.dm" +#include "code\datums\spells\trigger.dm" +#include "code\datums\spells\turf_teleport.dm" +#include "code\datums\spells\wizard.dm" +#include "code\datums\status_effects\buffs.dm" +#include "code\datums\status_effects\debuffs.dm" +#include "code\datums\status_effects\neutral.dm" +#include "code\datums\status_effects\status_effect.dm" +#include "code\datums\vr\level.dm" +#include "code\datums\weather\weather.dm" +#include "code\datums\weather\weather_types\ash_storm.dm" +#include "code\datums\weather\weather_types\floor_is_lava.dm" +#include "code\datums\weather\weather_types\radiation_storm.dm" +#include "code\datums\weather\weather_types\snow_storm.dm" +#include "code\datums\wires\airlock.dm" +#include "code\datums\wires\alarm.dm" +#include "code\datums\wires\apc.dm" +#include "code\datums\wires\autolathe.dm" +#include "code\datums\wires\camera.dm" +#include "code\datums\wires\explosive.dm" +#include "code\datums\wires\mulebot.dm" +#include "code\datums\wires\nuclearbomb.dm" +#include "code\datums\wires\particle_accelerator.dm" +#include "code\datums\wires\radio.dm" +#include "code\datums\wires\robot.dm" +#include "code\datums\wires\smartfridge.dm" +#include "code\datums\wires\suitstorage.dm" +#include "code\datums\wires\syndicatebomb.dm" +#include "code\datums\wires\tesla_coil.dm" +#include "code\datums\wires\vending.dm" +#include "code\datums\wires\wires.dm" +#include "code\defines\vox_sounds.dm" +#include "code\defines\procs\admin.dm" +#include "code\defines\procs\announce.dm" +#include "code\defines\procs\AStar.dm" +#include "code\defines\procs\dbcore.dm" +#include "code\defines\procs\radio.dm" +#include "code\defines\procs\records.dm" +#include "code\defines\procs\statistics.dm" +#include "code\game\alternate_appearance.dm" +#include "code\game\asteroid.dm" +#include "code\game\atoms.dm" +#include "code\game\atoms_movable.dm" +#include "code\game\data_huds.dm" +#include "code\game\shuttle_engines.dm" +#include "code\game\sound.dm" +#include "code\game\world.dm" +#include "code\game\area\ai_monitored.dm" +#include "code\game\area\areas.dm" +#include "code\game\area\Dynamic areas.dm" +#include "code\game\area\Space Station 13 areas.dm" +#include "code\game\area\areas\depot-areas.dm" +#include "code\game\area\areas\mining.dm" +#include "code\game\area\areas\ruins\lavaland.dm" +#include "code\game\dna\dna2.dm" +#include "code\game\dna\dna2_domutcheck.dm" +#include "code\game\dna\dna2_helpers.dm" +#include "code\game\dna\dna_modifier.dm" +#include "code\game\dna\genes\disabilities.dm" +#include "code\game\dna\genes\gene.dm" +#include "code\game\dna\genes\goon_disabilities.dm" +#include "code\game\dna\genes\goon_powers.dm" +#include "code\game\dna\genes\monkey.dm" +#include "code\game\dna\genes\powers.dm" +#include "code\game\dna\genes\vg_disabilities.dm" +#include "code\game\dna\genes\vg_powers.dm" +#include "code\game\gamemodes\factions.dm" +#include "code\game\gamemodes\game_mode.dm" +#include "code\game\gamemodes\intercept_report.dm" +#include "code\game\gamemodes\objective.dm" +#include "code\game\gamemodes\scoreboard.dm" +#include "code\game\gamemodes\setupgame.dm" +#include "code\game\gamemodes\steal_items.dm" +#include "code\game\gamemodes\autotraitor\autotraitor.dm" +#include "code\game\gamemodes\blob\blob.dm" +#include "code\game\gamemodes\blob\blob_finish.dm" +#include "code\game\gamemodes\blob\blob_report.dm" +#include "code\game\gamemodes\blob\overmind.dm" +#include "code\game\gamemodes\blob\powers.dm" +#include "code\game\gamemodes\blob\theblob.dm" +#include "code\game\gamemodes\blob\blobs\blob_mobs.dm" +#include "code\game\gamemodes\blob\blobs\core.dm" +#include "code\game\gamemodes\blob\blobs\factory.dm" +#include "code\game\gamemodes\blob\blobs\node.dm" +#include "code\game\gamemodes\blob\blobs\resource.dm" +#include "code\game\gamemodes\blob\blobs\shield.dm" +#include "code\game\gamemodes\blob\blobs\storage.dm" +#include "code\game\gamemodes\changeling\changeling.dm" +#include "code\game\gamemodes\changeling\changeling_power.dm" +#include "code\game\gamemodes\changeling\evolution_menu.dm" +#include "code\game\gamemodes\changeling\traitor_chan.dm" +#include "code\game\gamemodes\changeling\powers\absorb.dm" +#include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" +#include "code\game\gamemodes\changeling\powers\biodegrade.dm" +#include "code\game\gamemodes\changeling\powers\chameleon_skin.dm" +#include "code\game\gamemodes\changeling\powers\digitalcamo.dm" +#include "code\game\gamemodes\changeling\powers\epinephrine.dm" +#include "code\game\gamemodes\changeling\powers\fakedeath.dm" +#include "code\game\gamemodes\changeling\powers\fleshmend.dm" +#include "code\game\gamemodes\changeling\powers\headcrab.dm" +#include "code\game\gamemodes\changeling\powers\hivemind.dm" +#include "code\game\gamemodes\changeling\powers\humanform.dm" +#include "code\game\gamemodes\changeling\powers\lesserform.dm" +#include "code\game\gamemodes\changeling\powers\linglink.dm" +#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" +#include "code\game\gamemodes\changeling\powers\mutations.dm" +#include "code\game\gamemodes\changeling\powers\panacea.dm" +#include "code\game\gamemodes\changeling\powers\revive.dm" +#include "code\game\gamemodes\changeling\powers\shriek.dm" +#include "code\game\gamemodes\changeling\powers\spiders.dm" +#include "code\game\gamemodes\changeling\powers\strained_muscles.dm" +#include "code\game\gamemodes\changeling\powers\swap_form.dm" +#include "code\game\gamemodes\changeling\powers\tiny_prick.dm" +#include "code\game\gamemodes\changeling\powers\transform.dm" +#include "code\game\gamemodes\cult\cult.dm" +#include "code\game\gamemodes\cult\cult_comms.dm" +#include "code\game\gamemodes\cult\cult_datums.dm" +#include "code\game\gamemodes\cult\cult_items.dm" +#include "code\game\gamemodes\cult\cult_objectives.dm" +#include "code\game\gamemodes\cult\cult_structures.dm" +#include "code\game\gamemodes\cult\ritual.dm" +#include "code\game\gamemodes\cult\runes.dm" +#include "code\game\gamemodes\cult\talisman.dm" +#include "code\game\gamemodes\devil\devil.dm" +#include "code\game\gamemodes\devil\devil_game_mode.dm" +#include "code\game\gamemodes\devil\devilinfo.dm" +#include "code\game\gamemodes\devil\game_mode.dm" +#include "code\game\gamemodes\devil\objectives.dm" +#include "code\game\gamemodes\devil\contracts\friend.dm" +#include "code\game\gamemodes\devil\devil agent\devil_agent.dm" +#include "code\game\gamemodes\devil\imp\imp.dm" +#include "code\game\gamemodes\devil\true_devil\_true_devil.dm" +#include "code\game\gamemodes\devil\true_devil\inventory.dm" +#include "code\game\gamemodes\extended\extended.dm" +#include "code\game\gamemodes\heist\heist.dm" +#include "code\game\gamemodes\malfunction\Malf_Modules.dm" +#include "code\game\gamemodes\meteor\meteor.dm" +#include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\miniantags\abduction\abductee_objectives.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_gear.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_outfits.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_surgery.dm" +#include "code\game\gamemodes\miniantags\abduction\gland.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\camera.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\console.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\dispenser.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\experiment.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\pad.dm" +#include "code\game\gamemodes\miniantags\borer\borer.dm" +#include "code\game\gamemodes\miniantags\borer\borer_chemicals.dm" +#include "code\game\gamemodes\miniantags\borer\borer_event.dm" +#include "code\game\gamemodes\miniantags\borer\borer_html.dm" +#include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm" +#include "code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" +#include "code\game\gamemodes\miniantags\guardian\guardian.dm" +#include "code\game\gamemodes\miniantags\guardian\types\assassin.dm" +#include "code\game\gamemodes\miniantags\guardian\types\bomb.dm" +#include "code\game\gamemodes\miniantags\guardian\types\charger.dm" +#include "code\game\gamemodes\miniantags\guardian\types\fire.dm" +#include "code\game\gamemodes\miniantags\guardian\types\healer.dm" +#include "code\game\gamemodes\miniantags\guardian\types\lightning.dm" +#include "code\game\gamemodes\miniantags\guardian\types\protector.dm" +#include "code\game\gamemodes\miniantags\guardian\types\ranged.dm" +#include "code\game\gamemodes\miniantags\guardian\types\standard.dm" +#include "code\game\gamemodes\miniantags\morph\morph.dm" +#include "code\game\gamemodes\miniantags\morph\morph_event.dm" +#include "code\game\gamemodes\miniantags\revenant\revenant.dm" +#include "code\game\gamemodes\miniantags\revenant\revenant_abilities.dm" +#include "code\game\gamemodes\miniantags\revenant\revenant_spawn_event.dm" +#include "code\game\gamemodes\miniantags\sintouched\objectives.dm" +#include "code\game\gamemodes\miniantags\slaughter\bloodcrawl.dm" +#include "code\game\gamemodes\miniantags\slaughter\slaughter.dm" +#include "code\game\gamemodes\nuclear\nuclear.dm" +#include "code\game\gamemodes\nuclear\nuclear_challenge.dm" +#include "code\game\gamemodes\nuclear\nuclearbomb.dm" +#include "code\game\gamemodes\nuclear\pinpointer.dm" +#include "code\game\gamemodes\revolution\revolution.dm" +#include "code\game\gamemodes\shadowling\ascendant_shadowling.dm" +#include "code\game\gamemodes\shadowling\shadowling.dm" +#include "code\game\gamemodes\shadowling\shadowling_abilities.dm" +#include "code\game\gamemodes\shadowling\shadowling_items.dm" +#include "code\game\gamemodes\shadowling\special_shadowling_abilities.dm" +#include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\vampire\traitor_vamp.dm" +#include "code\game\gamemodes\vampire\vampire.dm" +#include "code\game\gamemodes\vampire\vampire_powers.dm" +#include "code\game\gamemodes\wizard\artefact.dm" +#include "code\game\gamemodes\wizard\godhand.dm" +#include "code\game\gamemodes\wizard\raginmages.dm" +#include "code\game\gamemodes\wizard\rightandwrong.dm" +#include "code\game\gamemodes\wizard\soulstone.dm" +#include "code\game\gamemodes\wizard\spellbook.dm" +#include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\jobs\access.dm" +#include "code\game\jobs\job_exp.dm" +#include "code\game\jobs\job_objective.dm" +#include "code\game\jobs\job_scaling.dm" +#include "code\game\jobs\jobs.dm" +#include "code\game\jobs\whitelist.dm" +#include "code\game\jobs\job\central.dm" +#include "code\game\jobs\job\civilian.dm" +#include "code\game\jobs\job\engineering.dm" +#include "code\game\jobs\job\job.dm" +#include "code\game\jobs\job\medical.dm" +#include "code\game\jobs\job\science.dm" +#include "code\game\jobs\job\security.dm" +#include "code\game\jobs\job\silicon.dm" +#include "code\game\jobs\job\supervisor.dm" +#include "code\game\jobs\job\support.dm" +#include "code\game\jobs\job\support_chaplain.dm" +#include "code\game\jobs\job\syndicate.dm" +#include "code\game\jobs\job_objectives\science.dm" +#include "code\game\machinery\adv_med.dm" +#include "code\game\machinery\ai_slipper.dm" +#include "code\game\machinery\alarm.dm" +#include "code\game\machinery\atmo_control.dm" +#include "code\game\machinery\autolathe.dm" +#include "code\game\machinery\Beacon.dm" +#include "code\game\machinery\buttons.dm" +#include "code\game\machinery\cell_charger.dm" +#include "code\game\machinery\chiller.dm" +#include "code\game\machinery\cloning.dm" +#include "code\game\machinery\constructable_frame.dm" +#include "code\game\machinery\cryo.dm" +#include "code\game\machinery\cryopod.dm" +#include "code\game\machinery\dance_machine.dm" +#include "code\game\machinery\defib_mount.dm" +#include "code\game\machinery\deployable.dm" +#include "code\game\machinery\door_control.dm" +#include "code\game\machinery\doppler_array.dm" +#include "code\game\machinery\dye_generator.dm" +#include "code\game\machinery\firealarm.dm" +#include "code\game\machinery\flasher.dm" +#include "code\game\machinery\floodlight.dm" +#include "code\game\machinery\Freezer.dm" +#include "code\game\machinery\gameboard.dm" +#include "code\game\machinery\guestpass.dm" +#include "code\game\machinery\hologram.dm" +#include "code\game\machinery\holosign.dm" +#include "code\game\machinery\igniter.dm" +#include "code\game\machinery\iv_drip.dm" +#include "code\game\machinery\lightswitch.dm" +#include "code\game\machinery\machinery.dm" +#include "code\game\machinery\magnet.dm" +#include "code\game\machinery\mass_driver.dm" +#include "code\game\machinery\navbeacon.dm" +#include "code\game\machinery\newscaster.dm" +#include "code\game\machinery\OpTable.dm" +#include "code\game\machinery\overview.dm" +#include "code\game\machinery\PDApainter.dm" +#include "code\game\machinery\poolcontroller.dm" +#include "code\game\machinery\portable_tag_turret.dm" +#include "code\game\machinery\portable_turret.dm" +#include "code\game\machinery\quantum_pad.dm" +#include "code\game\machinery\recharger.dm" +#include "code\game\machinery\rechargestation.dm" +#include "code\game\machinery\recycler.dm" +#include "code\game\machinery\requests_console.dm" +#include "code\game\machinery\shieldgen.dm" +#include "code\game\machinery\Sleeper.dm" +#include "code\game\machinery\slotmachine.dm" +#include "code\game\machinery\snow_machine.dm" +#include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\status_display.dm" +#include "code\game\machinery\suit_storage_unit.dm" +#include "code\game\machinery\supply_display.dm" +#include "code\game\machinery\syndicatebeacon.dm" +#include "code\game\machinery\syndicatebomb.dm" +#include "code\game\machinery\teleporter.dm" +#include "code\game\machinery\transformer.dm" +#include "code\game\machinery\turntable.dm" +#include "code\game\machinery\turret_control.dm" +#include "code\game\machinery\vending.dm" +#include "code\game\machinery\washing_machine.dm" +#include "code\game\machinery\wishgranter.dm" +#include "code\game\machinery\atmoalter\area_atmos_computer.dm" +#include "code\game\machinery\atmoalter\canister.dm" +#include "code\game\machinery\atmoalter\meter.dm" +#include "code\game\machinery\atmoalter\portable_atmospherics.dm" +#include "code\game\machinery\atmoalter\pump.dm" +#include "code\game\machinery\atmoalter\scrubber.dm" +#include "code\game\machinery\atmoalter\zvent.dm" +#include "code\game\machinery\camera\camera.dm" +#include "code\game\machinery\camera\camera_assembly.dm" +#include "code\game\machinery\camera\motion.dm" +#include "code\game\machinery\camera\presets.dm" +#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\computer\ai_core.dm" +#include "code\game\machinery\computer\aifixer.dm" +#include "code\game\machinery\computer\arcade.dm" +#include "code\game\machinery\computer\atmos_alert.dm" +#include "code\game\machinery\computer\atmos_control.dm" +#include "code\game\machinery\computer\brigcells.dm" +#include "code\game\machinery\computer\buildandrepair.dm" +#include "code\game\machinery\computer\camera.dm" +#include "code\game\machinery\computer\camera_advanced.dm" +#include "code\game\machinery\computer\card.dm" +#include "code\game\machinery\computer\cloning.dm" +#include "code\game\machinery\computer\communications.dm" +#include "code\game\machinery\computer\computer.dm" +#include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\depot.dm" +#include "code\game\machinery\computer\HolodeckControl.dm" +#include "code\game\machinery\computer\honkputer.dm" +#include "code\game\machinery\computer\law.dm" +#include "code\game\machinery\computer\medical.dm" +#include "code\game\machinery\computer\message.dm" +#include "code\game\machinery\computer\Operating.dm" +#include "code\game\machinery\computer\pod.dm" +#include "code\game\machinery\computer\pod_tracking_console.dm" +#include "code\game\machinery\computer\power.dm" +#include "code\game\machinery\computer\prisoner.dm" +#include "code\game\machinery\computer\robot.dm" +#include "code\game\machinery\computer\salvage_ship.dm" +#include "code\game\machinery\computer\security.dm" +#include "code\game\machinery\computer\skills.dm" +#include "code\game\machinery\computer\specops_shuttle.dm" +#include "code\game\machinery\computer\station_alert.dm" +#include "code\game\machinery\computer\store.dm" +#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" +#include "code\game\machinery\computer\vr_control.dm" +#include "code\game\machinery\doors\airlock.dm" +#include "code\game\machinery\doors\airlock_control.dm" +#include "code\game\machinery\doors\airlock_electronics.dm" +#include "code\game\machinery\doors\airlock_types.dm" +#include "code\game\machinery\doors\alarmlock.dm" +#include "code\game\machinery\doors\brigdoors.dm" +#include "code\game\machinery\doors\checkForMultipleDoors.dm" +#include "code\game\machinery\doors\door.dm" +#include "code\game\machinery\doors\firedoor.dm" +#include "code\game\machinery\doors\poddoor.dm" +#include "code\game\machinery\doors\shutters.dm" +#include "code\game\machinery\doors\spacepod.dm" +#include "code\game\machinery\doors\unpowered.dm" +#include "code\game\machinery\doors\windowdoor.dm" +#include "code\game\machinery\embedded_controller\airlock_controllers.dm" +#include "code\game\machinery\embedded_controller\airlock_program.dm" +#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" +#include "code\game\machinery\embedded_controller\embedded_program_base.dm" +#include "code\game\machinery\pipe\construction.dm" +#include "code\game\machinery\pipe\pipe_dispenser.dm" +#include "code\game\machinery\telecomms\broadcaster.dm" +#include "code\game\machinery\telecomms\logbrowser.dm" +#include "code\game\machinery\telecomms\machine_interactions.dm" +#include "code\game\machinery\telecomms\ntsl2.dm" +#include "code\game\machinery\telecomms\presets.dm" +#include "code\game\machinery\telecomms\telecomunications.dm" +#include "code\game\machinery\telecomms\telemonitor.dm" +#include "code\game\machinery\telecomms\traffic_control.dm" +#include "code\game\magic\Uristrunes.dm" +#include "code\game\mecha\mech_bay.dm" +#include "code\game\mecha\mech_fabricator.dm" +#include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" +#include "code\game\mecha\mecha_construction_paths.dm" +#include "code\game\mecha\mecha_control_console.dm" +#include "code\game\mecha\mecha_modkit.dm" +#include "code\game\mecha\mecha_parts.dm" +#include "code\game\mecha\mecha_topic.dm" +#include "code\game\mecha\mecha_wreckage.dm" +#include "code\game\mecha\paintkits.dm" +#include "code\game\mecha\combat\combat.dm" +#include "code\game\mecha\combat\durand.dm" +#include "code\game\mecha\combat\gygax.dm" +#include "code\game\mecha\combat\honker.dm" +#include "code\game\mecha\combat\marauder.dm" +#include "code\game\mecha\combat\phazon.dm" +#include "code\game\mecha\combat\reticence.dm" +#include "code\game\mecha\equipment\mecha_equipment.dm" +#include "code\game\mecha\equipment\tools\medical_tools.dm" +#include "code\game\mecha\equipment\tools\mining_tools.dm" +#include "code\game\mecha\equipment\tools\other_tools.dm" +#include "code\game\mecha\equipment\tools\work_tools.dm" +#include "code\game\mecha\equipment\weapons\weapons.dm" +#include "code\game\mecha\medical\medical.dm" +#include "code\game\mecha\medical\odysseus.dm" +#include "code\game\mecha\working\ripley.dm" +#include "code\game\mecha\working\working.dm" +#include "code\game\objects\buckling.dm" +#include "code\game\objects\empulse.dm" +#include "code\game\objects\explosion.dm" +#include "code\game\objects\items.dm" +#include "code\game\objects\obj_defense.dm" +#include "code\game\objects\objs.dm" +#include "code\game\objects\structures.dm" +#include "code\game\objects\effects\alien_acid.dm" +#include "code\game\objects\effects\anomalies.dm" +#include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\effects.dm" +#include "code\game\objects\effects\forcefields.dm" +#include "code\game\objects\effects\gibs.dm" +#include "code\game\objects\effects\glowshroom.dm" +#include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\manifest.dm" +#include "code\game\objects\effects\mapping_helpers.dm" +#include "code\game\objects\effects\mines.dm" +#include "code\game\objects\effects\misc.dm" +#include "code\game\objects\effects\overlays.dm" +#include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\snowcloud.dm" +#include "code\game\objects\effects\spiders.dm" +#include "code\game\objects\effects\step_triggers.dm" +#include "code\game\objects\effects\decals\cleanable.dm" +#include "code\game\objects\effects\decals\contraband.dm" +#include "code\game\objects\effects\decals\crayon.dm" +#include "code\game\objects\effects\decals\decal.dm" +#include "code\game\objects\effects\decals\misc.dm" +#include "code\game\objects\effects\decals\remains.dm" +#include "code\game\objects\effects\decals\warning_stripes.dm" +#include "code\game\objects\effects\decals\Cleanable\aliens.dm" +#include "code\game\objects\effects\decals\Cleanable\fuel.dm" +#include "code\game\objects\effects\decals\Cleanable\humans.dm" +#include "code\game\objects\effects\decals\Cleanable\misc.dm" +#include "code\game\objects\effects\decals\Cleanable\robots.dm" +#include "code\game\objects\effects\decals\Cleanable\tracks.dm" +#include "code\game\objects\effects\decals\turfdecals\dirt.dm" +#include "code\game\objects\effects\decals\turfdecals\markings.dm" +#include "code\game\objects\effects\decals\turfdecals\tilecoloring.dm" +#include "code\game\objects\effects\decals\turfdecals\weather.dm" +#include "code\game\objects\effects\effect_system\effect_system.dm" +#include "code\game\objects\effects\effect_system\effects_chem_smoke.dm" +#include "code\game\objects\effects\effect_system\effects_explosion.dm" +#include "code\game\objects\effects\effect_system\effects_foam.dm" +#include "code\game\objects\effects\effect_system\effects_other.dm" +#include "code\game\objects\effects\effect_system\effects_smoke.dm" +#include "code\game\objects\effects\effect_system\effects_sparks.dm" +#include "code\game\objects\effects\effect_system\effects_water.dm" +#include "code\game\objects\effects\spawners\bombspawner.dm" +#include "code\game\objects\effects\spawners\gibspawner.dm" +#include "code\game\objects\effects\spawners\lootdrop.dm" +#include "code\game\objects\effects\spawners\random_barrier.dm" +#include "code\game\objects\effects\spawners\random_spawners.dm" +#include "code\game\objects\effects\spawners\vaultspawner.dm" +#include "code\game\objects\effects\spawners\windowspawner.dm" +#include "code\game\objects\effects\temporary_visuals\clockcult.dm" +#include "code\game\objects\effects\temporary_visuals\cult.dm" +#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" +#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" +#include "code\game\objects\items\ashtray.dm" +#include "code\game\objects\items\blueprints.dm" +#include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\candle.dm" +#include "code\game\objects\items\cardboard_cutouts.dm" +#include "code\game\objects\items\changestone.dm" +#include "code\game\objects\items\contraband.dm" +#include "code\game\objects\items\control_wand.dm" +#include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\dehy_carp.dm" +#include "code\game\objects\items\documents.dm" +#include "code\game\objects\items\flag.dm" +#include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\misc.dm" +#include "code\game\objects\items\mixing_bowl.dm" +#include "code\game\objects\items\random_items.dm" +#include "code\game\objects\items\shooting_range.dm" +#include "code\game\objects\items\toys.dm" +#include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\autopsy.dm" +#include "code\game\objects\items\devices\camera_bug.dm" +#include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\flash.dm" +#include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\floor_painter.dm" +#include "code\game\objects\items\devices\handheld_defib.dm" +#include "code\game\objects\items\devices\instruments.dm" +#include "code\game\objects\items\devices\laserpointer.dm" +#include "code\game\objects\items\devices\lightreplacer.dm" +#include "code\game\objects\items\devices\machineprototype.dm" +#include "code\game\objects\items\devices\megaphone.dm" +#include "code\game\objects\items\devices\multitool.dm" +#include "code\game\objects\items\devices\paicard.dm" +#include "code\game\objects\items\devices\pipe_painter.dm" +#include "code\game\objects\items\devices\pizza_bomb.dm" +#include "code\game\objects\items\devices\powersink.dm" +#include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\sensor_device.dm" +#include "code\game\objects\items\devices\taperecorder.dm" +#include "code\game\objects\items\devices\thermal_drill.dm" +#include "code\game\objects\items\devices\traitordevices.dm" +#include "code\game\objects\items\devices\transfer_valve.dm" +#include "code\game\objects\items\devices\uplinks.dm" +#include "code\game\objects\items\devices\voice.dm" +#include "code\game\objects\items\devices\whistle.dm" +#include "code\game\objects\items\devices\radio\beacon.dm" +#include "code\game\objects\items\devices\radio\electropack.dm" +#include "code\game\objects\items\devices\radio\encryptionkey.dm" +#include "code\game\objects\items\devices\radio\headset.dm" +#include "code\game\objects\items\devices\radio\intercom.dm" +#include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\mountable_frames\air_alarm.dm" +#include "code\game\objects\items\mountable_frames\apc_frame.dm" +#include "code\game\objects\items\mountable_frames\buttons_switches.dm" +#include "code\game\objects\items\mountable_frames\extinguisher_frame.dm" +#include "code\game\objects\items\mountable_frames\fire_alarm.dm" +#include "code\game\objects\items\mountable_frames\frames.dm" +#include "code\game\objects\items\mountable_frames\intercom.dm" +#include "code\game\objects\items\mountable_frames\lights.dm" +#include "code\game\objects\items\mountable_frames\mountables.dm" +#include "code\game\objects\items\mountable_frames\newscaster_frame.dm" +#include "code\game\objects\items\robot\ai_upgrades.dm" +#include "code\game\objects\items\robot\robot_items.dm" +#include "code\game\objects\items\robot\robot_parts.dm" +#include "code\game\objects\items\robot\robot_upgrades.dm" +#include "code\game\objects\items\stacks\medical.dm" +#include "code\game\objects\items\stacks\nanopaste.dm" +#include "code\game\objects\items\stacks\rods.dm" +#include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\stack_recipe.dm" +#include "code\game\objects\items\stacks\telecrystal.dm" +#include "code\game\objects\items\stacks\sheets\glass.dm" +#include "code\game\objects\items\stacks\sheets\leather.dm" +#include "code\game\objects\items\stacks\sheets\light.dm" +#include "code\game\objects\items\stacks\sheets\mineral.dm" +#include "code\game\objects\items\stacks\sheets\sheet_types.dm" +#include "code\game\objects\items\stacks\sheets\sheets.dm" +#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" +#include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\weapons\AI_modules.dm" +#include "code\game\objects\items\weapons\alien_specific.dm" +#include "code\game\objects\items\weapons\bee_briefcase.dm" +#include "code\game\objects\items\weapons\cards_ids.dm" +#include "code\game\objects\items\weapons\cash.dm" +#include "code\game\objects\items\weapons\caution.dm" +#include "code\game\objects\items\weapons\chrono_eraser.dm" +#include "code\game\objects\items\weapons\cigs.dm" +#include "code\game\objects\items\weapons\clown_items.dm" +#include "code\game\objects\items\weapons\cosmetics.dm" +#include "code\game\objects\items\weapons\courtroom.dm" +#include "code\game\objects\items\weapons\defib.dm" +#include "code\game\objects\items\weapons\dice.dm" +#include "code\game\objects\items\weapons\disks.dm" +#include "code\game\objects\items\weapons\dna_injector.dm" +#include "code\game\objects\items\weapons\dnascrambler.dm" +#include "code\game\objects\items\weapons\explosives.dm" +#include "code\game\objects\items\weapons\extinguisher.dm" +#include "code\game\objects\items\weapons\fireworks.dm" +#include "code\game\objects\items\weapons\flamethrower.dm" +#include "code\game\objects\items\weapons\garrote.dm" +#include "code\game\objects\items\weapons\gift_wrappaper.dm" +#include "code\game\objects\items\weapons\handcuffs.dm" +#include "code\game\objects\items\weapons\highlander_swords.dm" +#include "code\game\objects\items\weapons\holosign.dm" +#include "code\game\objects\items\weapons\holy_weapons.dm" +#include "code\game\objects\items\weapons\kitchen.dm" +#include "code\game\objects\items\weapons\legcuffs.dm" +#include "code\game\objects\items\weapons\lighters.dm" +#include "code\game\objects\items\weapons\manuals.dm" +#include "code\game\objects\items\weapons\misc.dm" +#include "code\game\objects\items\weapons\mop.dm" +#include "code\game\objects\items\weapons\paint.dm" +#include "code\game\objects\items\weapons\paiwire.dm" +#include "code\game\objects\items\weapons\pneumaticCannon.dm" +#include "code\game\objects\items\weapons\powerfist.dm" +#include "code\game\objects\items\weapons\RCD.dm" +#include "code\game\objects\items\weapons\RCL.dm" +#include "code\game\objects\items\weapons\rpd.dm" +#include "code\game\objects\items\weapons\RSF.dm" +#include "code\game\objects\items\weapons\scissors.dm" +#include "code\game\objects\items\weapons\scrolls.dm" +#include "code\game\objects\items\weapons\shards.dm" +#include "code\game\objects\items\weapons\shields.dm" +#include "code\game\objects\items\weapons\signs.dm" +#include "code\game\objects\items\weapons\soap.dm" +#include "code\game\objects\items\weapons\staff.dm" +#include "code\game\objects\items\weapons\stock_parts.dm" +#include "code\game\objects\items\weapons\stunbaton.dm" +#include "code\game\objects\items\weapons\swords_axes_etc.dm" +#include "code\game\objects\items\weapons\tape.dm" +#include "code\game\objects\items\weapons\teleportation.dm" +#include "code\game\objects\items\weapons\teleprod.dm" +#include "code\game\objects\items\weapons\tools.dm" +#include "code\game\objects\items\weapons\twohanded.dm" +#include "code\game\objects\items\weapons\vending_items.dm" +#include "code\game\objects\items\weapons\weaponry.dm" +#include "code\game\objects\items\weapons\whetstone.dm" +#include "code\game\objects\items\weapons\grenades\atmosgrenade.dm" +#include "code\game\objects\items\weapons\grenades\bananade.dm" +#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" +#include "code\game\objects\items\weapons\grenades\clowngrenade.dm" +#include "code\game\objects\items\weapons\grenades\clusterbuster.dm" +#include "code\game\objects\items\weapons\grenades\confetti.dm" +#include "code\game\objects\items\weapons\grenades\custom_grenades.dm" +#include "code\game\objects\items\weapons\grenades\emgrenade.dm" +#include "code\game\objects\items\weapons\grenades\flashbang.dm" +#include "code\game\objects\items\weapons\grenades\frag.dm" +#include "code\game\objects\items\weapons\grenades\ghettobomb.dm" +#include "code\game\objects\items\weapons\grenades\grenade.dm" +#include "code\game\objects\items\weapons\grenades\smokebomb.dm" +#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" +#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm" +#include "code\game\objects\items\weapons\implants\health.dm" +#include "code\game\objects\items\weapons\implants\implant.dm" +#include "code\game\objects\items\weapons\implants\implant_abductor.dm" +#include "code\game\objects\items\weapons\implants\implant_chem.dm" +#include "code\game\objects\items\weapons\implants\implant_death_alarm.dm" +#include "code\game\objects\items\weapons\implants\implant_explosive.dm" +#include "code\game\objects\items\weapons\implants\implant_freedom.dm" +#include "code\game\objects\items\weapons\implants\implant_krav_maga.dm" +#include "code\game\objects\items\weapons\implants\implant_mindshield.dm" +#include "code\game\objects\items\weapons\implants\implant_misc.dm" +#include "code\game\objects\items\weapons\implants\implant_storage.dm" +#include "code\game\objects\items\weapons\implants\implant_track.dm" +#include "code\game\objects\items\weapons\implants\implant_traitor.dm" +#include "code\game\objects\items\weapons\implants\implantcase.dm" +#include "code\game\objects\items\weapons\implants\implantchair.dm" +#include "code\game\objects\items\weapons\implants\implanter.dm" +#include "code\game\objects\items\weapons\implants\implantpad.dm" +#include "code\game\objects\items\weapons\implants\implantuplink.dm" +#include "code\game\objects\items\weapons\melee\energy.dm" +#include "code\game\objects\items\weapons\melee\misc.dm" +#include "code\game\objects\items\weapons\storage\artistic_toolbox.dm" +#include "code\game\objects\items\weapons\storage\backpack.dm" +#include "code\game\objects\items\weapons\storage\bags.dm" +#include "code\game\objects\items\weapons\storage\belt.dm" +#include "code\game\objects\items\weapons\storage\bible.dm" +#include "code\game\objects\items\weapons\storage\boxes.dm" +#include "code\game\objects\items\weapons\storage\briefcase.dm" +#include "code\game\objects\items\weapons\storage\fancy.dm" +#include "code\game\objects\items\weapons\storage\firstaid.dm" +#include "code\game\objects\items\weapons\storage\internal.dm" +#include "code\game\objects\items\weapons\storage\lockbox.dm" +#include "code\game\objects\items\weapons\storage\secure.dm" +#include "code\game\objects\items\weapons\storage\storage.dm" +#include "code\game\objects\items\weapons\storage\toolbox.dm" +#include "code\game\objects\items\weapons\storage\uplink_kits.dm" +#include "code\game\objects\items\weapons\storage\wallets.dm" +#include "code\game\objects\items\weapons\tanks\jetpack.dm" +#include "code\game\objects\items\weapons\tanks\tank_types.dm" +#include "code\game\objects\items\weapons\tanks\tanks.dm" +#include "code\game\objects\items\weapons\tanks\watertank.dm" +#include "code\game\objects\random\random.dm" +#include "code\game\objects\structures\aliens.dm" +#include "code\game\objects\structures\barsign.dm" +#include "code\game\objects\structures\bedsheet_bin.dm" +#include "code\game\objects\structures\coathanger.dm" +#include "code\game\objects\structures\curtains.dm" +#include "code\game\objects\structures\depot.dm" +#include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\door_assembly.dm" +#include "code\game\objects\structures\door_assembly_types.dm" +#include "code\game\objects\structures\dresser.dm" +#include "code\game\objects\structures\electricchair.dm" +#include "code\game\objects\structures\engicart.dm" +#include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\false_walls.dm" +#include "code\game\objects\structures\flora.dm" +#include "code\game\objects\structures\fluff.dm" +#include "code\game\objects\structures\foodcart.dm" +#include "code\game\objects\structures\girders.dm" +#include "code\game\objects\structures\grille.dm" +#include "code\game\objects\structures\guillotine.dm" +#include "code\game\objects\structures\holosign.dm" +#include "code\game\objects\structures\inflatable.dm" +#include "code\game\objects\structures\janicart.dm" +#include "code\game\objects\structures\kitchen_spike.dm" +#include "code\game\objects\structures\ladders.dm" +#include "code\game\objects\structures\lamarr_cage.dm" +#include "code\game\objects\structures\lattice.dm" +#include "code\game\objects\structures\mineral_doors.dm" +#include "code\game\objects\structures\mirror.dm" +#include "code\game\objects\structures\misc.dm" +#include "code\game\objects\structures\mop_bucket.dm" +#include "code\game\objects\structures\morgue.dm" +#include "code\game\objects\structures\musician.dm" +#include "code\game\objects\structures\noticeboard.dm" +#include "code\game\objects\structures\plasticflaps.dm" +#include "code\game\objects\structures\reflector.dm" +#include "code\game\objects\structures\safe.dm" +#include "code\game\objects\structures\signs.dm" +#include "code\game\objects\structures\spirit_board.dm" +#include "code\game\objects\structures\statues.dm" +#include "code\game\objects\structures\table_frames.dm" +#include "code\game\objects\structures\tables_racks.dm" +#include "code\game\objects\structures\tank_dispenser.dm" +#include "code\game\objects\structures\target_stake.dm" +#include "code\game\objects\structures\watercloset.dm" +#include "code\game\objects\structures\windoor_assembly.dm" +#include "code\game\objects\structures\window.dm" +#include "code\game\objects\structures\crates_lockers\closets.dm" +#include "code\game\objects\structures\crates_lockers\crates.dm" +#include "code\game\objects\structures\crates_lockers\crittercrate.dm" +#include "code\game\objects\structures\crates_lockers\largecrate.dm" +#include "code\game\objects\structures\crates_lockers\walllocker.dm" +#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm" +#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" +#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" +#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm" +#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" +#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" +#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" +#include "code\game\objects\structures\crates_lockers\closets\statue.dm" +#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\chaplain.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\depot.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\miscjobs.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" +#include "code\game\objects\structures\decor\decor.dm" +#include "code\game\objects\structures\decor\machinery\telecomms.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" +#include "code\game\objects\structures\transit_tubes\station.dm" +#include "code\game\objects\structures\transit_tubes\transit_tube.dm" +#include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm" +#include "code\game\turfs\simulated.dm" +#include "code\game\turfs\turf.dm" +#include "code\game\turfs\unsimulated.dm" +#include "code\game\turfs\simulated\floor.dm" +#include "code\game\turfs\simulated\minerals.dm" +#include "code\game\turfs\simulated\river.dm" +#include "code\game\turfs\simulated\shuttle.dm" +#include "code\game\turfs\simulated\walls.dm" +#include "code\game\turfs\simulated\walls_indestructible.dm" +#include "code\game\turfs\simulated\walls_mineral.dm" +#include "code\game\turfs\simulated\walls_misc.dm" +#include "code\game\turfs\simulated\walls_reinforced.dm" +#include "code\game\turfs\simulated\floor\asteroid.dm" +#include "code\game\turfs\simulated\floor\chasm.dm" +#include "code\game\turfs\simulated\floor\fancy_floor.dm" +#include "code\game\turfs\simulated\floor\indestructible.dm" +#include "code\game\turfs\simulated\floor\lava.dm" +#include "code\game\turfs\simulated\floor\light_floor.dm" +#include "code\game\turfs\simulated\floor\mineral.dm" +#include "code\game\turfs\simulated\floor\misc_floor.dm" +#include "code\game\turfs\simulated\floor\plasteel_floor.dm" +#include "code\game\turfs\simulated\floor\plating.dm" +#include "code\game\turfs\space\space.dm" +#include "code\game\turfs\space\transit.dm" +#include "code\game\turfs\unsimulated\beach.dm" +#include "code\game\turfs\unsimulated\floor.dm" +#include "code\game\turfs\unsimulated\walls.dm" +#include "code\game\verbs\ooc.dm" +#include "code\game\verbs\randomtip.dm" +#include "code\game\verbs\suicide.dm" +#include "code\game\verbs\who.dm" +#include "code\js\byjax.dm" +#include "code\js\menus.dm" +#include "code\LINDA\LINDA_fire.dm" +#include "code\LINDA\LINDA_system.dm" +#include "code\LINDA\LINDA_turf_tile.dm" +#include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_investigate.dm" +#include "code\modules\admin\admin_memo.dm" +#include "code\modules\admin\admin_ranks.dm" +#include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\banappearance.dm" +#include "code\modules\admin\banjob.dm" +#include "code\modules\admin\create_mob.dm" +#include "code\modules\admin\create_object.dm" +#include "code\modules\admin\create_poll.dm" +#include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\holder2.dm" +#include "code\modules\admin\ipintel.dm" +#include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\machine_upgrade.dm" +#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\stickyban.dm" +#include "code\modules\admin\topic.dm" +#include "code\modules\admin\ToRban.dm" +#include "code\modules\admin\watchlist.dm" +#include "code\modules\admin\DB ban\functions.dm" +#include "code\modules\admin\permissionverbs\permissionedit.dm" +#include "code\modules\admin\tickets\adminticketsverbs.dm" +#include "code\modules\admin\tickets\mentorticketsverbs.dm" +#include "code\modules\admin\verbs\adminhelp.dm" +#include "code\modules\admin\verbs\adminjump.dm" +#include "code\modules\admin\verbs\adminpm.dm" +#include "code\modules\admin\verbs\adminsay.dm" +#include "code\modules\admin\verbs\alt_check.dm" +#include "code\modules\admin\verbs\antag-ooc.dm" +#include "code\modules\admin\verbs\atmosdebug.dm" +#include "code\modules\admin\verbs\BrokenInhands.dm" +#include "code\modules\admin\verbs\cinematic.dm" +#include "code\modules\admin\verbs\custom_event.dm" +#include "code\modules\admin\verbs\deadsay.dm" +#include "code\modules\admin\verbs\debug.dm" +#include "code\modules\admin\verbs\diagnostics.dm" +#include "code\modules\admin\verbs\dice.dm" +#include "code\modules\admin\verbs\freeze.dm" +#include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\gimmick_team.dm" +#include "code\modules\admin\verbs\honksquad.dm" +#include "code\modules\admin\verbs\infiltratorteam_syndicate.dm" +#include "code\modules\admin\verbs\map_template_loadverb.dm" +#include "code\modules\admin\verbs\mapping.dm" +#include "code\modules\admin\verbs\massmodvar.dm" +#include "code\modules\admin\verbs\modifyvariables.dm" +#include "code\modules\admin\verbs\one_click_antag.dm" +#include "code\modules\admin\verbs\onlyone.dm" +#include "code\modules\admin\verbs\onlyoneteam.dm" +#include "code\modules\admin\verbs\playsound.dm" +#include "code\modules\admin\verbs\possess.dm" +#include "code\modules\admin\verbs\pray.dm" +#include "code\modules\admin\verbs\randomverbs.dm" +#include "code\modules\admin\verbs\serialization.dm" +#include "code\modules\admin\verbs\space_transitions.dm" +#include "code\modules\admin\verbs\spawnfloorcluwne.dm" +#include "code\modules\admin\verbs\striketeam.dm" +#include "code\modules\admin\verbs\striketeam_syndicate.dm" +#include "code\modules\admin\verbs\ticklag.dm" +#include "code\modules\admin\verbs\toggledebugverbs.dm" +#include "code\modules\admin\verbs\tripAI.dm" +#include "code\modules\admin\verbs\vox_raiders.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" +#include "code\modules\admin\verbs\SDQL2\useful_procs.dm" +#include "code\modules\alarm\alarm.dm" +#include "code\modules\alarm\alarm_handler.dm" +#include "code\modules\alarm\atmosphere_alarm.dm" +#include "code\modules\alarm\burglar_alarm.dm" +#include "code\modules\alarm\camera_alarm.dm" +#include "code\modules\alarm\fire_alarm.dm" +#include "code\modules\alarm\motion_alarm.dm" +#include "code\modules\alarm\power_alarm.dm" +#include "code\modules\antagonists\_common\antag_datum.dm" +#include "code\modules\antagonists\_common\antag_helpers.dm" +#include "code\modules\antagonists\_common\antag_hud.dm" +#include "code\modules\antagonists\_common\antag_spawner.dm" +#include "code\modules\antagonists\_common\antag_team.dm" +#include "code\modules\antagonists\wishgranter\wishgranter.dm" +#include "code\modules\arcade\arcade_base.dm" +#include "code\modules\arcade\arcade_prize.dm" +#include "code\modules\arcade\claw_game.dm" +#include "code\modules\arcade\prize_counter.dm" +#include "code\modules\arcade\prize_datums.dm" +#include "code\modules\arcade\mob_hunt\battle_computer.dm" +#include "code\modules\arcade\mob_hunt\mob_avatar.dm" +#include "code\modules\arcade\mob_hunt\mob_cards.dm" +#include "code\modules\arcade\mob_hunt\mob_datums.dm" +#include "code\modules\arcade\mob_hunt\mob_type_datums.dm" +#include "code\modules\assembly\assembly.dm" +#include "code\modules\assembly\bomb.dm" +#include "code\modules\assembly\health.dm" +#include "code\modules\assembly\helpers.dm" +#include "code\modules\assembly\holder.dm" +#include "code\modules\assembly\igniter.dm" +#include "code\modules\assembly\infrared.dm" +#include "code\modules\assembly\mousetrap.dm" +#include "code\modules\assembly\proximity.dm" +#include "code\modules\assembly\shock_kit.dm" +#include "code\modules\assembly\signaler.dm" +#include "code\modules\assembly\timer.dm" +#include "code\modules\assembly\voice.dm" +#include "code\modules\atmos_automation\console.dm" +#include "code\modules\atmos_automation\statements.dm" +#include "code\modules\atmos_automation\implementation\digital_valves.dm" +#include "code\modules\atmos_automation\implementation\emitters.dm" +#include "code\modules\atmos_automation\implementation\injectors.dm" +#include "code\modules\atmos_automation\implementation\scrubbers.dm" +#include "code\modules\atmos_automation\implementation\sensors.dm" +#include "code\modules\atmos_automation\implementation\vent_pump.dm" +#include "code\modules\awaymissions\corpse.dm" +#include "code\modules\awaymissions\exile.dm" +#include "code\modules\awaymissions\gateway.dm" +#include "code\modules\awaymissions\loot.dm" +#include "code\modules\awaymissions\map_rng.dm" +#include "code\modules\awaymissions\pamphlet.dm" +#include "code\modules\awaymissions\zlevel.dm" +#include "code\modules\awaymissions\zvis.dm" +#include "code\modules\awaymissions\maploader\dmm_suite.dm" +#include "code\modules\awaymissions\maploader\reader.dm" +#include "code\modules\awaymissions\maploader\writer.dm" +#include "code\modules\awaymissions\mission_code\academy.dm" +#include "code\modules\awaymissions\mission_code\beach.dm" +#include "code\modules\awaymissions\mission_code\blackmarketpackers.dm" +#include "code\modules\awaymissions\mission_code\centcomAway.dm" +#include "code\modules\awaymissions\mission_code\challenge.dm" +#include "code\modules\awaymissions\mission_code\evil_santa.dm" +#include "code\modules\awaymissions\mission_code\spacebattle.dm" +#include "code\modules\awaymissions\mission_code\spacehotel.dm" +#include "code\modules\awaymissions\mission_code\stationCollision.dm" +#include "code\modules\awaymissions\mission_code\UO71-terrorspiders.dm" +#include "code\modules\awaymissions\mission_code\wildwest.dm" +#include "code\modules\awaymissions\mission_code\ghost_role_spawners\golems.dm" +#include "code\modules\awaymissions\mission_code\ghost_role_spawners\oldstation.dm" +#include "code\modules\awaymissions\mission_code\ruins\oldstation.dm" +#include "code\modules\awaymissions\mission_code\ruins\wizardcrash.dm" +#include "code\modules\buildmode\bm_mode.dm" +#include "code\modules\buildmode\buildmode.dm" +#include "code\modules\buildmode\buttons.dm" +#include "code\modules\buildmode\effects\line.dm" +#include "code\modules\buildmode\submodes\advanced.dm" +#include "code\modules\buildmode\submodes\area_edit.dm" +#include "code\modules\buildmode\submodes\atmos.dm" +#include "code\modules\buildmode\submodes\basic.dm" +#include "code\modules\buildmode\submodes\boom.dm" +#include "code\modules\buildmode\submodes\copy.dm" +#include "code\modules\buildmode\submodes\fill.dm" +#include "code\modules\buildmode\submodes\link.dm" +#include "code\modules\buildmode\submodes\mapgen.dm" +#include "code\modules\buildmode\submodes\save.dm" +#include "code\modules\buildmode\submodes\throwing.dm" +#include "code\modules\buildmode\submodes\variable_edit.dm" +#include "code\modules\busy_space\air_traffic.dm" +#include "code\modules\busy_space\loremaster.dm" +#include "code\modules\busy_space\organizations.dm" +#include "code\modules\client\asset_cache.dm" +#include "code\modules\client\client defines.dm" +#include "code\modules\client\client procs.dm" +#include "code\modules\client\message.dm" +#include "code\modules\client\view.dm" +#include "code\modules\client\preference\preferences.dm" +#include "code\modules\client\preference\preferences_mysql.dm" +#include "code\modules\client\preference\preferences_spawnpoints.dm" +#include "code\modules\client\preference\preferences_toggles.dm" +#include "code\modules\client\preference\loadout\gear_tweaks.dm" +#include "code\modules\client\preference\loadout\loadout.dm" +#include "code\modules\client\preference\loadout\loadout_accessories.dm" +#include "code\modules\client\preference\loadout\loadout_cosmetics.dm" +#include "code\modules\client\preference\loadout\loadout_donor.dm" +#include "code\modules\client\preference\loadout\loadout_general.dm" +#include "code\modules\client\preference\loadout\loadout_hat.dm" +#include "code\modules\client\preference\loadout\loadout_racial.dm" +#include "code\modules\client\preference\loadout\loadout_shoes.dm" +#include "code\modules\client\preference\loadout\loadout_suit.dm" +#include "code\modules\client\preference\loadout\loadout_uniform.dm" +#include "code\modules\clothing\chameleon.dm" +#include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\ears\ears.dm" +#include "code\modules\clothing\glasses\glasses.dm" +#include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\gloves\boxing.dm" +#include "code\modules\clothing\gloves\color.dm" +#include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\gloves\rings.dm" +#include "code\modules\clothing\head\collectable.dm" +#include "code\modules\clothing\head\hardhat.dm" +#include "code\modules\clothing\head\helmet.dm" +#include "code\modules\clothing\head\jobs.dm" +#include "code\modules\clothing\head\misc.dm" +#include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\masks\boxing.dm" +#include "code\modules\clothing\masks\breath.dm" +#include "code\modules\clothing\masks\gasmask.dm" +#include "code\modules\clothing\masks\miscellaneous.dm" +#include "code\modules\clothing\patreon\glasses.dm" +#include "code\modules\clothing\patreon\hats.dm" +#include "code\modules\clothing\shoes\colour.dm" +#include "code\modules\clothing\shoes\magboots.dm" +#include "code\modules\clothing\shoes\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\alien.dm" +#include "code\modules\clothing\spacesuits\breaches.dm" +#include "code\modules\clothing\spacesuits\chronosuit.dm" +#include "code\modules\clothing\spacesuits\ert.dm" +#include "code\modules\clothing\spacesuits\hardsuit.dm" +#include "code\modules\clothing\spacesuits\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\plasmamen.dm" +#include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\spacesuits\void.dm" +#include "code\modules\clothing\spacesuits\rig\rig.dm" +#include "code\modules\clothing\spacesuits\rig\rig_armormod.dm" +#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" +#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" +#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" +#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" +#include "code\modules\clothing\spacesuits\rig\modules\combat.dm" +#include "code\modules\clothing\spacesuits\rig\modules\computer.dm" +#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" +#include "code\modules\clothing\spacesuits\rig\modules\ninja.dm" +#include "code\modules\clothing\spacesuits\rig\modules\utility.dm" +#include "code\modules\clothing\spacesuits\rig\modules\vision.dm" +#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" +#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" +#include "code\modules\clothing\spacesuits\rig\suits\ert_suits.dm" +#include "code\modules\clothing\spacesuits\rig\suits\light.dm" +#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" +#include "code\modules\clothing\spacesuits\rig\suits\station.dm" +#include "code\modules\clothing\suits\alien.dm" +#include "code\modules\clothing\suits\armor.dm" +#include "code\modules\clothing\suits\bio.dm" +#include "code\modules\clothing\suits\hood.dm" +#include "code\modules\clothing\suits\jobs.dm" +#include "code\modules\clothing\suits\labcoat.dm" +#include "code\modules\clothing\suits\miscellaneous.dm" +#include "code\modules\clothing\suits\storage.dm" +#include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\under\color.dm" +#include "code\modules\clothing\under\miscellaneous.dm" +#include "code\modules\clothing\under\oldstation_uni.dm" +#include "code\modules\clothing\under\pants.dm" +#include "code\modules\clothing\under\shorts.dm" +#include "code\modules\clothing\under\syndicate.dm" +#include "code\modules\clothing\under\accessories\accessory.dm" +#include "code\modules\clothing\under\accessories\armband.dm" +#include "code\modules\clothing\under\accessories\holster.dm" +#include "code\modules\clothing\under\accessories\storage.dm" +#include "code\modules\clothing\under\jobs\civilian.dm" +#include "code\modules\clothing\under\jobs\engineering.dm" +#include "code\modules\clothing\under\jobs\medsci.dm" +#include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\countdown\countdown.dm" +#include "code\modules\crafting\craft.dm" +#include "code\modules\crafting\guncrafting.dm" +#include "code\modules\crafting\recipes.dm" +#include "code\modules\customitems\item_defines.dm" +#include "code\modules\customitems\item_spawning.dm" +#include "code\modules\detective_work\detective_work.dm" +#include "code\modules\detective_work\evidence.dm" +#include "code\modules\detective_work\footprints_and_rag.dm" +#include "code\modules\detective_work\scanner.dm" +#include "code\modules\economy\Accounts.dm" +#include "code\modules\economy\Accounts_DB.dm" +#include "code\modules\economy\ATM.dm" +#include "code\modules\economy\Economy.dm" +#include "code\modules\economy\Economy_Events.dm" +#include "code\modules\economy\Economy_Events_Mundane.dm" +#include "code\modules\economy\Economy_TradeDestinations.dm" +#include "code\modules\economy\EFTPOS.dm" +#include "code\modules\economy\Job_Departments.dm" +#include "code\modules\economy\POS.dm" +#include "code\modules\economy\utils.dm" +#include "code\modules\error_handler\error_handler.dm" +#include "code\modules\error_handler\error_viewer.dm" +#include "code\modules\events\abductor.dm" +#include "code\modules\events\alien_infestation.dm" +#include "code\modules\events\anomaly.dm" +#include "code\modules\events\anomaly_bluespace.dm" +#include "code\modules\events\anomaly_flux.dm" +#include "code\modules\events\anomaly_grav.dm" +#include "code\modules\events\anomaly_pyro.dm" +#include "code\modules\events\anomaly_vortex.dm" +#include "code\modules\events\aurora_caelus.dm" +#include "code\modules\events\blob.dm" +#include "code\modules\events\brand_intelligence.dm" +#include "code\modules\events\carp_migration.dm" +#include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\disease_outbreak.dm" +#include "code\modules\events\dust.dm" +#include "code\modules\events\electrical_storm.dm" +#include "code\modules\events\event.dm" +#include "code\modules\events\event_container.dm" +#include "code\modules\events\event_procs.dm" +#include "code\modules\events\false_alarm.dm" +#include "code\modules\events\floorcluwne.dm" +#include "code\modules\events\grid_check.dm" +#include "code\modules\events\immovable_rod.dm" +#include "code\modules\events\infestation.dm" +#include "code\modules\events\ion_storm.dm" +#include "code\modules\events\koi_mirgration.dm" +#include "code\modules\events\mass_hallucination.dm" +#include "code\modules\events\meaty_gore.dm" +#include "code\modules\events\meaty_ops.dm" +#include "code\modules\events\meaty_ores.dm" +#include "code\modules\events\meteors.dm" +#include "code\modules\events\money_hacker.dm" +#include "code\modules\events\money_lotto.dm" +#include "code\modules\events\money_spam.dm" +#include "code\modules\events\prison_break.dm" +#include "code\modules\events\radiation_storm.dm" +#include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\sentience.dm" +#include "code\modules\events\slaughterevent.dm" +#include "code\modules\events\spacevine.dm" +#include "code\modules\events\spider_infestation.dm" +#include "code\modules\events\spider_terror.dm" +#include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\tear.dm" +#include "code\modules\events\tear_honk.dm" +#include "code\modules\events\traders.dm" +#include "code\modules\events\undead.dm" +#include "code\modules\events\vent_clog.dm" +#include "code\modules\events\wallrot.dm" +#include "code\modules\events\wormholes.dm" +#include "code\modules\events\wizard\ghost.dm" +#include "code\modules\examine\examine.dm" +#include "code\modules\examine\descriptions\atmospherics.dm" +#include "code\modules\examine\descriptions\engineering.dm" +#include "code\modules\examine\descriptions\medical.dm" +#include "code\modules\examine\descriptions\mobs.dm" +#include "code\modules\examine\descriptions\stacks.dm" +#include "code\modules\examine\descriptions\structures.dm" +#include "code\modules\examine\descriptions\turfs.dm" +#include "code\modules\examine\descriptions\weapons.dm" +#include "code\modules\ext_scripts\irc.dm" +#include "code\modules\ext_scripts\python.dm" +#include "code\modules\fancytitle\fancytitle.dm" +#include "code\modules\fish\fish_eggs.dm" +#include "code\modules\fish\fish_items.dm" +#include "code\modules\fish\fish_types.dm" +#include "code\modules\fish\fishtank.dm" +#include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\flufftext\Hallucination.dm" +#include "code\modules\flufftext\TextFilters.dm" +#include "code\modules\food_and_drinks\food.dm" +#include "code\modules\food_and_drinks\drinks\drinks.dm" +#include "code\modules\food_and_drinks\drinks\bottler\bottler.dm" +#include "code\modules\food_and_drinks\drinks\bottler\bottler_recipes.dm" +#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" +#include "code\modules\food_and_drinks\drinks\drinks\cans.dm" +#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" +#include "code\modules\food_and_drinks\drinks\drinks\mugs.dm" +#include "code\modules\food_and_drinks\drinks\drinks\shotglass.dm" +#include "code\modules\food_and_drinks\food\condiment.dm" +#include "code\modules\food_and_drinks\food\customizables.dm" +#include "code\modules\food_and_drinks\food\snacks.dm" +#include "code\modules\food_and_drinks\food\foods\baked_goods.dm" +#include "code\modules\food_and_drinks\food\foods\bread.dm" +#include "code\modules\food_and_drinks\food\foods\candy.dm" +#include "code\modules\food_and_drinks\food\foods\desserts.dm" +#include "code\modules\food_and_drinks\food\foods\ethnic.dm" +#include "code\modules\food_and_drinks\food\foods\ingredients.dm" +#include "code\modules\food_and_drinks\food\foods\junkfood.dm" +#include "code\modules\food_and_drinks\food\foods\meat.dm" +#include "code\modules\food_and_drinks\food\foods\misc.dm" +#include "code\modules\food_and_drinks\food\foods\pasta.dm" +#include "code\modules\food_and_drinks\food\foods\pizza.dm" +#include "code\modules\food_and_drinks\food\foods\sandwiches.dm" +#include "code\modules\food_and_drinks\food\foods\seafood.dm" +#include "code\modules\food_and_drinks\food\foods\side_dishes.dm" +#include "code\modules\food_and_drinks\food\foods\soups.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\candy_maker.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\cereal_maker.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\cooker.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\food_grill.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\grill_new.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat_2.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\juicer.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\kitchen_machine.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\oven.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\oven_new.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" +#include "code\modules\food_and_drinks\recipes\recipes_candy.dm" +#include "code\modules\food_and_drinks\recipes\recipes_grill.dm" +#include "code\modules\food_and_drinks\recipes\recipes_microwave.dm" +#include "code\modules\food_and_drinks\recipes\recipes_oven.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_table.dm" +#include "code\modules\games\52card.dm" +#include "code\modules\games\cards.dm" +#include "code\modules\games\tarot.dm" +#include "code\modules\holiday\christmas.dm" +#include "code\modules\holiday\holiday.dm" +#include "code\modules\hydroponics\biogenerator.dm" +#include "code\modules\hydroponics\fermenting_barrel.dm" +#include "code\modules\hydroponics\gene_modder.dm" +#include "code\modules\hydroponics\grown.dm" +#include "code\modules\hydroponics\growninedible.dm" +#include "code\modules\hydroponics\hydroitemdefines.dm" +#include "code\modules\hydroponics\hydroponics.dm" +#include "code\modules\hydroponics\plant_genes.dm" +#include "code\modules\hydroponics\sample.dm" +#include "code\modules\hydroponics\seed_extractor.dm" +#include "code\modules\hydroponics\seeds.dm" +#include "code\modules\hydroponics\beekeeping\beebox.dm" +#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm" +#include "code\modules\hydroponics\beekeeping\honey_frame.dm" +#include "code\modules\hydroponics\beekeeping\honeycomb.dm" +#include "code\modules\hydroponics\grown\ambrosia.dm" +#include "code\modules\hydroponics\grown\apple.dm" +#include "code\modules\hydroponics\grown\banana.dm" +#include "code\modules\hydroponics\grown\beans.dm" +#include "code\modules\hydroponics\grown\berries.dm" +#include "code\modules\hydroponics\grown\cannabis.dm" +#include "code\modules\hydroponics\grown\cereals.dm" +#include "code\modules\hydroponics\grown\chili.dm" +#include "code\modules\hydroponics\grown\citrus.dm" +#include "code\modules\hydroponics\grown\cocoa_vanilla.dm" +#include "code\modules\hydroponics\grown\corn.dm" +#include "code\modules\hydroponics\grown\eggplant.dm" +#include "code\modules\hydroponics\grown\flowers.dm" +#include "code\modules\hydroponics\grown\grass_carpet.dm" +#include "code\modules\hydroponics\grown\herbals.dm" +#include "code\modules\hydroponics\grown\kudzu.dm" +#include "code\modules\hydroponics\grown\melon.dm" +#include "code\modules\hydroponics\grown\misc.dm" +#include "code\modules\hydroponics\grown\mushrooms.dm" +#include "code\modules\hydroponics\grown\nettle.dm" +#include "code\modules\hydroponics\grown\nymph.dm" +#include "code\modules\hydroponics\grown\onion.dm" +#include "code\modules\hydroponics\grown\peanut.dm" +#include "code\modules\hydroponics\grown\pineapple.dm" +#include "code\modules\hydroponics\grown\potato.dm" +#include "code\modules\hydroponics\grown\pumpkin.dm" +#include "code\modules\hydroponics\grown\random.dm" +#include "code\modules\hydroponics\grown\replicapod.dm" +#include "code\modules\hydroponics\grown\root.dm" +#include "code\modules\hydroponics\grown\tea_coffee.dm" +#include "code\modules\hydroponics\grown\tobacco.dm" +#include "code\modules\hydroponics\grown\tomato.dm" +#include "code\modules\hydroponics\grown\towercap.dm" +#include "code\modules\karma\karma.dm" +#include "code\modules\keybindings\bindings_admin.dm" +#include "code\modules\keybindings\bindings_atom.dm" +#include "code\modules\keybindings\bindings_carbon.dm" +#include "code\modules\keybindings\bindings_client.dm" +#include "code\modules\keybindings\bindings_human.dm" +#include "code\modules\keybindings\bindings_living.dm" +#include "code\modules\keybindings\bindings_mob.dm" +#include "code\modules\keybindings\bindings_robot.dm" +#include "code\modules\keybindings\focus.dm" +#include "code\modules\keybindings\setup.dm" +#include "code\modules\library\admin.dm" +#include "code\modules\library\codex_gigas.dm" +#include "code\modules\library\lib_items.dm" +#include "code\modules\library\lib_machines.dm" +#include "code\modules\library\lib_readme.dm" +#include "code\modules\library\random_books.dm" +#include "code\modules\library\computers\base.dm" +#include "code\modules\library\computers\checkout.dm" +#include "code\modules\library\computers\public.dm" +#include "code\modules\lighting\__lighting_docs.dm" +#include "code\modules\lighting\lighting_area.dm" +#include "code\modules\lighting\lighting_atom.dm" +#include "code\modules\lighting\lighting_corner.dm" +#include "code\modules\lighting\lighting_object.dm" +#include "code\modules\lighting\lighting_setup.dm" +#include "code\modules\lighting\lighting_source.dm" +#include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\logic\converter.dm" +#include "code\modules\logic\dual_input.dm" +#include "code\modules\logic\logic_base.dm" +#include "code\modules\logic\mono_input.dm" +#include "code\modules\map_fluff\cyberiad.dm" +#include "code\modules\map_fluff\delta.dm" +#include "code\modules\map_fluff\maps.dm" +#include "code\modules\map_fluff\metastation.dm" +#include "code\modules\martial_arts\adminfu.dm" +#include "code\modules\martial_arts\brawling.dm" +#include "code\modules\martial_arts\cqc.dm" +#include "code\modules\martial_arts\krav_maga.dm" +#include "code\modules\martial_arts\martial.dm" +#include "code\modules\martial_arts\mimejutsu.dm" +#include "code\modules\martial_arts\plasma_fist.dm" +#include "code\modules\martial_arts\sleeping_carp.dm" +#include "code\modules\martial_arts\wrestleing.dm" +#include "code\modules\mining\abandonedcrates.dm" +#include "code\modules\mining\coins.dm" +#include "code\modules\mining\equipment_locker.dm" +#include "code\modules\mining\explorer_gear.dm" +#include "code\modules\mining\machine_processing.dm" +#include "code\modules\mining\machine_stacking.dm" +#include "code\modules\mining\machine_unloading.dm" +#include "code\modules\mining\mine_items.dm" +#include "code\modules\mining\minebot.dm" +#include "code\modules\mining\mint.dm" +#include "code\modules\mining\money_bag.dm" +#include "code\modules\mining\ore.dm" +#include "code\modules\mining\satchel_ore_boxdm.dm" +#include "code\modules\mining\shelters.dm" +#include "code\modules\mining\equipment\marker_beacons.dm" +#include "code\modules\mining\equipment\survival_pod.dm" +#include "code\modules\mining\laborcamp\laborshuttle.dm" +#include "code\modules\mining\laborcamp\laborstacker.dm" +#include "code\modules\mining\lavaland\ash_flora.dm" +#include "code\modules\mining\lavaland\necropolis_chests.dm" +#include "code\modules\mining\lavaland\loot\ashdragon_loot.dm" +#include "code\modules\mining\lavaland\loot\bubblegum_loot.dm" +#include "code\modules\mining\lavaland\loot\colossus_loot.dm" +#include "code\modules\mining\lavaland\loot\hierophant_loot.dm" +#include "code\modules\mining\lavaland\loot\legion_loot.dm" +#include "code\modules\mining\lavaland\loot\tendril_loot.dm" +#include "code\modules\mob\abilities.dm" +#include "code\modules\mob\death.dm" +#include "code\modules\mob\emote.dm" +#include "code\modules\mob\hear_say.dm" +#include "code\modules\mob\holder.dm" +#include "code\modules\mob\inventory.dm" +#include "code\modules\mob\language.dm" +#include "code\modules\mob\login.dm" +#include "code\modules\mob\logout.dm" +#include "code\modules\mob\mob.dm" +#include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob_grab.dm" +#include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_transformation_simple.dm" +#include "code\modules\mob\say.dm" +#include "code\modules\mob\status_procs.dm" +#include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\typing_indicator.dm" +#include "code\modules\mob\update_icons.dm" +#include "code\modules\mob\update_status.dm" +#include "code\modules\mob\camera\camera.dm" +#include "code\modules\mob\dead\dead.dm" +#include "code\modules\mob\dead\death.dm" +#include "code\modules\mob\dead\observer\login.dm" +#include "code\modules\mob\dead\observer\logout.dm" +#include "code\modules\mob\dead\observer\observer.dm" +#include "code\modules\mob\dead\observer\say.dm" +#include "code\modules\mob\dead\observer\spells.dm" +#include "code\modules\mob\living\autohiss.dm" +#include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\death.dm" +#include "code\modules\mob\living\default_language.dm" +#include "code\modules\mob\living\life.dm" +#include "code\modules\mob\living\living.dm" +#include "code\modules\mob\living\living_defense.dm" +#include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\login.dm" +#include "code\modules\mob\living\logout.dm" +#include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\stat_states.dm" +#include "code\modules\mob\living\status_procs.dm" +#include "code\modules\mob\living\update_status.dm" +#include "code\modules\mob\living\carbon\_defines.dm" +#include "code\modules\mob\living\carbon\carbon.dm" +#include "code\modules\mob\living\carbon\carbon_defense.dm" +#include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\death.dm" +#include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\life.dm" +#include "code\modules\mob\living\carbon\superheroes.dm" +#include "code\modules\mob\living\carbon\update_icons.dm" +#include "code\modules\mob\living\carbon\update_status.dm" +#include "code\modules\mob\living\carbon\alien\alien.dm" +#include "code\modules\mob\living\carbon\alien\alien_defense.dm" +#include "code\modules\mob\living\carbon\alien\death.dm" +#include "code\modules\mob\living\carbon\alien\life.dm" +#include "code\modules\mob\living\carbon\alien\login.dm" +#include "code\modules\mob\living\carbon\alien\logout.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\emote.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\empress.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\life.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" +#include "code\modules\mob\living\carbon\alien\larva\emote.dm" +#include "code\modules\mob\living\carbon\alien\larva\inventory.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm" +#include "code\modules\mob\living\carbon\alien\larva\life.dm" +#include "code\modules\mob\living\carbon\alien\larva\powers.dm" +#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" +#include "code\modules\mob\living\carbon\alien\special\facehugger.dm" +#include "code\modules\mob\living\carbon\brain\brain.dm" +#include "code\modules\mob\living\carbon\brain\brain_item.dm" +#include "code\modules\mob\living\carbon\brain\death.dm" +#include "code\modules\mob\living\carbon\brain\emote.dm" +#include "code\modules\mob\living\carbon\brain\life.dm" +#include "code\modules\mob\living\carbon\brain\login.dm" +#include "code\modules\mob\living\carbon\brain\MMI.dm" +#include "code\modules\mob\living\carbon\brain\MMI_radio.dm" +#include "code\modules\mob\living\carbon\brain\robotic_brain.dm" +#include "code\modules\mob\living\carbon\brain\say.dm" +#include "code\modules\mob\living\carbon\brain\update_status.dm" +#include "code\modules\mob\living\carbon\human\appearance.dm" +#include "code\modules\mob\living\carbon\human\body_accessories.dm" +#include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\emote.dm" +#include "code\modules\mob\living\carbon\human\examine.dm" +#include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_damage.dm" +#include "code\modules\mob\living\carbon\human\human_defense.dm" +#include "code\modules\mob\living\carbon\human\human_defines.dm" +#include "code\modules\mob\living\carbon\human\human_movement.dm" +#include "code\modules\mob\living\carbon\human\human_organs.dm" +#include "code\modules\mob\living\carbon\human\inventory.dm" +#include "code\modules\mob\living\carbon\human\life.dm" +#include "code\modules\mob\living\carbon\human\login.dm" +#include "code\modules\mob\living\carbon\human\logout.dm" +#include "code\modules\mob\living\carbon\human\npcs.dm" +#include "code\modules\mob\living\carbon\human\say.dm" +#include "code\modules\mob\living\carbon\human\status_procs.dm" +#include "code\modules\mob\living\carbon\human\update_icons.dm" +#include "code\modules\mob\living\carbon\human\update_stat.dm" +#include "code\modules\mob\living\carbon\human\species\_species.dm" +#include "code\modules\mob\living\carbon\human\species\abductor.dm" +#include "code\modules\mob\living\carbon\human\species\diona.dm" +#include "code\modules\mob\living\carbon\human\species\drask.dm" +#include "code\modules\mob\living\carbon\human\species\golem.dm" +#include "code\modules\mob\living\carbon\human\species\grey.dm" +#include "code\modules\mob\living\carbon\human\species\human.dm" +#include "code\modules\mob\living\carbon\human\species\kidan.dm" +#include "code\modules\mob\living\carbon\human\species\machine.dm" +#include "code\modules\mob\living\carbon\human\species\monkey.dm" +#include "code\modules\mob\living\carbon\human\species\nucleation.dm" +#include "code\modules\mob\living\carbon\human\species\plasmaman.dm" +#include "code\modules\mob\living\carbon\human\species\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\shadowling.dm" +#include "code\modules\mob\living\carbon\human\species\skeleton.dm" +#include "code\modules\mob\living\carbon\human\species\skrell.dm" +#include "code\modules\mob\living\carbon\human\species\slime.dm" +#include "code\modules\mob\living\carbon\human\species\tajaran.dm" +#include "code\modules\mob\living\carbon\human\species\unathi.dm" +#include "code\modules\mob\living\carbon\human\species\vox.dm" +#include "code\modules\mob\living\carbon\human\species\vulpkanin.dm" +#include "code\modules\mob\living\carbon\human\species\wryn.dm" +#include "code\modules\mob\living\carbon\slime\death.dm" +#include "code\modules\mob\living\carbon\slime\emote.dm" +#include "code\modules\mob\living\carbon\slime\examine.dm" +#include "code\modules\mob\living\carbon\slime\life.dm" +#include "code\modules\mob\living\carbon\slime\powers.dm" +#include "code\modules\mob\living\carbon\slime\say.dm" +#include "code\modules\mob\living\carbon\slime\slime.dm" +#include "code\modules\mob\living\carbon\slime\subtypes.dm" +#include "code\modules\mob\living\carbon\slime\update_icons.dm" +#include "code\modules\mob\living\silicon\death.dm" +#include "code\modules\mob\living\silicon\emote.dm" +#include "code\modules\mob\living\silicon\laws.dm" +#include "code\modules\mob\living\silicon\login.dm" +#include "code\modules\mob\living\silicon\say.dm" +#include "code\modules\mob\living\silicon\silicon.dm" +#include "code\modules\mob\living\silicon\silicon_defense.dm" +#include "code\modules\mob\living\silicon\subsystems.dm" +#include "code\modules\mob\living\silicon\ai\ai.dm" +#include "code\modules\mob\living\silicon\ai\ai_defense.dm" +#include "code\modules\mob\living\silicon\ai\death.dm" +#include "code\modules\mob\living\silicon\ai\examine.dm" +#include "code\modules\mob\living\silicon\ai\latejoin.dm" +#include "code\modules\mob\living\silicon\ai\laws.dm" +#include "code\modules\mob\living\silicon\ai\life.dm" +#include "code\modules\mob\living\silicon\ai\login.dm" +#include "code\modules\mob\living\silicon\ai\logout.dm" +#include "code\modules\mob\living\silicon\ai\multicam.dm" +#include "code\modules\mob\living\silicon\ai\say.dm" +#include "code\modules\mob\living\silicon\ai\update_status.dm" +#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" +#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" +#include "code\modules\mob\living\silicon\ai\freelook\eye.dm" +#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" +#include "code\modules\mob\living\silicon\decoy\death.dm" +#include "code\modules\mob\living\silicon\decoy\decoy.dm" +#include "code\modules\mob\living\silicon\decoy\life.dm" +#include "code\modules\mob\living\silicon\pai\death.dm" +#include "code\modules\mob\living\silicon\pai\life.dm" +#include "code\modules\mob\living\silicon\pai\pai.dm" +#include "code\modules\mob\living\silicon\pai\personality.dm" +#include "code\modules\mob\living\silicon\pai\recruit.dm" +#include "code\modules\mob\living\silicon\pai\say.dm" +#include "code\modules\mob\living\silicon\pai\software.dm" +#include "code\modules\mob\living\silicon\pai\software_modules.dm" +#include "code\modules\mob\living\silicon\pai\update_status.dm" +#include "code\modules\mob\living\silicon\robot\component.dm" +#include "code\modules\mob\living\silicon\robot\death.dm" +#include "code\modules\mob\living\silicon\robot\emote.dm" +#include "code\modules\mob\living\silicon\robot\examine.dm" +#include "code\modules\mob\living\silicon\robot\inventory.dm" +#include "code\modules\mob\living\silicon\robot\laws.dm" +#include "code\modules\mob\living\silicon\robot\life.dm" +#include "code\modules\mob\living\silicon\robot\login.dm" +#include "code\modules\mob\living\silicon\robot\photos.dm" +#include "code\modules\mob\living\silicon\robot\robot.dm" +#include "code\modules\mob\living\silicon\robot\robot_damage.dm" +#include "code\modules\mob\living\silicon\robot\robot_defense.dm" +#include "code\modules\mob\living\silicon\robot\robot_items.dm" +#include "code\modules\mob\living\silicon\robot\robot_module_actions.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules.dm" +#include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\update_status.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" +#include "code\modules\mob\living\silicon\robot\drone\update_status.dm" +#include "code\modules\mob\living\simple_animal\animal_defense.dm" +#include "code\modules\mob\living\simple_animal\constructs.dm" +#include "code\modules\mob\living\simple_animal\corpse.dm" +#include "code\modules\mob\living\simple_animal\parrot.dm" +#include "code\modules\mob\living\simple_animal\posessed_object.dm" +#include "code\modules\mob\living\simple_animal\powers.dm" +#include "code\modules\mob\living\simple_animal\shade.dm" +#include "code\modules\mob\living\simple_animal\simple_animal.dm" +#include "code\modules\mob\living\simple_animal\spawner.dm" +#include "code\modules\mob\living\simple_animal\tribbles.dm" +#include "code\modules\mob\living\simple_animal\bot\bot.dm" +#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" +#include "code\modules\mob\living\simple_animal\bot\construction.dm" +#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm" +#include "code\modules\mob\living\simple_animal\bot\emote.dm" +#include "code\modules\mob\living\simple_animal\bot\floorbot.dm" +#include "code\modules\mob\living\simple_animal\bot\griefsky.dm" +#include "code\modules\mob\living\simple_animal\bot\honkbot.dm" +#include "code\modules\mob\living\simple_animal\bot\medbot.dm" +#include "code\modules\mob\living\simple_animal\bot\mulebot.dm" +#include "code\modules\mob\living\simple_animal\bot\secbot.dm" +#include "code\modules\mob\living\simple_animal\bot\syndicate.dm" +#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" +#include "code\modules\mob\living\simple_animal\friendly\cat.dm" +#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" +#include "code\modules\mob\living\simple_animal\friendly\corgi.dm" +#include "code\modules\mob\living\simple_animal\friendly\corgi_powers.dm" +#include "code\modules\mob\living\simple_animal\friendly\crab.dm" +#include "code\modules\mob\living\simple_animal\friendly\deer.dm" +#include "code\modules\mob\living\simple_animal\friendly\diona.dm" +#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" +#include "code\modules\mob\living\simple_animal\friendly\fox.dm" +#include "code\modules\mob\living\simple_animal\friendly\lizard.dm" +#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" +#include "code\modules\mob\living\simple_animal\friendly\penguin.dm" +#include "code\modules\mob\living\simple_animal\friendly\pet.dm" +#include "code\modules\mob\living\simple_animal\friendly\pug.dm" +#include "code\modules\mob\living\simple_animal\friendly\slime.dm" +#include "code\modules\mob\living\simple_animal\friendly\sloth.dm" +#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" +#include "code\modules\mob\living\simple_animal\hostile\alien.dm" +#include "code\modules\mob\living\simple_animal\hostile\bat.dm" +#include "code\modules\mob\living\simple_animal\hostile\bear.dm" +#include "code\modules\mob\living\simple_animal\hostile\bees.dm" +#include "code\modules\mob\living\simple_animal\hostile\carp.dm" +#include "code\modules\mob\living\simple_animal\hostile\creature.dm" +#include "code\modules\mob\living\simple_animal\hostile\deathsquid.dm" +#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" +#include "code\modules\mob\living\simple_animal\hostile\feral_cat.dm" +#include "code\modules\mob\living\simple_animal\hostile\floorcluwne.dm" +#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" +#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" +#include "code\modules\mob\living\simple_animal\hostile\hellhound.dm" +#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" +#include "code\modules\mob\living\simple_animal\hostile\hostile.dm" +#include "code\modules\mob\living\simple_animal\hostile\illusion.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle_animals.dm" +#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" +#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" +#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" +#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm" +#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" +#include "code\modules\mob\living\simple_animal\hostile\russian.dm" +#include "code\modules\mob\living\simple_animal\hostile\spaceworms.dm" +#include "code\modules\mob\living\simple_animal\hostile\statue.dm" +#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" +#include "code\modules\mob\living\simple_animal\hostile\tree.dm" +#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" +#include "code\modules\mob\living\simple_animal\hostile\winter_mobs.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\basilisk.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\goldgrub.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\goliath.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\gutlunch.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\hivelord.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\mining.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\necropolis_tendril.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\fish.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\kangaroo.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\pet.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\undead.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\__defines.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\actions.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\black.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\brown.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\chem.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\empress.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\ghost.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\gray.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\green.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\hive.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\mother.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\prince.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\princess.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\purple.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\queen.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\red.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\reproduction.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_ai.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_spiders.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\white.dm" +#include "code\modules\mob\new_player\login.dm" +#include "code\modules\mob\new_player\logout.dm" +#include "code\modules\mob\new_player\new_player.dm" +#include "code\modules\mob\new_player\poll.dm" +#include "code\modules\mob\new_player\preferences_setup.dm" +#include "code\modules\mob\new_player\sprite_accessories\sprite_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\diona\diona_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\drask\drask_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\grey\grey_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\human\human_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\human\human_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\human\human_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_face.dm" +#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_optics.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\nucleation\nucleation_face.dm" +#include "code\modules\mob\new_player\sprite_accessories\skrell\skrell_face.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_alt_heads.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_tail_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_tail_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\wryn\wryn_face.dm" +#include "code\modules\modular_computers\laptop_vendor.dm" +#include "code\modules\modular_computers\computers\item\computer.dm" +#include "code\modules\modular_computers\computers\item\computer_components.dm" +#include "code\modules\modular_computers\computers\item\computer_damage.dm" +#include "code\modules\modular_computers\computers\item\computer_power.dm" +#include "code\modules\modular_computers\computers\item\computer_ui.dm" +#include "code\modules\modular_computers\computers\item\laptop.dm" +#include "code\modules\modular_computers\computers\item\laptop_presets.dm" +#include "code\modules\modular_computers\computers\item\processor.dm" +#include "code\modules\modular_computers\computers\item\tablet.dm" +#include "code\modules\modular_computers\computers\item\tablet_presets.dm" +#include "code\modules\modular_computers\computers\machinery\console_presets.dm" +#include "code\modules\modular_computers\computers\machinery\modular_computer.dm" +#include "code\modules\modular_computers\computers\machinery\modular_console.dm" +#include "code\modules\modular_computers\file_system\computer_file.dm" +#include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\program_events.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" +#include "code\modules\modular_computers\file_system\programs\command\card.dm" +#include "code\modules\modular_computers\file_system\programs\command\comms.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\alarm.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\sm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" +#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" +#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" +#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" +#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\research\airestorer.dm" +#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" +#include "code\modules\modular_computers\hardware\_hardware.dm" +#include "code\modules\modular_computers\hardware\ai_slot.dm" +#include "code\modules\modular_computers\hardware\battery_module.dm" +#include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\CPU.dm" +#include "code\modules\modular_computers\hardware\hard_drive.dm" +#include "code\modules\modular_computers\hardware\network_card.dm" +#include "code\modules\modular_computers\hardware\portable_disk.dm" +#include "code\modules\modular_computers\hardware\printer.dm" +#include "code\modules\modular_computers\hardware\recharger.dm" +#include "code\modules\modular_computers\NTNet\NTNet.dm" +#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" +#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" +#include "code\modules\nano\nanoexternal.dm" +#include "code\modules\nano\nanomapgen.dm" +#include "code\modules\nano\nanoui.dm" +#include "code\modules\nano\subsystem.dm" +#include "code\modules\nano\interaction\admin.dm" +#include "code\modules\nano\interaction\base.dm" +#include "code\modules\nano\interaction\conscious.dm" +#include "code\modules\nano\interaction\contained.dm" +#include "code\modules\nano\interaction\default.dm" +#include "code\modules\nano\interaction\ghost.dm" +#include "code\modules\nano\interaction\inventory.dm" +#include "code\modules\nano\interaction\inventory_deep.dm" +#include "code\modules\nano\interaction\not_incapacitated.dm" +#include "code\modules\nano\interaction\physical.dm" +#include "code\modules\nano\interaction\self.dm" +#include "code\modules\nano\interaction\zlevel.dm" +#include "code\modules\nano\modules\alarm_monitor.dm" +#include "code\modules\nano\modules\atmos_control.dm" +#include "code\modules\nano\modules\crew_monitor.dm" +#include "code\modules\nano\modules\ert_manager.dm" +#include "code\modules\nano\modules\human_appearance.dm" +#include "code\modules\nano\modules\law_manager.dm" +#include "code\modules\nano\modules\nano_module.dm" +#include "code\modules\nano\modules\power_monitor.dm" +#include "code\modules\ninja\energy_katana.dm" +#include "code\modules\ninja\suit\gloves.dm" +#include "code\modules\ninja\suit\head.dm" +#include "code\modules\ninja\suit\mask.dm" +#include "code\modules\ninja\suit\shoes.dm" +#include "code\modules\ninja\suit\suit.dm" +#include "code\modules\ninja\suit\suit_initialisation.dm" +#include "code\modules\paperwork\carbonpaper.dm" +#include "code\modules\paperwork\clipboard.dm" +#include "code\modules\paperwork\contract.dm" +#include "code\modules\paperwork\fax.dm" +#include "code\modules\paperwork\faxmachine.dm" +#include "code\modules\paperwork\filingcabinet.dm" +#include "code\modules\paperwork\folders.dm" +#include "code\modules\paperwork\frames.dm" +#include "code\modules\paperwork\handlabeler.dm" +#include "code\modules\paperwork\paper.dm" +#include "code\modules\paperwork\paper_bundle.dm" +#include "code\modules\paperwork\paperbin.dm" +#include "code\modules\paperwork\paperplane.dm" +#include "code\modules\paperwork\pen.dm" +#include "code\modules\paperwork\photocopier.dm" +#include "code\modules\paperwork\photography.dm" +#include "code\modules\paperwork\silicon_photography.dm" +#include "code\modules\paperwork\stamps.dm" +#include "code\modules\pda\ai.dm" +#include "code\modules\pda\app.dm" +#include "code\modules\pda\cart.dm" +#include "code\modules\pda\cart_apps.dm" +#include "code\modules\pda\core_apps.dm" +#include "code\modules\pda\messenger.dm" +#include "code\modules\pda\messenger_plugins.dm" +#include "code\modules\pda\mob_hunt_game_app.dm" +#include "code\modules\pda\PDA.dm" +#include "code\modules\pda\pdas.dm" +#include "code\modules\pda\radio.dm" +#include "code\modules\pda\utilities.dm" +#include "code\modules\persistence\persistence.dm" +#include "code\modules\power\apc.dm" +#include "code\modules\power\cable.dm" +#include "code\modules\power\cable_heavyduty.dm" +#include "code\modules\power\cable_logic.dm" +#include "code\modules\power\cell.dm" +#include "code\modules\power\generator.dm" +#include "code\modules\power\gravitygenerator.dm" +#include "code\modules\power\lighting.dm" +#include "code\modules\power\port_gen.dm" +#include "code\modules\power\power.dm" +#include "code\modules\power\powernet.dm" +#include "code\modules\power\smes.dm" +#include "code\modules\power\solar.dm" +#include "code\modules\power\terminal.dm" +#include "code\modules\power\tracker.dm" +#include "code\modules\power\treadmill.dm" +#include "code\modules\power\turbine.dm" +#include "code\modules\power\singularity\collector.dm" +#include "code\modules\power\singularity\containment_field.dm" +#include "code\modules\power\singularity\emitter.dm" +#include "code\modules\power\singularity\field_generator.dm" +#include "code\modules\power\singularity\generator.dm" +#include "code\modules\power\singularity\investigate.dm" +#include "code\modules\power\singularity\narsie.dm" +#include "code\modules\power\singularity\singularity.dm" +#include "code\modules\power\singularity\particle_accelerator\particle.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" +#include "code\modules\power\supermatter\supermatter.dm" +#include "code\modules\power\tesla\coil.dm" +#include "code\modules\power\tesla\energy_ball.dm" +#include "code\modules\power\tesla\generator.dm" +#include "code\modules\procedural_mapping\mapGenerator.dm" +#include "code\modules\procedural_mapping\mapGeneratorModule.dm" +#include "code\modules\procedural_mapping\mapGeneratorReadme.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" +#include "code\modules\procedural_mapping\mapGenerators\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" +#include "code\modules\projectiles\ammunition.dm" +#include "code\modules\projectiles\firing.dm" +#include "code\modules\projectiles\gun.dm" +#include "code\modules\projectiles\gun_attachments.dm" +#include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\ammunition\ammo_casings.dm" +#include "code\modules\projectiles\ammunition\boxes.dm" +#include "code\modules\projectiles\ammunition\energy.dm" +#include "code\modules\projectiles\ammunition\magazines.dm" +#include "code\modules\projectiles\ammunition\special.dm" +#include "code\modules\projectiles\guns\alien.dm" +#include "code\modules\projectiles\guns\dartgun.dm" +#include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\grenade_launcher.dm" +#include "code\modules\projectiles\guns\magic.dm" +#include "code\modules\projectiles\guns\medbeam.dm" +#include "code\modules\projectiles\guns\mounted.dm" +#include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\guns\rocket.dm" +#include "code\modules\projectiles\guns\syringe_gun.dm" +#include "code\modules\projectiles\guns\throw.dm" +#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" +#include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\nuclear.dm" +#include "code\modules\projectiles\guns\energy\pulse.dm" +#include "code\modules\projectiles\guns\energy\special.dm" +#include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\guns\energy\telegun.dm" +#include "code\modules\projectiles\guns\magic\staff.dm" +#include "code\modules\projectiles\guns\magic\wand.dm" +#include "code\modules\projectiles\guns\misc\blastcannon.dm" +#include "code\modules\projectiles\guns\projectile\automatic.dm" +#include "code\modules\projectiles\guns\projectile\bow.dm" +#include "code\modules\projectiles\guns\projectile\launchers.dm" +#include "code\modules\projectiles\guns\projectile\pistol.dm" +#include "code\modules\projectiles\guns\projectile\revolver.dm" +#include "code\modules\projectiles\guns\projectile\saw.dm" +#include "code\modules\projectiles\guns\projectile\shotgun.dm" +#include "code\modules\projectiles\guns\projectile\sniper.dm" +#include "code\modules\projectiles\guns\projectile\toy.dm" +#include "code\modules\projectiles\guns\throw\crossbow.dm" +#include "code\modules\projectiles\guns\throw\pielauncher.dm" +#include "code\modules\projectiles\projectile\beams.dm" +#include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\energy.dm" +#include "code\modules\projectiles\projectile\force.dm" +#include "code\modules\projectiles\projectile\magic.dm" +#include "code\modules\projectiles\projectile\reusable.dm" +#include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\reagents\chem_splash.dm" +#include "code\modules\reagents\reagent_containers.dm" +#include "code\modules\reagents\reagent_dispenser.dm" +#include "code\modules\reagents\chemistry\colors.dm" +#include "code\modules\reagents\chemistry\holder.dm" +#include "code\modules\reagents\chemistry\readme.dm" +#include "code\modules\reagents\chemistry\reagents.dm" +#include "code\modules\reagents\chemistry\recipes.dm" +#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" +#include "code\modules\reagents\chemistry\machinery\chem_heater.dm" +#include "code\modules\reagents\chemistry\machinery\chem_master.dm" +#include "code\modules\reagents\chemistry\machinery\pandemic.dm" +#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" +#include "code\modules\reagents\chemistry\reagents\admin.dm" +#include "code\modules\reagents\chemistry\reagents\alcohol.dm" +#include "code\modules\reagents\chemistry\reagents\blob.dm" +#include "code\modules\reagents\chemistry\reagents\disease.dm" +#include "code\modules\reagents\chemistry\reagents\drink_base.dm" +#include "code\modules\reagents\chemistry\reagents\drink_cold.dm" +#include "code\modules\reagents\chemistry\reagents\drinks.dm" +#include "code\modules\reagents\chemistry\reagents\drugs.dm" +#include "code\modules\reagents\chemistry\reagents\food.dm" +#include "code\modules\reagents\chemistry\reagents\medicine.dm" +#include "code\modules\reagents\chemistry\reagents\misc.dm" +#include "code\modules\reagents\chemistry\reagents\paint.dm" +#include "code\modules\reagents\chemistry\reagents\paradise_pop.dm" +#include "code\modules\reagents\chemistry\reagents\pyrotechnic.dm" +#include "code\modules\reagents\chemistry\reagents\toxins.dm" +#include "code\modules\reagents\chemistry\reagents\water.dm" +#include "code\modules\reagents\chemistry\recipes\drinks.dm" +#include "code\modules\reagents\chemistry\recipes\drugs.dm" +#include "code\modules\reagents\chemistry\recipes\food.dm" +#include "code\modules\reagents\chemistry\recipes\medicine.dm" +#include "code\modules\reagents\chemistry\recipes\others.dm" +#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" +#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" +#include "code\modules\reagents\chemistry\recipes\toxins.dm" +#include "code\modules\reagents\reagent_containers\borghydro.dm" +#include "code\modules\reagents\reagent_containers\bottle.dm" +#include "code\modules\reagents\reagent_containers\dropper.dm" +#include "code\modules\reagents\reagent_containers\glass_containers.dm" +#include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\iv_bag.dm" +#include "code\modules\reagents\reagent_containers\patch.dm" +#include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\spray.dm" +#include "code\modules\reagents\reagent_containers\syringes.dm" +#include "code\modules\recycling\belt-placer.dm" +#include "code\modules\recycling\conveyor2.dm" +#include "code\modules\recycling\disposal-construction.dm" +#include "code\modules\recycling\disposal.dm" +#include "code\modules\recycling\sortingmachinery.dm" +#include "code\modules\research\circuitprinter.dm" +#include "code\modules\research\designs.dm" +#include "code\modules\research\destructive_analyzer.dm" +#include "code\modules\research\experimentor.dm" +#include "code\modules\research\message_server.dm" +#include "code\modules\research\protolathe.dm" +#include "code\modules\research\rd-readme.dm" +#include "code\modules\research\rdconsole.dm" +#include "code\modules\research\rdmachines.dm" +#include "code\modules\research\research.dm" +#include "code\modules\research\server.dm" +#include "code\modules\research\designs\AI_module_designs.dm" +#include "code\modules\research\designs\autolathe_designs.dm" +#include "code\modules\research\designs\biogenerator_designs.dm" +#include "code\modules\research\designs\bluespace_designs.dm" +#include "code\modules\research\designs\comp_board_designs.dm" +#include "code\modules\research\designs\computer_part_designs.dm" +#include "code\modules\research\designs\equipment_designs.dm" +#include "code\modules\research\designs\janitorial_designs.dm" +#include "code\modules\research\designs\machine_designs.dm" +#include "code\modules\research\designs\mecha_designs.dm" +#include "code\modules\research\designs\mechfabricator_designs.dm" +#include "code\modules\research\designs\medical_designs.dm" +#include "code\modules\research\designs\mining_designs.dm" +#include "code\modules\research\designs\misc_designs.dm" +#include "code\modules\research\designs\power_designs.dm" +#include "code\modules\research\designs\smelting_designs.dm" +#include "code\modules\research\designs\spacepod_designs.dm" +#include "code\modules\research\designs\stock_parts_designs.dm" +#include "code\modules\research\designs\telecomms_designs.dm" +#include "code\modules\research\designs\weapon_designs.dm" +#include "code\modules\research\xenobiology\xenobio_camera.dm" +#include "code\modules\research\xenobiology\xenobiology.dm" +#include "code\modules\response_team\ert.dm" +#include "code\modules\response_team\ert_outfits.dm" +#include "code\modules\ruins\ruin_areas.dm" +#include "code\modules\ruins\lavalandruin_code\animal_hospital.dm" +#include "code\modules\ruins\lavalandruin_code\ash_walker_den.dm" +#include "code\modules\ruins\lavalandruin_code\dead_ratvar.dm" +#include "code\modules\ruins\lavalandruin_code\fountain_hall.dm" +#include "code\modules\ruins\lavalandruin_code\hermit.dm" +#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm" +#include "code\modules\ruins\lavalandruin_code\puzzle.dm" +#include "code\modules\ruins\lavalandruin_code\seed_vault.dm" +#include "code\modules\ruins\lavalandruin_code\sin_ruins.dm" +#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm" +#include "code\modules\ruins\objects_and_mobs\gym.dm" +#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm" +#include "code\modules\security_levels\keycard authentication.dm" +#include "code\modules\security_levels\security levels.dm" +#include "code\modules\shuttle\assault_pod.dm" +#include "code\modules\shuttle\emergency.dm" +#include "code\modules\shuttle\ert.dm" +#include "code\modules\shuttle\navigation_computer.dm" +#include "code\modules\shuttle\on_move.dm" +#include "code\modules\shuttle\ripple.dm" +#include "code\modules\shuttle\shuttle.dm" +#include "code\modules\shuttle\shuttle_manipulator.dm" +#include "code\modules\shuttle\shuttle_rotate.dm" +#include "code\modules\shuttle\supply.dm" +#include "code\modules\shuttle\syndicate.dm" +#include "code\modules\shuttle\vox.dm" +#include "code\modules\space_management\heap_space_level.dm" +#include "code\modules\space_management\level_check.dm" +#include "code\modules\space_management\level_traits.dm" +#include "code\modules\space_management\space_chunk.dm" +#include "code\modules\space_management\space_level.dm" +#include "code\modules\space_management\space_transition.dm" +#include "code\modules\space_management\zlevel_manager.dm" +#include "code\modules\spacepods\construction.dm" +#include "code\modules\spacepods\equipment.dm" +#include "code\modules\spacepods\lock_buster.dm" +#include "code\modules\spacepods\parts.dm" +#include "code\modules\spacepods\spacepod.dm" +#include "code\modules\station_goals\bsa.dm" +#include "code\modules\station_goals\dna_vault.dm" +#include "code\modules\station_goals\shield.dm" +#include "code\modules\station_goals\station_goal.dm" +#include "code\modules\store\items.dm" +#include "code\modules\store\store.dm" +#include "code\modules\surgery\bones.dm" +#include "code\modules\surgery\cavity_implant.dm" +#include "code\modules\surgery\dental_implant.dm" +#include "code\modules\surgery\encased.dm" +#include "code\modules\surgery\generic.dm" +#include "code\modules\surgery\helpers.dm" +#include "code\modules\surgery\implant_removal.dm" +#include "code\modules\surgery\limb_augmentation.dm" +#include "code\modules\surgery\limb_reattach.dm" +#include "code\modules\surgery\organs_internal.dm" +#include "code\modules\surgery\other.dm" +#include "code\modules\surgery\plastic_surgery.dm" +#include "code\modules\surgery\remove_embedded_object.dm" +#include "code\modules\surgery\rig_removal.dm" +#include "code\modules\surgery\robotics.dm" +#include "code\modules\surgery\slime.dm" +#include "code\modules\surgery\surgery.dm" +#include "code\modules\surgery\tools.dm" +#include "code\modules\surgery\organs\augments_arms.dm" +#include "code\modules\surgery\organs\augments_eyes.dm" +#include "code\modules\surgery\organs\augments_internal.dm" +#include "code\modules\surgery\organs\autoimplanter.dm" +#include "code\modules\surgery\organs\blood.dm" +#include "code\modules\surgery\organs\body_egg.dm" +#include "code\modules\surgery\organs\ears.dm" +#include "code\modules\surgery\organs\eyes.dm" +#include "code\modules\surgery\organs\heart.dm" +#include "code\modules\surgery\organs\helpers.dm" +#include "code\modules\surgery\organs\kidneys.dm" +#include "code\modules\surgery\organs\liver.dm" +#include "code\modules\surgery\organs\lungs.dm" +#include "code\modules\surgery\organs\mmi_holder.dm" +#include "code\modules\surgery\organs\organ.dm" +#include "code\modules\surgery\organs\organ_external.dm" +#include "code\modules\surgery\organs\organ_icon.dm" +#include "code\modules\surgery\organs\organ_internal.dm" +#include "code\modules\surgery\organs\pain.dm" +#include "code\modules\surgery\organs\parasites.dm" +#include "code\modules\surgery\organs\robolimbs.dm" +#include "code\modules\surgery\organs\skeleton.dm" +#include "code\modules\surgery\organs\vocal_cords.dm" +#include "code\modules\surgery\organs\subtypes\abductor.dm" +#include "code\modules\surgery\organs\subtypes\diona.dm" +#include "code\modules\surgery\organs\subtypes\drask.dm" +#include "code\modules\surgery\organs\subtypes\grey.dm" +#include "code\modules\surgery\organs\subtypes\kidan.dm" +#include "code\modules\surgery\organs\subtypes\machine.dm" +#include "code\modules\surgery\organs\subtypes\nucleation.dm" +#include "code\modules\surgery\organs\subtypes\plasmaman.dm" +#include "code\modules\surgery\organs\subtypes\shadow.dm" +#include "code\modules\surgery\organs\subtypes\skrell.dm" +#include "code\modules\surgery\organs\subtypes\standard.dm" +#include "code\modules\surgery\organs\subtypes\tajaran.dm" +#include "code\modules\surgery\organs\subtypes\unathi.dm" +#include "code\modules\surgery\organs\subtypes\unbreakable.dm" +#include "code\modules\surgery\organs\subtypes\vox.dm" +#include "code\modules\surgery\organs\subtypes\vulpkanin.dm" +#include "code\modules\surgery\organs\subtypes\wryn.dm" +#include "code\modules\surgery\organs\subtypes\xenos.dm" +#include "code\modules\telesci\bscrystal.dm" +#include "code\modules\telesci\gps.dm" +#include "code\modules\telesci\telepad.dm" +#include "code\modules\telesci\telesci_computer.dm" +#include "code\modules\tooltip\tooltip.dm" +#include "code\modules\tram\tram.dm" +#include "code\modules\tram\tram_control_pad.dm" +#include "code\modules\tram\tram_floor.dm" +#include "code\modules\tram\tram_rail.dm" +#include "code\modules\tram\tram_wall.dm" +#include "code\modules\vehicle\ambulance.dm" +#include "code\modules\vehicle\atv.dm" +#include "code\modules\vehicle\janicart.dm" +#include "code\modules\vehicle\motorcycle.dm" +#include "code\modules\vehicle\secway.dm" +#include "code\modules\vehicle\snowmobile.dm" +#include "code\modules\vehicle\speedbike.dm" +#include "code\modules\vehicle\sportscar.dm" +#include "code\modules\vehicle\vehicle.dm" +#include "code\modules\vr\vr_avatar.dm" +#include "code\modules\vr\vr_controller.dm" +#include "code\modules\vr\vr_goggles.dm" +#include "code\modules\vr\vr_outfits.dm" +#include "goon\code\datums\browserOutput.dm" +#include "interface\interface.dm" +#include "interface\skin.dmf" +// END_INCLUDE diff --git a/sound/effects/warble.ogg b/sound/effects/warble.ogg new file mode 100644 index 00000000000..420ae974c83 Binary files /dev/null and b/sound/effects/warble.ogg differ diff --git a/sound/lavaland/cursed_slot_machine.ogg b/sound/lavaland/cursed_slot_machine.ogg new file mode 100644 index 00000000000..80911861bab Binary files /dev/null and b/sound/lavaland/cursed_slot_machine.ogg differ diff --git a/sound/lavaland/cursed_slot_machine_jackpot.ogg b/sound/lavaland/cursed_slot_machine_jackpot.ogg new file mode 100644 index 00000000000..19a4c417a96 Binary files /dev/null and b/sound/lavaland/cursed_slot_machine_jackpot.ogg differ diff --git a/sound/machines/fryer/deep_fryer_emerge.ogg b/sound/machines/fryer/deep_fryer_emerge.ogg new file mode 100644 index 00000000000..a803dd4c677 Binary files /dev/null and b/sound/machines/fryer/deep_fryer_emerge.ogg differ